Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除双链接列表中的链接_C_Linked List_Free - Fatal编程技术网

C 删除双链接列表中的链接

C 删除双链接列表中的链接,c,linked-list,free,C,Linked List,Free,我正在用C编写一个基于双链表的代码。我错误地认为通过执行free(head\u node)删除head节点。我还可以看到,随着运行的进行,计算机的速度会减慢(这显然是由于内存泄漏)。我搜索了stackoverflow和其他网站,通常我在删除链接列表时遇到的代码是: Node* current = head; while( current != NULL ) { Node* next = current->Next; free( current ); current = next; } 当

我正在用C编写一个基于双链表的代码。我错误地认为通过执行
free(head\u node)
删除head节点。我还可以看到,随着运行的进行,计算机的速度会减慢(这显然是由于内存泄漏)。我搜索了stackoverflow和其他网站,通常我在删除链接列表时遇到的代码是:

Node* current = head;
while( current != NULL ) {
Node* next = current->Next;
free( current );
current = next;
}
当我在代码中尝试这一点时,程序只是挂起在free语句之后,而没有返回调用该语句的函数。上述代码是否与双链接列表相关?我的列表成员数据也包含很多指针。当我在其中一个链接上释放数据时,它会释放成员指向的所有数据吗?请用代码片段或参考书籍来建议和澄清。 多谢各位

当我在其中一个链接上释放数据时,它会释放成员指向的所有数据吗

不,如果删除了垃圾收集语言中对对象的最后一个引用,就会发生这种情况,但C不是这样工作的。您需要手动释放已分配的每一位内存

该代码看起来像是通常用于单链或双链列表的代码,假设其值都不是指针

我的列表成员数据也包含很多指针


由于它们是,您还需要释放每个
current->value
(如果它们是指向指针的指针…。

您发布的代码应该适用于单链接列表或双链接列表,但需要做一些假设:

  • 释放节点之前不需要清理节点;这通常是一个错误的假设
  • 列表的末尾用空指针标记(即最后一个节点的
    Next
    成员是
    NULL
关于第一个假设: 由于您已经在节点中动态分配了数据,并且假定您在其他地方没有指向它的另一个指针,稍后您将使用它来清理数据,因此您需要在释放每个节点之前释放该数据。在C中,这不是为你做的;一般的规则是,如果你必须自己分配,你也必须自己释放它。处理这个问题的一个合理方法是编写一个函数来清理和释放一个节点,并调用它,而不是只调用
free()
;清理函数仍将释放节点,但它将首先释放节点的数据

关于第二个假设: 将最后一个节点的
Next
指针设置为
NULL
以标记结束是一种非常常见的做法,因为这样可以很容易地判断您何时已经遍历了列表。对于双链接列表,第一个节点的
Prev
指针也是如此。然而,如果它是一个循环列表,最后一个节点只是指向第一个节点——这将破坏您发布的代码。在这种情况下,您将从节点
head->Next
开始,而不是
head
,并检查
current
是否不是
head
,而不是
NULL
。然后在最后处理
head
,因为您最初跳过了它

还有一件事:
确保在释放列表后,不要将头指向无效(已释放)节点,然后再次尝试访问列表…

我刚刚发现我的列表节点有两个指向数据的指针,而不是下一个和上一个元素。我现在试着把他们两个都解救出来<代码>自由(当前->数据1);自由(当前->数据2);自由(当前)。我的代码仍然挂起。有什么消息吗?@PrapanchNair:啊。未能
释放()
可能不会导致计算机挂起。您使用的代码看起来是正确的,所以我倾向于认为您的链表构造不正确。data2,作为我的链表节点成员的指针数据是另一个单独的链表。计算机没有挂起,只是挂起的程序,好像有无限循环在运行。@PrapanchNair:对不起,我明白你的意思,但写错了。