2012-03-13 96 views
2

我正在C++中使用模板化通用鏈接列表,並且遇到push()方法的問題。我想我知道這個問題,但我找不出解決方案。這是我的推送方法。鏈接列表推式方法

template <class T> void DLL<T>::pushFront(T value) { 
    Node<T> node(value); 
    temp = node; 
    temp->setPrev(*head); 
    temp->setNext(*(head->getNext())); 
    head->setNext(*temp); 
    temp->getNext()->setPrev(*temp);                                  
    this->length++;                                      
} 

推一些整數到列表,在列表遍歷並打印關閉,似乎是在內存中隨機空間數字打印關閉值結果之後。我認爲這是因爲在推送函數返回後,節點變量被銷燬。任何人都知道爲什麼這不起作用?所有的setNext/Prev()和getNext/Prev()函數在我的其他測試中都能正常工作。我難倒...

編輯*

變量頭和溫度的類型節點<的T全局> *

+0

第3行應該是temp =&node? – tmpearce 2012-03-13 03:25:14

回答

1

你應該使用指針的節點存儲在列表中。

Node<T> node(value); 
temp = node; 

此代碼後已經走出了範圍,分配給「節點」的內存將被釋放,破壞你的鏈接列表。使用指針來代替:

template <class T> void DLL<T>::pushFront(T value) { 
    Node<T> *node = new Node<T>(value); 
    node->setPrev(head); 
    node->setNext(head->getNext()); 
    head->setNext(node); 
    node->getNext()->setPrev(node); 
    this->length++; 
} 

如果你的類節點應該是這樣的:

template<class T> class Node { 
public: 
    /* ... */ 
private: 
    Node<T> *next; 
    T data; 
}; 
+0

即使這樣做仍然有相同的結果。有什麼具體的方法,我需要保持「新節點(價值)」活着嗎?它可以在方法中聲明,對嗎? – 2012-03-13 22:25:45

+0

是的,沒關係。你的節點結構可能有問題,因爲你只給了我們這個方法,所以很難說它是什麼。 – mfontanini 2012-03-14 00:21:28

0

首先,head應該是一個全球性的 - 它應該是DLL一員的話,每個DLL(可憐的縮寫,國際海事組織)有一個頭(可能是尾巴)。

其次,getnext,setnext,getprevsetprev似乎100%毫無意義地浪費時間。通過使用它們而不是讀取/分配變量,您無法通過封裝或可讀性獲得任何信息。

第三,@fontanini已經指出的那樣,當你push一個節點,實際上你需要分配一個節點,而不是嘗試重新使用單個節點每次。第四,它看起來像你過於複雜的指針操作,可能至少部分是由於醜的/不可讀的等等。一旦你有一個節點,拼接它到鏈接列表的前面只需要三個操作(加上遞增的長度):

template <class T> 
void DLL<T>::pushFront(T value) { 
    node<T> *tmp = new node<T>(value); 
    tmp -> next = head; 
    tmp -> next -> prev = tmp; 
    head = tmp; 
    ++length; 
} 

當我已經做到了,我發現它有點簡單,只是通過指針節點的構造函數,雖然。在這種情況下,它出現這樣的事情:

template <class T> 
void DLL<T>::pushFont(T value) { 
    // These parameters are value, prev, and next, respectively.        
    node<T> *tmp = new node<T>(value, NULL, head); 
    tmp->next->prev = tmp; 
    head = tmp; 
    ++length; 
}