单链表段故障问题



我尝试自己实现一个单链表。现在,我只编写了一个添加到列表末尾的元素,以及一个打印列表内容的函数。但是当我想打印一个列表时,我的程序给了我一个分割错误。下面是我的代码:

#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命令查看调用堆栈,以了解哪个语句崩溃了。

相关内容

  • 没有找到相关文章

最新更新