c - 通过 *headRef 链表和删除节点

标签 c pointers data-structures linked-list

我正在解决一些指针/链表问题。问题之一是删除列表中的所有节点并将头部指向 NULL。

我的解决方案与给定的答案不同。我对此很陌生,所以我无法弄清楚我的是否以及为什么不起作用。我遇到的主要问题是试图了解 free(*headRef); 的结果是什么,以及 *headRef 之后是否可以共享不同的指针。

我的想法是:因为我有 compliment 指向下一个节点,所以我可以释放 *headRef 指向第一个节点(或者,更一般地说,一个恭维指向之前的节点)。然后,我可以将 *headRef 指向 compliment 并且该过程可以继续。

这是我的代码:

void DeleteList(struct node** headRef){

    struct node* compliment = *headRef;

    while (compliment != NULL){
            compliment = compliment->next;
            free(*headRef);
            *headRef = compliment;
    }
    *headRef = NULL;
}

假设每个节点都带有两个属性:一个 int 和一个 ->next 指针。

最佳答案

您发布的代码没有问题。删除所有节点的关键步骤是确保您没有尝试删除指针然后跟随其 next 指针。由于您使用 compliment 指针在每次迭代中保存下一个节点,因此您所拥有的看起来不错。

至于 free(*headRef) - 这释放了 headRef 指向的指针。完成此操作后,您应该确保不再跟随指针 *headRef。由于您立即将下一行中的 *headRef 更改为指向链表中的下一个节点,因此您无需担心任何事情。主要关注的不是 free 指针,然后尝试取消引用它。 free指针不会以某种方式“毒化”指针变量并使其变坏;相反,它破坏了 pointee 并使它变得糟糕。

一个细节 - 函数的最后一行不是必需的,因为当您访问链表的最后一个节点并遍历其 next 指针时,您将得到 NULL。这意味着循环的最后一次迭代将为您设置 *headRef 指向 NULL

希望这对您有所帮助!

关于c - 通过 *headRef 链表和删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14326041/

相关文章:

c - 从c中的双向链表中删除元素

c - 如何在 C 中与外部文本编辑器交互

带有数组和指针的 C 字符串函数(strcpy、strcat...、strstr)

c - C 中这个表达式 (char *) 是什么意思?

data-structures - 优先级队列的优先级总是需要整数?

data-structures - 为什么 VecDeque 比 Vec 慢?

c - C语言建立二叉树时出现段错误

c - 编写此代码片段的有效方法?

c++ - 使用指针分配内存

java - 将二维数组传递给另一个类 : Java