0

deleteNodeリストの先頭と削除するノードを受け取る関数があります。これを実行すると、ノードが正常に削除されますが、その後のすべても削除されます。リストを再構築することに関係していると思いますが、ロジックのどこが間違っているのかがわからないので、少し助けてください. 関数コードは次のとおりです。

void deleteNode(struct lnode** head, struct lnode* node) {
    struct lnode* nextNode = nodeGetNext(node);
    printf("word: \n%s\n",nodeGetWord(nextNode));
    struct lnode* nodeToDelete = node;


    *head = nodeGetNext(nodeToDelete);
    printf("Head word: %s\n",nodeGetWord(*head));
    free(nodeToDelete); 
}
4

1 に答える 1

1

それを描いてみてください...あなたの関数が正確に何をしているのかわからないので、これは名前に基づいていくつかの仮定をしますが、あなたはアイデアを得ることができます。

  1. あなたが渡すhead(赤'h')
  2. 削除するために渡しますnode(青'n')
  3. ローカルnextNodeをのリターンに設定しますnodeGetNext(node)(削除するノードの後のノード、緑色の'nn'だと思います)
  4. nodeToDelete(紫のntd)をに設定しますnode

ここに画像の説明を入力してください

したがって、コードはに頭を向けnodeGetNext(nodeToDelete)ます。これは実際には未使用の変数ですnextNode。その後、あなたは解放しnodeToDeleteます。

削除するノードが頭のすぐ隣にあることがわかっていない限り、これはあなたがやりたかったことではないと確信しています。より通常のアルゴリズムは次のようになると思います。

  1. 削除するノードのヘッド検索から
  2. 「削除するノード」+1の横に「削除するノード」-1を設定します
  3. 「削除するノード」を削除します

ヘッドの特殊なケース、または空のリストなど。

于 2012-09-25T16:48:59.163 に答える