我正在大学里做一个项目,同时在阅读一门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;
}
};
所以当我不想连接两个指针时,我使用:
set_nxt(element * n);
因此,在代码中,它看起来像(我想将ptr 2设置为ptr 1旁边):
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);
}
忽略if(cond == 0),它对此不重要。
1条答案
按热度按时间pftdvrlh1#
你的
lista<T>::add
函数有几个问题:curr
分配为指向LIST
,然后直接重新分配给您分配的新节点。nr == 0
)时,你不会将next
指针设置为NULL
。nr == 1
)时,curr
并不指向第一个节点(因为第一个点),所以你实际上并没有添加任何东西。如果您在调试器中逐行检查代码,所有这些问题都将非常清楚。
如果是我编写
add
函数,它看起来会像这样: