我为链接列表编写了以下代码来创建一个Book的序列号。并搜索它。我正在使用链表。
当我添加我的第一个条目时,它会成功添加,但是当我添加第二个条目时,它会显示分段错误。我无法弄清楚原因。请帮助。
提前致谢。
代码:
#include<iostream>
#include<string>
#include<fstream>
#include<cstdlib>
using namespace std;
struct book
{
int accno;
string name;
book* next;
};
int main()
{
bool flag=false;
int x,m;
string s;
book* front=NULL;
book* n;
do
{
cout<<"\nPlease select the following:\n1.Create and append\n2.Search\n3.Exit";
cin>>m;
switch(m)
{
case 1:
n=new book();
cout<<"\nEnter the book name: ";
cin>>s;
cout<<"\nEnter the acc no.: ";
cin>>x;
if(front==NULL)
{
front=n;
}
else
{ n=front;
while(n->next!=NULL)
{
n=n->next;
}
n=n->next;
}
n->accno=x;
n->name=s;
break;
case 2:
cout<<"Enter the roll no.";
int y;
cin>>y;
if(front==NULL){cout<<"Doesnot exist\n"; break;
}
else
{
n=front;
while(n->accno!=y && n->next!=NULL)
{
n->next=n;
}
cout<<"Book name is:"<<n->name;
cout<<"\nAccno is: "<<n->accno;
}
break;
case 3: flag=true;
break;
}
}
while(flag==false);
return 0;
}
答案 0 :(得分:6)
下面
while(n->next!=NULL)
{
n=n->next;
}
n=n->next;
您遍历链接列表以查找最后一个元素,然后单步执行。在此之后,n
将为null
。
您缺少的是创建一个新元素并将其附加到列表的末尾。
在这里
n->accno=x;
n->name=s;
您还必须指定n->next = null
,否则您的列表将无法正常终止。
此外,在搜索图书时,
while(n->accno!=y && n->next!=NULL)
{
n->next=n;
}
cout<<"Book name is:"<<n->name;
cout<<"\nAccno is: "<<n->accno;
退出循环后,您找到了该书或n
为null
。在尝试取消引用n之前,您必须检查是哪种情况,否则如果您要查找的图书不在列表中,您将再次获得段错误。
答案 1 :(得分:4)
book
应该有一个构造函数,应该初始化它的成员。列表头也应该封装在类中,并使用它的方法进行操作。n
忘记你构造的对象(内存泄漏)。答案 2 :(得分:1)
这就是你的问题:
....
else
{
n=front;
while(n->next!=NULL) //access to next will cause seg fault!!!
{
n=n->next;
}
n=n->next; // step once more, now we have NULL on second add...
}
另外,n->next
在哪里被分配?我什么都看不到?
答案 3 :(得分:1)
你在这做什么?
case 1:
n=new book();
cout<<"\nEnter the book name: ";
cin>>s;
cout<<"\nEnter the acc no.: ";
cin>>x;
if(front==NULL)
{
front=n;
}
else
{
n=front;
}
while(n->next!=NULL)
{
n=n->next;
}
n=n->next;
}
n->accno=x;
n->name=s;
break;
你已经创建了新书,并将其分配给n,在第一种情况下,它是好的,因为你直接将它分配到前面。但在其他情况下,你应该使用另一个变量(temp)迭代列表,当你的写n =前,你已经丢失了你的新书对象指针。希望你得到答案。
答案 4 :(得分:1)
这是一个错误的代码:
添加新节点时,您需要将“下一个”字段置零:
案例1: 新书(); n-&gt; next = NULL; ...
您有内存泄漏