如何正确释放链表的所有元素?
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;
【讨论】:
没看到,谢谢你的回答。我会改的。以上是关于如何正确释放链表的所有元素?的主要内容,如果未能解决你的问题,请参考以下文章