我想清除鏈接列表在程序結束時使用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
如果你釋放的節點,則不能去下一個。互聯網上有很多例子 –