链接列表中的错误

时间:2011-04-28 12:34:33

标签: c++

我为链接列表编写了以下代码来创建一个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;
}

5 个答案:

答案 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;

退出循环后,您找到了该书或nnull。在尝试取消引用n之前,您必须检查是哪种情况,否则如果您要查找的图书不在列表中,您将再次获得段错误。

答案 1 :(得分:4)

  1. 学习写一个链接列表(所以如果这是一个针对学习它们的作业,它是有效的,但它没有被标记),但从未在实践中做过。有一个标准的库,除了你做一些非常特别的事情之外,它们还有你需要的所有数据结构。
  2. 你有C ++,所以不要编写C风格的代码book应该有一个构造函数,应该初始化它的成员。列表头也应该封装在类中,并使用它的方法进行操作。
  3. 你永远不会设置n-&gt;接下来,所以不要惊讶它永远不会包含任何有意义的内容。
  4. 你在循环中重复使用n忘记你构造的对象(内存泄漏)。
  5. 比你在列表末尾获得NULL而不是你构造的对象。

答案 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. 添加新节点时,您需要将“下一个”字段置零:

    案例1: 新书(); n-&gt; next = NULL; ...

  2. 您有内存泄漏