c-如何正确释放链表中的所有元素



我有一个结构表,它有点像链表。我的目标是清空那张桌子上的所有东西。我认为我的想法是正确的,但它不起作用,我不知道为什么。

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 elementsn",tab->size);
empty_table(tab);
printf("table has %d elementsn",tab->size);
// ...

在这里,我测试它,其中tab是指向表的指针。

输出为:

table has 5 elements
table has 5 elements

您的想法是正确的,但实现是错误的。在循环中,您正在释放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;
}

最新更新