2013-05-20 36 views
1

由於我下面的頭:LinkedList的析構函數風格

#ifndef LIST_H 
#define LIST_H 
#include "ListEle.h" 
class List{ 
private: ListEle* data; 
     const List* next; 
public: List(ListEle* d, List* n):data(d),next(n){} 
     ~List(){ 
      if(data!=nullptr)delete data; 
      if(next!=nullptr)delete next; 
     } 
}; 
#endif 

它是正確的,我的名單將遞歸地刪除自己?

然後,我讀了幾條線程,指出使用遞歸析構函數(用於列表)最終會垃圾我的堆棧。所以,我搜索的替代,發現像這樣的例子:

~List(){ 
delete data; 
List* delptr = next; 
    while(delptr!=nullptr){ 
    List* temp = delptr->next; 
    delete delptr; 
    delptr = temp; 
    } 
} 

如果我的想法是正確的第二個例子是,因爲「刪除delptr」線也不知何故遞歸。我的想法是,刪除delptr調用我的下一個列表項的析構函數,它將創建一個「delptr」,並繼續調用下一個項目的析構函數。因此我的堆棧應該與我的第一個示例類似。我很確定,我對刪除對象的理解可能存在錯誤。目前我覺得第二個例子中的while循環是非常不必要的。

希望有人可以幫我清理我的情況, 提前致謝。

+0

請注意,在將它傳遞給'delete'之前,不需要檢查null的指針。後者爲你做。 –

回答

0

是的,你的列表將遞歸地刪除它自己。但是,如果要刪除列表中間的單個條目,則不能這樣做,因爲之後的所有元素也將被刪除。

你和另一個析構函數一樣有問題和其他問題。它仍然是遞歸的。

如果您對設計進行小改動,並使用兩個類,將會更容易:一個用於實際列表,另一個用於列表中的節點。然後讓列表處理所有刪除/刪除節點,並儘可能簡化節點結構(只有數據和一個next指針,除了初始化數據和下一個指針的構造函數外,沒有函數)。