无法从链接列表中删除所有节点

时间:2016-10-03 17:49:59

标签: c linked-list

此代码删除除最后一个节点之外的所有节点。但我希望它删除所有节点。谁能告诉我我做错了什么?

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

2 个答案:

答案 0 :(得分:2)

我创建了链表的基本实现并测试了您的代码。它不是特别漂亮,但它有效:

#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 %p\n", 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 %p\n", temp);
        curr=(*start);                                          
    }           
    if ((*start)->next==NULL)
    {                           
        free(curr);         
        printf("free'd %p\n", 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,而是apparantly still contains the remains of the object previously located at that place。如果在释放节点后将0分配给起始指针,则可以解决此问题:*start = 0;(或通过消除the other answer}中建议的其他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;
}

答案 1 :(得分:0)

试试这个:
这是为了简化您的代码 最后*start成为NULL。 (您的代码不会成为NULL

deleteall(struct node **start){
    struct node *temp;
    while(*start){
        temp = *start;
        *start=(*start)->next;
        free(temp);
    }
}