2016-12-03 78 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