我正在读大学的一个项目,并在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)它是非必需的。
你肯定* *是'LIST'指向列表的头部?你能告诉你如何创建一个简单的列表(一个[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve))? –
我编辑和添加功能是在主文章的结尾。 – CNAP
@CNAP'我一直盯着看似几个小时的代码,我找不到任何错误'了解如何使用调试器。你不能编写像这样的非平凡程序,也不希望用你的调试器进行调试。盯着代码只能走得这么远...... – PaulMcKenzie