我想清除链接列表在程序结束时使用clearList函数,但我不知道这个函数的定义到底是什么问题。链接列表清除功能
void clearList(struct node *list) {
struct node *p;
for(p = list; p != NULL; p = p->next)
free(p);
}
我想清除链接列表在程序结束时使用clearList函数,但我不知道这个函数的定义到底是什么问题。链接列表清除功能
void clearList(struct node *list) {
struct node *p;
for(p = list; p != NULL; p = p->next)
free(p);
}
你需要释放你的节点之前得到下一个指针:
p = list; //list is the header
while(p != NULL){
list = list->next;
free(p);
p = list;
}
你就是Node
调用对象的free
你有地址的副本next
之前。这会陷入内存并导致内存泄漏。更糟糕的是,你试图引用已经被释放的内存,这会将你的程序段错误。
创建copyof next
第一:
struct node *p, *nxt;
for (p=list; p; p=nxt) {
nxt = p->next;
free(p);
}
随着名单,我建议尾递归函数:
void free_list(struct node *head) {
if (head != NULL) {
struct node *next = head->next;
free(head);
free_list(next);
}
}
在现实世界的场景中,您可以更有效地以迭代的方式来做到这一点。如果您正在处理大量列表,由于上下文切换,您的实现浪费了大量的CPU周期,并且您有可能导致调用堆栈溢出。 – DevNull
@DevNull你错了,我说这是一个尾递归函数。一个好的编译器会优化它。为什么你看我的答案只是因为我批评你的一个呢? – Stargateur
您正在依靠编译器优化来适应糟糕的编码实践。很多嵌入式系统都使用GCC以外的自定义编译器,这会使单元测试和LINT都失败。 – DevNull
如果你释放的节点,则不能去下一个。互联网上有很多例子 –