【问题标题】:deleting an item in cicular linked list删除循环链表中的一项
【发布时间】:2013-12-13 17:23:44
【问题描述】:

我的程序应该做 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");
}

删除功能以这种方式工作:用户输入一个数字,程序搜索该数字并找到该数字后,将其从列表中删除。

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

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

【问题讨论】:

  • 你的意思是“程序没有响应”窗口出现了吗?
  • 是的,出现这个窗口
  • 为什么while循环和if语句的条件相同(temp1-&gt;info != num)?如果那是false,那么你甚至不会执行if的语句。
  • 你确定你的数据结构是正确的并且你最终会再次到达first吗?
  • @Mahesh 如果我应该写什么??

标签: c++ circular-list


【解决方案1】:

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

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

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

【讨论】:

  • 是的,你说得对!如果我删除 newitem->next=first;在 if & 改变 if 之前: if(first==NULL){ first=newitem; newitem->next=first;} 对吗?
  • 这可能修复了插入。您的删除例程还有其他问题。尝试从列表中删除第一个项目,看看会发生什么一旦你解决了这个问题,然后尝试从列表中删除最后一个项目。另外,我让它滑动,您永远不会在要删除的项目上调用 delete()。
  • 另外一个问题是:现在我已经更改了插入,我的显示功能无法正常工作......我应该在函数 display() 的 while 循环中写什么?我写了 while(temp->next != first) 但它没有显示列表的最后一个成员
【解决方案2】:

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

temp1=temp1->下一个;

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

if(num != temp1->info )

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

【讨论】:

  • 我添加了插入代码,你看一下,告诉我它是否正确。 tnx
  • 我没有看到你的插入函数,它在哪里?
【解决方案3】:

发生这种情况,如果你插入一个不在列表中的数字,你会在第一个 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;
  }
}

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

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

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

【讨论】:

  • 这可能是更好的代码,但在逻辑上是等效的,afaics。除了后续代码无法与您的更改一起使用的地方之外,因为temp1 指向了错误的元素。
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多