2010-02-15 35 views
12

這是一個有效的LinkedList析構函數嗎?我仍然有點困惑他們。寫一個LinkedList析構函數?

我想確保我正確理解這一點。

LinkedList::~LinkedList() 
{ 
    ListNode *ptr; 

    for (ptr = head; head; ptr = head) 
    { 
    head = head->next 
    delete ptr; 
    } 
} 

因此,在循環的開始處,指針ptr被設置爲保存head的地址,即列表中的第一個節點。然後將頭部設置爲下一個項目,一旦第一次刪除發生,該項目將成爲列表的開始。 ptr被刪除,第一個節點也是如此。隨着循環的第一次迭代,指針再次設置爲頭。

關心我的事情正在到達最後一個節點。條件「頭」;應該檢查它不是null,但我不確定它是否會起作用。

任何幫助表示讚賞。

+0

爲什麼不嘗試通過調試器運行代碼來查看它是否工作? – Manuel 2010-02-15 12:47:49

+0

@Manuel,因爲某些平臺上的調試器沒有集成,而且很難使用? – 2010-02-15 13:05:07

+2

我知道我會爲此拍攝(有人總是這樣做,但我是一個beleiver)。頭是一個成員變量,你真的應該有成員變量的命名約定,如m_head或head_ – pm100 2010-02-17 00:47:43

回答

15

爲什麼不這麼簡單 - 用優雅的while -loop代替仔細分析for -loop是否正確?

ListNode* current = head; 
while(current != 0) { 
    ListNode* next = current->next; 
    delete current; 
    current = next; 
} 
head = 0; 
+1

當然,這將工作..但是否由OP提到的原代碼將工作? – Naveen 2010-02-15 12:51:44

+0

我應該說,'current'永遠不會改變,'next'永遠不會被使用。這是否意味着對OP的不利雙關? – 2010-02-15 12:53:27

+6

@Matthieu男士:沒有壞的雙關語意圖。請您詳細說明「永不改變」和「永不使用」? – sharptooth 2010-02-15 13:12:56

3

條件 「頭」;應該檢查它不是null,但我不確定它是否會起作用。

是,「頭」,其本身是一樣的「頭!= NULL」 - 但如果連你覺得困惑,爲什麼用一個毫無意義的打字快捷方式?它只有6個按鍵(並生成相同的機器碼),所以請選擇長形式。

此外,由於您使用的是for()構造,因此您的代碼比必要的複雜一點。爲什麼不使用while()?你的代碼將會更乾淨。

最後,我意識到你在做這個學習練習,但請記住,列表<>是在標準庫中---鏈接列表是正式的「解決問題」。

+0

我的意思是,考慮到頭部可能爲空,我會遇到訪問「下一個」的問題嗎?據我所知,head將指向最後一個節點,訪問next將包含null,而不是下一個節點的地址。 – kevin 2010-02-15 12:54:37

5

你可以通過一個調試器來運行它,或者你可以通過頭骨內的那個溼軟件來運行它 - 兩者都會告訴你它工作正常。例如,讓我們先從列表:

head(47) -> [47]single_node -> [NULL]end-of-list. 

通過你的語句運行該名單:

  • ptr = headptr至47
  • head非零所以進入循環。
  • head = head->nexthead設置爲NULL。
  • delete ptr將刪除single_node
  • ptr = headptr設置爲NULL。
  • head現在是NULL(0),所以退出循環。

你去了,你已經刪除了列表中唯一的條目,並且head現在被設置爲NULL。這就是你需要做的。

你可以用一個較長的列表或一個空列表做類似的事情,你會發現它仍然可以(一個元素列表和一個五十個元素列表之間沒有真正的區別)。

順便說一句,我不是治療指針以布爾的超級粉絲 - 我寧願把它寫成類似:

for (ptr = head; head != NULL; ptr = head) 

它使代碼讀出在我看來,和你不更好真的不會犧牲任何性能(除非你有一個腦死亡的編譯器)。但這是一個有趣的問題。

回覆您的評論:

我所關心在到達最後一個節點的事情。條件「頭」;應該檢查它不是null,但我不確定它是否會起作用。

它會工作。值爲零將被視爲false,因此您會發現,當head爲NULL時,您永遠不會解除引用head-> next,因爲您將在該點之前退出循環體(或者如果列表爲空,甚至不會進入body )。

任何其他指針值將被視爲true,您將輸入或繼續循環體。

0

你的代碼可能是正確的,你應該試着用例如。 valgrind,看看它說什麼。不過,我會寫這樣的:

for (ListNode *current = head, *next; current; current = next) { 
    next = current->next; 
    free(current); 
} 
1

測試OK

析構類List

List::~List() 
{ 
    Node *n = this->front, *current = NULL; //initialization part 

    while(n)        //start cleanup of nodes of the list 
    { 
     current = n; 
     n=n->next; 
     delete(current); 
    } 

    front = end = NULL; 
} 
0

這一個是釋放/使用鏈接的析構函數刪除存儲一個更好的辦法-list。

List()::~List() 
      { 
       for(Link* ptr= Head; Head; Head= Head->next) 
       { 
        delete ptr; 
       } 
      }