C语言 从链表中删除所有节点有困难



此代码删除除最后一个节点外的所有节点。但我想让它删除所有节点。谁能告诉我我哪里做错了?

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);
    }
}

相关内容

  • 没有找到相关文章

最新更新