C语言 链表和删除节点通过*headRef



我正在解决一些指针/链表问题。其中一个问题是删除列表中的所有节点并将头指向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指针不会以某种方式"毒害"指针变量并使其变坏;相反,它会销毁,使其变得糟糕。

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

希望这对你有帮助!

你可以用更少的代码:

void DeleteList(struct node **headRef){
    struct node *tmp;
    while ((tmp = *headref)){
            *headRef = tmp->next
            free(tmp);                
    }
}

解释:

  • 只有在*headref
  • 有东西要删除时才能进入循环
  • 在循环中:tmp不能为NULL,所以对tmp解引用是安全的,所以*headref = tmp->next;是有效的
  • 循环后,有一个保证*headref == NULL

相关内容

  • 没有找到相关文章

最新更新