對不起,質量這麼低的問題,但我不知道爲什麼下面的代碼不起作用。刪除雙向鏈表的頭
list指向節點的頭部。
void DeleteHeadNode(Node** list, Node * node)
{
if ((*list) == node) {
Node * next = node->nextnode;
next->prevnode = NULL;
free(*list);
}
}
對不起,質量這麼低的問題,但我不知道爲什麼下面的代碼不起作用。刪除雙向鏈表的頭
list指向節點的頭部。
void DeleteHeadNode(Node** list, Node * node)
{
if ((*list) == node) {
Node * next = node->nextnode;
next->prevnode = NULL;
free(*list);
}
}
的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);
}
}
您重寫的DeleteNode()函數執行的操作完全不同於OP。你根本沒有回答這個問題。 – FKEinternet
@FKEinternet是的,我應該寫(即使我重命名了該功能)。刪除一個頭我會補充 –
我猜「不工作」的意思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
}
}
}
什麼叫 「不工作」 是什麼意思? – FKEinternet
當我試圖連續刪除頭部時,它會凍結 – Dimen
這是因爲您的變量'list'第二次有一個無效指針 - 嘗試在我的答案中的代碼。 – FKEinternet