删除循环链表中的项目

时间:2013-12-13 17:23:45

标签: c++ circular-list

我的程序应该执行3次操作:

  1. 插入
  2. 删除
  3. 在循环链接列表中显示。
  4. 我的问题在于删除功能。这是代码:

    void c_list::del()
    {
        int num;
        if(isempty())
            cout<<"List is Empty!"<<endl;
        else
        {
            node *temp1=first;
            node *temp2=NULL;
            cout<<"Enter the number that u want to DELETE:"<<endl;
            cin>>num;
            while(temp1->next!=first && temp1->info != num)
            {
                temp2=temp1;
                temp1=temp1->next;
            }
            if(num != temp1->info )
                cout<<"your number was not found in the list"<<endl;
            else
            {
                if(temp2!=NULL)
                {
                    temp2->next=temp1->next;
                    cout<<temp1->info<<" was deleted"<<endl;        
                }
                else
                {
                    first=temp1->next;
                    cout<<temp1->info<<"was deleted"<<endl;
                }
            }
        }
        system("pause");
    }
    

    删除功能正在以这种方式工作:用户输入一个号码,程序搜索该号码&amp;当它找到号码时,将其从列表中删除。

    现在的问题是,当用户输入列表中不存在的号码时,会出现“应用程序崩溃窗口”(我的意思是这个窗口:程序没有响应),而我提供了一条错误消息对于这种情况(“你的号码在列表中找不到”)!!

    你能告诉我这是什么问题吗?

3 个答案:

答案 0 :(得分:0)

发生这种情况,如果您插入一个不在列表中的数字,那么您在第一个时就会有一个循环。

所以:

node* temp1 = first;
node* temp2 = 0; 
while(temp1->next!=first && !temp2) {
  if(temp1->info == num) {
     /* save pointer and exit from while */
     temp2 = temp1;
  } else {
    temp1 = temp1->next;
  }
}

然后你的代码产生垃圾,因为你从不调用删除。

很可能问题出在insert方法上,也就是说,你没有指定正确的指针。

然后,为什么系统(“暂停”); ?看看here

答案 1 :(得分:0)

我认为在你的while循环中你到达列表的末尾并且 在下面的行temp1获得NULL之后。

  

=的temp1 temp1-&gt;接下来;

然后你试图从空指针读取info属性,这会导致错误。

  

if(num!= temp1-&gt; info)

我知道你说这是循环列表,但我不确定它是否正确实施。我的建议只是尝试在while循环后打印 temp1-&gt; info ,以确保列表的正确性和您的实现。

答案 2 :(得分:0)

您的插入例程未创建循环列表。当列表为空并且首先插入初始项时== NULL。在这种情况下,您的代码将列表保留为非循环状态。这是因为:

    newitem->next=first;
    if(first==NULL)
        first=newitem;

此时first-&gt; next == NULL,在循环列表中绝不应该是这种情况。只要列表中不存在要查找的项目,您的搜索代码就会失败。这是因为它永远不会循环回到第一个节点,因为列表不是循环的。