2015-01-06 27 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