繁体   English   中英

删除链表的唯一节点

[英]Deleting the only node of a linked list

我得到了一个只有一个节点的链表。 你如何删除那个唯一的节点? 您不能通过将前*next结构的*next结构指向*next结构来“跳过”它,因为没有下一个结构,也没有前一个结构。 我试过使用free()但它也没有用。 所以问题是:如何从链表中删除唯一的节点? 我已经用谷歌搜索了它,但不幸的是没有找到有用的链接。 谢谢你的帮助。

假设你有

struct foo * head;

实际上确实指向您的节点的某个地方,您应该能够

free(head);

如果你不能,那么你应该发布你的代码,以便我们可以看看你实际上做错了什么。

因为有多种使用链接列表的方式,所以没有一种模式最适合每个应用程序。 尽管如此,一个非常有用的模式是有一个或两个“特殊”和/或“预分配”节点,用于链表的开始和/或结束(有时它对双向链表很有帮助)以相同的节点开始和结束;有时具有不同的“开始”和“结束”节点很有用)。 在具有一个额外“起始”节点的单链表中,对列表的主要引用通常会标识与列表存在一样长的起始节点; 该引用永远不需要更改。 列表中的每个“真实”项目——即使是第一个——总是在它前面有一个节点这一事实避免了需要担心删除第一个项目或在它之前插入一个项目的特殊代码,因为第一个列表中的实际项目可以像任何其他项目一样对待。

顺便说一下,当使用单链表时,让每个节点都包含一个“已删除”标志通常是个好主意。 一般在寻找节点的过程中,也会找到上一个节点; 因为删除一个节点需要知道哪个节点在它之前,所以跟踪在最近找到的节点之前的节点通常允许删除它而不必搜索它的前任。 但是,如果发现多个节点然后对它们执行操作,则可能到在节点上执行操作(例如删除它)时,以前在它之前的节点可能不再这样做了。 在每个节点中设置一个“已删除”标志可以更容易地检测到这种情况并顺利处理它们(如果想删除一个节点而不能立即识别前一个节点,最好简单地设置“已删除”标志; 如果后来知道哪个节点在它之前的代码遇到无效节点,则该代码可以处理实际从列表中删除无效节点。

如果你有持久节点,那么head就是那个节点。 所以,在你free(head) ,一定要声明head = NULL 只要我理解,这是一个很好的做法。 而且,假设您有一个删除节点的功能。 一开始不要忘记编码

if (*head == NULL)
        return ("your error code");

这样,程序就不会尝试释放尚未分配的内容并导致分段错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM