2016-12-03 51 views
1

我想清除链接列表在程序结束时使用clearList函数,但我不知道这个函数的定义到底是什么问题。链接列表清除功能

void clearList(struct node *list) { 
    struct node *p; 
    for(p = list; p != NULL; p = p->next) 
     free(p); 
} 
+2

如果你释放的节点,则不能去下一个。互联网上有很多例子 –

回答

4

你需要释放你的节点之前得到下一个指针:

p = list; //list is the header 

while(p != NULL){ 
    list = list->next; 

    free(p); 

    p = list; 
} 
1

你就是Node调用对象的free你有地址的副本next之前。这会陷入内存并导致内存泄漏。更糟糕的是,你试图引用已经被释放的内存,这会将你的程序段错误。

创建copyof next第一:

struct node *p, *nxt; 
for (p=list; p; p=nxt) { 
    nxt = p->next; 
    free(p); 
} 
0

随着名单,我建议尾递归函数:

void free_list(struct node *head) { 
    if (head != NULL) { 
    struct node *next = head->next; 
    free(head); 
    free_list(next); 
    } 
} 
+0

在现实世界的场景中,您可以更有效地以迭代的方式来做到这一点。如果您正在处理大量列表,由于上下文切换,您的实现浪费了大量的CPU周期,并且您有可能导致调用堆栈溢出。 – DevNull

+0

@DevNull你错了,我说这是一个尾递归函数。一个好的编译器会优化它。为什么你看我的答案只是因为我批评你的一个呢? – Stargateur

+0

您正在依靠编译器优化来适应糟糕的编码实践。很多嵌入式系统都使用GCC以外的自定义编译器,这会使单元测试和LINT都失败。 – DevNull