我尝试自己实现一个单链表。现在,我只编写了一个添加到列表末尾的元素,以及一个打印列表内容的函数。但是当我想打印一个列表时,我的程序给了我一个分割错误。下面是我的代码:
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
class Stuff;
class List
{
private :
Stuff *first, *last;
public :
List();
void addfront(Stuff *s);
void print();
~List();
};
class Stuff
{
private :
string name;
double price;
public :
Stuff();
Stuff(string, double);
void print();
Stuff *next;
};
Stuff::Stuff()
{
name = "";
price = 0;
next = NULL;
}
Stuff::Stuff(string n, double p)
{
name = n;
price = p;
}
void Stuff::print()
{
cout << name << " " << price << "n";
}
List::~List()
{
}
void List::addfront(Stuff *s)
{
if(first == NULL )
first = s;
last->next = s;
s->next = NULL;
last = s;
}
void List::print()
{
Stuff *p;
if(last == first == NULL)
cout << "list is empty!n";
else
for (p = first; p != NULL; p = p->next)
p->print();
}
List::List()
{
first = last = NULL;
}
int main(int argc, char **argv)
{
List l;
Stuff *s1 = new Stuff("Coffe", 4.50);
Stuff *s2 = new Stuff("Apple", 2.50);
l.addfront(s1);
l.addfront(s2);
l.print();
return 0;
}
在将last->next
设置为s
之前,您似乎忘记检查last != NULL
。
延迟NULL
指针导致未定义的行为。
你的addFront
函数应该是这样的:
void List::addfront(Stuff *s) {
if(!first)
first = s;
if (last)
last->next = s;
s->next = NULL;
last = s;
}
Btw:用if(last == first && last == NULL)
代替if(last == first == NULL)
有一个问题是
if(last == first == NULL)
make it
if(last == NULL && first == NULL)
你也需要做,
void List::addfront(Stuff *s)
{
if(!first)
first = s;
if (last)
last->next = s;
s->next = NULL;
last = s;
}
这是因为addfront
方法中的这一行
last->next = s;
这里last
是一个NULL指针。
(gdb) p last
$1 = (Stuff *) 0x0
延迟NULL指针将导致内存错误/分段冲突。
始终检查是否为NULL,然后再执行。
if (last)
last->next = s;
如果您在Linux机器上,那么您可以在gdb
中运行程序。一旦发生分段冲突,请使用backtrace
命令查看调用堆栈,以了解哪个语句崩溃了。