2015-01-06 55 views
0

我正在讀大學的一個項目,並在C++中閱讀課程。我們目前正在使用鏈接列表,並已開始使用模板。不知何故,我不能讓我的列表鏈接,換句話說,我的下一個功能將無法正常工作。如果指向不正確,在編譯時沒有抱怨,沒有任何運行程序並將其添加到列表中的問題,我不會收到「分段錯誤(核心轉儲)」問題,但問題在於,當我添加它時找到下一個元素,它只打印出我的第一個元素。模板中的鏈接列表

這是我的元素模板:

template <class T> 
class element { 
private: 
    element <T> * next; 
    T name; 
public: 
    element <T> * get_nxt() { 
     return next; 
    } 
    void set_name (string nam) { 
     name = nam; 
    } 
    string get_name() { 
     return name; 
    } 
    void set_nxt (element <T> * n) { 
     next = n; 
    } 
}; 

所以,當我wan't鏈接兩個指針我用的是:

set_nxt(元素* N);

所以它看起來像代碼(我想設置爲PTR2旁邊PTR1):

ptr1-> set_nxt(PTR2);

因爲我後來想檢查我的列表包含多少個元素,它只能說一個。

這裏是計數功能我使用過他們的所有計算:

template < class T > 
int lista<T>::count (lista<T> & L) { 
    element <T> *curr = LIST; 
    int nr = 0; 
    while (curr) { 
     curr = curr->get_nxt(); 
     ++nr; 
    } 
    return nr; 
} 

某處這裏的問題在於,因爲這個函數返回1,即使我已經添加了2個或更多。

名單已經以這種方式宣告:

template < class T > 
class lista { 
private: 
    element <T> * LIST; 
public: 
    lista() { 
     LIST = NULL; 
    } 
    void add(lista<T> & , string, int); 
    int count(lista<T> &); 
    void print (lista <T> &); 
}; 

我有列表,而不是流行的頭。我一直在盯着看似幾個小時的代碼,我找不到任何錯誤。我們之前一直在做沒有模板的鏈接列表,我假設鏈接過程對於鏈接列表模板是一樣的。

添加元素:

void lista<T>::add (lista<T> & L, string name, int cond) { 
    element <T> *curr = LIST, *fill; 
    fill = new element <T>; 
    curr = new element <T>; 
    if (cond == 0) { 
     int nr; 
     nr = L.count(L); 
     if (nr == 0) { 
      curr->set_name (name); 
      LIST = curr; 
     } 
     else if (nr > 0) { 
      int i; 
      for (i = 1 ; i < nr ; ++i) 
       curr = curr->get_nxt(); 
      fill->set_name(name); 
      curr->set_nxt (fill); 
      fill->set_nxt(NULL); 
     } 

忽略此所述,如果(COND == 0)它是非必需的。

+0

你肯定* *是'LIST'指向列表的頭部?你能告訴你如何創建一個簡單的列表(一個[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve))? –

+0

我編輯和添加功能是在主文章的結尾。 – CNAP

+0

@CNAP'我一直盯着看似幾個小時的代碼,我找不到任何錯誤'瞭解如何使用調試器。你不能編寫像這樣的非平凡程序,也不希望用你的調試器進行調試。盯着代碼只能走得這麼遠...... – PaulMcKenzie

回答

0

lista<T>::add功能有幾個問題:

  • 首先分配curr指向LIST,並直接重新分配給你分配一個新的節點。

  • 將第一個節點添加到列表中時(nr == 0),則不要將next指針設置爲NULL

  • 當您添加第二個節點(nr == 1curr不指向第一個節點(因爲第一個點),所以你根本沒有添加任何東西。

  • 由於前面的問題,您根本不會將任何節點添加到列表中,因爲除第一個節點以外的所有節點都將是第二個節點,並且您無法真正添加它。

如果您在調試器中逐行執行代碼,所有這些問題對您來說都會非常清楚。


如果是我製作add功能,它會是這個樣子:

void lista<T>::add (lista<T> & L, string name, int cond) { 
    if (cond == 0) 
     return; 

    if (LIST == nullptr) { 
     // Adding the first node in the list 
     LIST = new element<T>; 
     LIST->set_nxtT(nullptr); 
     LIST->set_name(name); 
    } else { 
     // First find the last node 
     element<T>* last; 
     for (last = LIST; last->get_nxt() != nullptr; last = last->get_nxt()) 
      ; 

     // Add a new node 
     last->set_nxt(new element<T>); 
     last->get_nxt()->set_nxt(nullptr); 
     last->get_nxt()->set_name(name); 
    } 
} 
+0

似乎已經解決了這個問題,非常感謝你! – CNAP