如何正确释放链表的所有元素?

Posted

技术标签:

【中文标题】如何正确释放链表的所有元素?【英文标题】:How to correctly free all elements of a linked list? 【发布时间】:2021-02-12 04:01:48 【问题描述】:

我有一个类似于链表的结构表。我的目标是清空该表中的所有内容。我认为我的想法是正确的,但它不起作用,我不知道为什么。

typedef struct table
    LIST *top;
    int size;
TABLE;

我正在尝试的是获取表格中的每一件事并将free() 应用于它。然后将表的顶部设置为NULL,这样我以后就无法通过它并将大小设置为0。

void empty_table(TABLE *table) 
    LIST *cur;
    for (cur = table->top; cur != NULL; cur = cur->next) 
        if (cur == NULL) return;
        free(cur);
    
    table->top = NULL;
    table->size = 0;

显然这不起作用,我不知道原因。我尝试了一个简单的运行,它甚至没有改变大小。

    // ...
    printf("table has %d elements\n",tab->size);
    empty_table(tab);
    printf("table has %d elements\n",tab->size);
    // ...

我在这里测试tab 是指向表的指针。

输出是:

table has 5 elements
table has 5 elements

【问题讨论】:

【参考方案1】:

你的想法是对的,但实施是错误的。在您的循环中,您正在释放cur,然后然后查看它的->next。这是未定义的行为,因为 cur 刚刚被释放。

如果你想释放整个列表,你必须保留另一个临时指针来记住cur,并且只有在你前进到列表中的下一个元素后才释放它。您将无法使用for 循环执行此操作,因为cur = cur->next 操作不能是最后一个操作,但必须在free() 之前完成。

这是一个例子:

void empty_table(TABLE *table) 
    LIST *cur = table->top;
    LIST *tmp;

    while (cur != NULL) 
       tmp = cur;
       cur = cur->next;
       free(tmp);
    

    table->top = NULL;
    table->size = 0;

【讨论】:

没看到,谢谢你的回答。我会改的。

以上是关于如何正确释放链表的所有元素?的主要内容,如果未能解决你的问题,请参考以下文章

26输入一个链表,反转链表后,输出链表的所有元素。

输入一个链表,反转链表后,输出链表的所有元素

如何将变量结构类型传递给 C 中的函数

关于链表的特点正确的

链表的相关算法及应用

数组与链表的优缺点