2017-07-08 76 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'第二次有一個無效指針 - 嘗試在我的答案中的代碼。 – FKEinternet

回答

0

Node**用法作爲別名。如果傳遞了列表變量的地址,則可以通過更改Node*值來更改它。

通過這種方式,將傳遞的列表變量設置爲null或第二個節點。

以下是使用模式。

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從表頭設置爲nextnode場的地址。因此,*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不再是你的函數後有效 - 這將是真實的。

你應該有

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 
     } 
    } 
}