我为链接列表编写了以下代码来创建一个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;
}
Run Code Online (Sandbox Code Playgroud)
这里
while(n->next!=NULL)
{
n=n->next;
}
n=n->next;
Run Code Online (Sandbox Code Playgroud)
您遍历链接列表以查找最后一个元素,然后单步执行它.在此之后,n将是null.
您缺少的是创建一个新元素并将其附加到列表的末尾.
和这里
n->accno=x;
n->name=s;
Run Code Online (Sandbox Code Playgroud)
您还必须分配n->next = null,否则您的列表将无法正确终止.
此外,在这里搜索书籍时
while(n->accno!=y && n->next!=NULL)
{
n->next=n;
}
cout<<"Book name is:"<<n->name;
cout<<"\nAccno is: "<<n->accno;
Run Code Online (Sandbox Code Playgroud)
退出循环后,要么你找到了这本书,要么n就是null.在尝试取消引用n之前,您必须检查是哪种情况,否则如果您要查找的书不在列表中,您将再次获得段错误.