模板中的链表
Linked list in template
我正在大学里做一个项目,同时正在阅读 C++ 课程。我们目前正在使用 linked 列表并开始使用模板。不知何故,我无法获得我的列表 linked,换句话说,我的下一个功能将无法运行。如果指向不正确,我不会得到 "Segmentation Fault (core dumped)" ,编译时没有投诉,运行程序并将人员添加到列表时也没有投诉,问题是它找不到我添加的下一个元素,它只打印出我的第一个元素。
这是我的元素模板:
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;
}
};
所以当我不想 link 两个指针时,我使用 :
set_nxt (element * 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;
}
问题就出在这里,因为这个函数 returns 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> & );
};
我有LIST而不是流行的头。我一直盯着代码看了几个小时,但我找不到任何错误。之前我们一直在做没有模板的 linked 列表,我假设 linking 过程对于 linked 列表的模板是相同的。
添加元素:
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) 它不是必需的。
您的 lista<T>::add
函数有几个问题:
首先你将curr
赋值给LIST
,然后直接重新赋值给你分配的新节点。
当您将第一个节点添加到列表 (nr == 0
) 时,您不会将 next
指针设置为 NULL
。
当你添加第二个节点时(nr == 1
) curr
没有指向第一个节点(因为第一个点)所以你真的没有添加任何东西。
由于前面的问题,您根本不会将任何节点添加到列表中,因为除第一个节点外的所有节点都是第二个节点,您无法真正添加它。
如果您在调试器中逐行检查代码,那么所有这些问题对您来说都会非常清楚。
如果 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);
}
}
我正在大学里做一个项目,同时正在阅读 C++ 课程。我们目前正在使用 linked 列表并开始使用模板。不知何故,我无法获得我的列表 linked,换句话说,我的下一个功能将无法运行。如果指向不正确,我不会得到 "Segmentation Fault (core dumped)" ,编译时没有投诉,运行程序并将人员添加到列表时也没有投诉,问题是它找不到我添加的下一个元素,它只打印出我的第一个元素。
这是我的元素模板:
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;
}
};
所以当我不想 link 两个指针时,我使用 :
set_nxt (element * 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;
}
问题就出在这里,因为这个函数 returns 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> & );
};
我有LIST而不是流行的头。我一直盯着代码看了几个小时,但我找不到任何错误。之前我们一直在做没有模板的 linked 列表,我假设 linking 过程对于 linked 列表的模板是相同的。
添加元素:
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) 它不是必需的。
您的 lista<T>::add
函数有几个问题:
首先你将
curr
赋值给LIST
,然后直接重新赋值给你分配的新节点。当您将第一个节点添加到列表 (
nr == 0
) 时,您不会将next
指针设置为NULL
。当你添加第二个节点时(
nr == 1
)curr
没有指向第一个节点(因为第一个点)所以你真的没有添加任何东西。由于前面的问题,您根本不会将任何节点添加到列表中,因为除第一个节点外的所有节点都是第二个节点,您无法真正添加它。
如果您在调试器中逐行检查代码,那么所有这些问题对您来说都会非常清楚。
如果 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);
}
}