2017-07-08 7 views
0

このような質の低い質問は申し訳ありませんが、なぜ次のコードが機能しないのかわかりません。二重リンクリストの頭を削除する

listは、ノードの先頭を指します。

void DeleteHeadNode(Node** list, Node * node) 
    { 
     if ((*list) == node) { 
      Node * next = node->nextnode; 
      next->prevnode = NULL; 
     free(*list); 
    } 
} 
+0

あなたは "動作しない" とはどういう意味ですか? – FKEinternet

+0

頭を連続して削除しようとするとフリーズする – Dimen

+0

変数 'list'に2回目の無効なポインタがあるからです。 – FKEinternet

答えて

0

を持つ必要があります。リスト変数のアドレスが渡された場合は、Node*の値を変更して、リスト変数を変更することができます。

このようにして、渡されたリスト変数をヌルまたは2番目のノードに設定します。

以下は使用パターンです。

void DeleteNode(Node** list, int data) 
{ 
    while (*list != NULL && (*list)->data != data) { 
     list = &(node->nextnode); 
    } 
    if (*list != NULL) { 
     Node* found = *list; 
     *list = found->nextnode; 

     if (found->nextnode != NULL) { 
      found->nextnode->prevnode = *list; 
     } 
     free(found); 
    } 
} 

使用法:

Node* list; 
... 
DeleteNode(&list, ...); 

前のノード(prevnode、二重リンクリスト)が本当に必要ではありません。

whileループが重要です。リストヘッドから次のノードフィールドのアドレスに別名listが設定されています。したがって、*listのその後の変更は、渡されたリスト変数またはいくつかのnextnodeフィールドを変更します。頭を削除

void SortedInsertNode(Node** list, int data) 
{ 
    Node* node = (Node*) malloc(sizeof(Node)); 
    node->data = data; 
    node->prevnode = NULL; 
    node->nextnode = NULL; 
    while (*list != NULL && data >= (*list)->data) { 
     node->prevnode = *list; 
     list = &(node->nextnode); 
    } 
    node->nextnode = *list; 
    *list = node; 

    if (node->nextnode != NULL) { 
     node->nextnode->prevnode = *list; 
    } 
} 

void DeleteHead(Node** list) 
{ 
    if (*list != null) { 
     Node* dead = *list; 
     *list = (*list)->nextnode; 
     (*list)->prevnede = NULL; 
     free(dead); 
    } 
} 
+0

書き換えられた 'DeleteNode()'関数はOPとは全く違う***演算を実行します。あなたはその質問に全く答えていません。 – FKEinternet

+0

@FKEinternetはい私はそれを書いたはずです(私は関数の名前を変更しました)。追加するヘッドを削除する –

0

私はlistがあなたの関数の後にもはや有効であることを意味しない「動作しない」推測している - 真となります。

あなたはNode**の利用がエイリアスとして使用されている

void DeleteHeadNode(Node** list, Node* node) 
{ 
    if ((node != NULL) && (*list == node)) // check node being deleted 
    { 
     Node* next = node->nextnode; 
     if (next != NULL)      // ensure next exists 
     { 
      next->prevnode = NULL; 
      free(*list); 
      list = &next;      // update pointer to head of list 
     } 
     else         // no next, list is now becoming empty 
     { 
      free(*list); 
      list = NULL;      // update pointer to head of list 
     } 
    } 
} 
関連する問題