此代码删除除最后一个节点外的所有节点。但我想让它删除所有节点。谁能告诉我我哪里做错了?
deleteall(struct node **start)
{
struct node*temp,*curr;
while ((*start)->next!=NULL)
{
temp=*start;
*start=(*start)->next;
free(temp);
curr=(*start);
}
if ((*start)->next==NULL)
{
free(curr);
}
}
我创建了一个链表的基本实现并测试了您的代码。它不是特别漂亮,但它有效:
#include <stdlib.h>
#include <stdio.h>
struct node { struct node *next; };
struct node* create_node(struct node *next) {
struct node* node = malloc(sizeof(struct node));
node->next = next;
printf("created %pn", node);
return node;
}
void deleteall(struct node **start)
{
struct node*temp,*curr;
while ((*start)->next!=NULL)
{
temp=*start;
*start=(*start)->next;
free(temp);
printf("free'd %pn", temp);
curr=(*start);
}
if ((*start)->next==NULL)
{
free(curr);
printf("free'd %pn", curr);
}
}
int main(int argc, char** argv) {
// create root node
struct node * ll = create_node(0);
// insert three nodes
ll->next = create_node(ll->next);
ll->next = create_node(ll->next);
ll->next = create_node(ll->next);
// delete all nodes (including root)
deleteall(&ll);
return 0;
}
输出为:
$ gcc test.c && ./a.out
created 0xc3c010
created 0xc3c030
created 0xc3c050
created 0xc3c070
free'd 0xc3c010
free'd 0xc3c070
free'd 0xc3c050
free'd 0xc3c030
可以看到,所有被分配的节点实际上都是空闲的。
也许您对根节点未设置为0的事实感到困惑,但显然仍然包含先前位于该位置的对象的残余。如果在释放节点后将开始指针赋值为0:*start = 0;
(或通过消除额外的curr
指针,如另一个答案所建议的),则可以修复此问题。
考虑您可以选择递归地删除列表中的节点:
void delete_node_recursively(struct node *node) {
if (node) {
delete_node_recursively(node->next);
free(node)
}
}
如果您希望最终将根节点设置为0,可以添加一个包装器:
void delete_list(struct node **root) {
delete_node_recursively(*root);
*root = 0;
}
试试这个:
这是为了简化代码。
最后,*start
变成了NULL
。(你的代码不变成NULL
)
deleteall(struct node **start){
struct node *temp;
while(*start){
temp = *start;
*start=(*start)->next;
free(temp);
}
}