2016-07-05 169 views
-1

我試圖在C++中實現通用鏈接的對象列表。但是,當我兩次獲取同一個對象時,它給了我不同的結果。我覺得這是由於濫用指針。請幫我調試。c中的通用鏈接列表C++實現

這是Node的實現。我已經使用了模板指針,因爲鏈接列表應包含用戶定義的對象。

template <class T> class Node{ 
private: 
T* value; 
Node<T>* next;   
public: 
Node(T* v){value = v; next = NULL;} 
Node(T* v, Node<T>* n){value = v; next = n;} 
T* getElement(){return value;} 
Node<T>* getNext(){return next;} 
}; 

這是通用鏈接列表的實現。

template <class T> class LinkedList{ 
public: 
Node<T>* head = NULL; 
LinkedList(){}  
LinkedList(T* value){ 
    Node<T> node(value); 
    head = &node; 
} 
Node<T>* getHead(){ 
    return head; 
} 
void add(T* value){ 
    Node<T> node(value,head); 
    head = &node; 
} 
}; 

主要功能: 當我打電話鏈表的頭,它給了我2個不同的答案。在這段代碼中,Complex是一個容納複雜對象的簡單類。

int main(){ 
    Complex c1(1,2); Complex c2(3,4); Complex c3(5,6); 
    LinkedList<Complex> list(&c1); 
    list.add(&c2); 
    cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl; 
    cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl; 
    return 0; 
    } 

在此先感謝!

+0

'C'沒有類,所以你不能用'classes'在'C'中實現一個類。嘗試使用結構。 –

+1

使用您的調試器。 SO不是調試服務。在追蹤問題後,您可以問一個問題,如果您不明白爲什麼代碼正在執行的方式,但在此時您將掌握所發生的問題的所有細節。 –

+0

爲什麼不使用'std :: list'並完成它呢? –

回答

2

LinkedList(T* value)void add(T* value)中,您正在使用head = &node;的臨時地址。只要你超出了該功能的範圍,head就成爲一個懸掛指針。

您需要在堆上創建一個新節點,以便其生命週期將超出該功能的範圍。

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

不要忘了delete你在析構函數創建以避免內存泄漏,甚至更好,所以清理爲你做了切換到智能指針代替裸指針的所有節點。

+0

Upvoted,但建議交換「堆」在「動態內存」。這樣你就可以在極少數情況下動態內存沒有覆蓋堆。 – user4581301