链接列表和通过* headRef删除节点

时间:2013-01-14 20:23:51

标签: 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指针。

2 个答案:

答案 0 :(得分:5)

您发布的代码很好。删除所有节点的关键步骤是确保不尝试删除指针然后遵循其next指针。由于您使用compliment指针在每次迭代时保存下一个节点,因此您看起来很好。

至于free(*headRef) - 这将释放headRef指向的指针。完成此操作后,您应该确保不再遵循指针*headRef。由于您立即将下一行中的*headRef更改为指向链接列表中的下一个节点,因此您无需担心。主要关心的不是free指针,然后尝试解除引用它。 free指针不会以某种方式“毒害”指针变量并使其变坏;相反,它会使指针陷入困境并使其变坏。

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

希望这有帮助!

答案 1 :(得分:1)

您可以使用更少的代码:

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