删除链表的唯一节点

时间:2013-12-02 17:05:39

标签: c pointers struct linked-list nodes

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

3 个答案:

答案 0 :(得分:0)

假设你有

struct foo * head;

实际 指向您的节点的地方,您应该能够

free(head);

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

答案 1 :(得分:0)

由于链接列表的使用方式有多种,因此没有一种模式最适合每个应用程序。尽管如此,一种非常有用的模式是拥有一个或两个“特殊”和/或“预先分配”的节点,这些节点用于链表的开始和/或结束(有时它对双向链表很有用)以相同的节点开始和结束;有时具有不同的“开始”和“结束”节点是有用的。在具有一个额外“开始”节点的单链表中,对列表的主要引用通常将标识只要列表存在就存在的起始节点;该引用永远不需要改变。事实上,列表中的每个“真实”项目 - 甚至是第一个 - 将始终在其前面有一个节点,这样就无需担心删除第一个项目或插入特殊代码的特殊代码之前的项目,因为列表的第一个真实项目可以像任何其他项目一样对待。

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

答案 2 :(得分:0)

如果您拥有持久节点,那么head是该节点。因此,在您free(head)之后,请确保声明head = NULL。据我了解,这是一个好习惯。 而且,假设您具有删除节点的功能。一开始,别忘了编码

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

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