4

我正在解决一些指针/链表问题。问题之一是删除列表中的所有节点并将头部指向 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指针。

4

2 回答 2

5

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

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

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

希望这可以帮助!

于 2013-01-14T20:26:31.840 回答
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
于 2013-01-14T22:22:20.460 回答