我正在尝试实现一个单链表 ..我正在终端上执行代码,我得到了Segmentation故障(核心转储)。我不明白为什么会这样?我读了同样的其他答案,不幸的是他们都没有帮助..
任何帮助将不胜感激..请解释它出错的地方?谢谢!
//singly linked list
#include<iostream>
using namespace std;
class node
{
int data;
node *next;
public:
node() //constructor
{
data=0;
next=NULL;
}
void setdata(int x)
{
data=x;
}
void setnext(node *x)
{
next=x;
}
int getdata()
{
return data;
}
node* getnext()
{
return next;
}
};
class list
{
node *head;
public:
list() // constructor
{
head=NULL;
}
void firstnode(int x)
{
node *temp;
temp=new node;
temp->setdata(x);
temp->setnext(head);
head=temp;
}
void insertbeg(int x)
{
node *temp1;
temp1=new node; //Allocate memory to temp1
temp1->setdata(x); // set data in new node to be inserted
temp1->setnext(head); // new node points to previous first node
head=temp1; // head now points to temp1
}
void insertbet(int x,int y)
{
node *temp1;
node *temp2;
temp1=new node; // Allocate memory to temp1
temp2=new node; // Allocate memory to temp2
temp1=head; // point temp1 to head so both of them point to first node
for(int i=0;i<y;i++) // To reach the desired node where data is to be inserted
{
temp1->getnext(); // point to next of node pointed by temp
temp1=temp1->getnext(); // temp1 now contains address of node pointed by next
}
temp2->setdata(x);
temp2->setnext(temp1->getnext()); // insert new node in list
temp1->setnext(temp2); // points the y-1 node to new node
}
void insertend(int x)
{
node *temp1;
node *temp2;
temp1=new node;
temp2=new node;
temp1=head;
while(temp1!=0)
{
temp1=temp1->getnext();
}
temp2->setdata(x);
temp1->setnext(temp2);
temp2->setnext(NULL);
}
void print()
{
node *temp1;
temp1=new node;
temp1=head;
while(temp1!=0)
{
cout<<temp1->getdata()<<endl;;
temp1=temp1->getnext();
}
}
};
int main()
{
list l;
l.firstnode(4);
l.insertbeg(3);
l.insertbeg(4);
l.insertbeg(6);
l.insertend(45);
l.insertend(9);
l.insertbet(2,46);
l.print();
return 0;
}
编辑:抱歉,我是新手编码,我正在尝试调试,进展甚微。我已经读过这个问题,答案太宽泛了,我需要特定的东西来解决错误。
答案 0 :(得分:3)
这就是为什么有像gdb这样的调试工具(只是google for it;))。
这是回溯:
#0 0x00000000004009ba in node::setnext (this=0x0, x=0x614cc0) at a.cpp:25
#1 0x0000000000400c18 in list::insertend (this=0x7fffffffdf10, x=45) at a.cpp:109
#2 0x00000000004008df in main () at a.cpp:137
这意味着在第137行有一个函数调用(l.insertend(45)
),然后在第109行,有下一个函数调用(temp1->setnext(temp2)
),并且第25行发生了段错误({{1 }})。这是因为节点未初始化(第109行中的temp1为0)。
你的while循环是个问题,如果你改变是这样的话:
next = x
这将解决您的第一个问题,但您将获得另一个段错误;) 尝试使用提供的工具自行解决。如果您仍需要帮助,请发表评论,我会发布答案。