2012-05-26 73 views
0

所以,我試圖在C++中實現一個簡單的鏈表,但是我的類的push方法有問題。基本上,當我將第一個節點添加到列表中時,一切都很順利;但是,當我添加第二個節點時,它最終會指向自己(即secondNode.next == & secondNode)。在鏈表中創建循環插入

class linkedList 
{ 
    public: 
    node head; 
    linkedList() 
    { 
     head.next = NULL; 
    } 
    void push(node new) 
    { 
     if(head.next == NULL) 
     { 
      head.next = &new; 
      new.next = NULL; 
     } 
     else 
     { 
      new.next = head.next; 
      head.next = &new; 
     } 
    } 
}; 

我找不出什麼問題......任何幫助將不勝感激。

+0

這不能是C++,它必須是C,因爲'new'是一個保留關鍵字。 –

+0

@ K-ballo:但是如果它是'c','class linkedList'將不被允許 - 除非你有'#define class struct'之類的東西,否則它甚至不會編譯。 –

+1

無論如何,不​​要在C++中使用'new'作爲變量名。 – Ashe

回答

2
void push(node new) 

你必須使對象的副本,就像這樣:

void push(node& new) 

否則你正在服用的是在函數結束時刪除的對象的ADRESS

0

至少在我看來,你有一些在某種程度上或其他方面都有問題的東西。

首先,head不應該是node - 它應該是node *。至少從外觀上看,所有你曾經使用過的指針都是它的指針,所以你不妨將它作爲一個指針並且完成它。

其次,要在列表開頭插入新項目,您並不需要檢查列表頭是否爲空指針。

第三,雖然@ lezebulon的建議使用引用節點工作,我不認爲這是真的在這種情況下,去最佳方式。他們不應該讓指針或引用指向節點,而應該只是傳入一個數據項,而鏈表類應該分配一個節點來保存列表中的該項。

template <class T> 
class linked_list { 

    class node { 
     T item; 
     node *next; 
    public: 
     node(T const &data, node *next_node) : item(data), next(next_node) {} 
    }; 

    node *head; 
public: 

    linked_list() : head(NULL) {} 

    void push(T const &data) { 
     head = new node(data, head); 
    } 
};