0

我的程序应该做 3 个操作:

  1. 插入
  2. 删除
  3. 显示在循环链表上。

我的问题在于删除功能。这是代码:

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");
}

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

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

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

4

3 回答 3

0

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

所以:

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;
  }
}

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

问题很可能出在插入方法上,您可能没有正确分配指针。

然后,为什么 system("pause"); ? 看看这里

于 2013-12-13T17:36:51.903 回答
0

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

temp1=temp1->下一个;

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

if(num != temp1->info )

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

于 2013-12-13T17:44:25.383 回答
0

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

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

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

于 2013-12-13T18:02:58.943 回答