2012-12-07 46 views
0

我試圖使用以下代碼刪除C中單鏈表的所有節點。無法刪除單個鏈接列表的最後一個剩餘節點的數據

void free_all(struct cd *head){             
    struct cd *tmp;                                    
    tmp = head->next;               
    while(tmp != NULL){               
     head->next = tmp->next;             
     free(tmp);                
     tmp = head->next;              
    }                   
    free(head->next);               
    free(head);                 
    head=NULL;                 
}   

但是,如果之後我打印鏈表的所有元素以檢查列表是否爲空,則始終打印「head」元素。所以它看起來像head元素沒有被正確刪除。怎麼了?

回答

4

'head'是一個函數參數,具有局部範圍。因此,儘管在函數結束時將其設置爲NULL,但由於該函數剛剛返回,因此該變量將不起作用,將該變量移出作用域。

無論通過哪個變量,仍將指向列表頭部(雖然此內存已被釋放,但仍可能包含合理的數據)。

被釋放。它不一定是這樣,因爲你已經保存了一個指向它曾經居住的內存的指針。

要修復它,只需在之後將空指針移出,然後調用此函數釋放列表。

free_all(actual_head); 
actual_head = NULL; 

你可以在一個指針傳遞給一個指針,以NULL函數中的指針,但似乎對於這種情況過於複雜。

+0

爲什麼變量仍然指向列表的頭部?我該如何解決這個問題。 – nazco

+0

爲了回答這個問題,我已經擴展了我的答案,但基本上因爲您沒有真正更改變量,您只是更改了本地副本。一旦函數返回,那個本地副本就消失了,原來的東西仍然存在。 – JasonD

+0

好吧,現在我明白你的意思,它的工作原理。但是因爲我知道head是一個指針,所以它是「通過引用調用」,這意味着只給函數一個參考,並且沒有本地副本,或者我錯了嗎? – nazco