【问题标题】:SIGABRT error for linked list链表的 SIGABRT 错误
【发布时间】:2016-03-22 04:42:57
【问题描述】:

我创建了一个链表,我的目标是删除链表中的重复数据。每个节点中只有一个数据和指针组件。该算法可能并不完美,但我担心的是为什么我在尝试删除节点时在 Xcode 中收到错误SIGABRT。当if 条件为真时,代码中会出现错误。不知道SIGABRT 是什么意思。

void LinkedList::deleteRepetition(const LinkedList& list)
{
    node* temp_value = nullptr;
    node* traverser = nullptr;
    temp_value = head;
    traverser = head;
    for (int i = 0; i < NODES; i++)
    {
        for (int j = 0; j < NODES - i; j++)
        {
            traverser = temp_value->next;
            if (traverser->data == temp_value->data)
            {
                delete traverser;
            }
        }
        traverser = temp_value;
        temp_value = temp_value->next;
    }
}

【问题讨论】:

标签: c++ function linked-list


【解决方案1】:

您的第二个循环再次遍历已删除的元素。当你找到相同的节点时,你也需要交换指针。正确的版本:

void LinkedList::deleteRepetition(const LinkedList& list)
{
  node* node1 = head;
  node* node2 = nullptr;
  node* duplicate = nullptr;

  while(node1 != nullptr && node1->next != nullptr)
  {
     node2 = node1;

     while(node2->next != nullptr)
     {
       if(node1->data == node2->next->data)
       {
          duplicate = node2->next;
          node2->next = node2->next->next;
          delete duplicate
       }
       else 
       {
          node2 = node2->next;
       }
     }
     node1 = node1->next;
  }
}

请注意,最后一个元素中的 next 必须为 NULL。

【讨论】:

  • 试过了,没用。不确定“迭代已删除的元素”是什么意思。错误发生在它第一次尝试删除节点时,而不是之后。是的,这是出于学术目的。仅供参考,NODES 是一个等于 10 的 const int,表示列表中的节点数。
  • 编辑答案,更改实现
【解决方案2】:

这里你的方法是错误的。内部 for 循环,在迭代后再次访问相同的内存并损坏。所以你需要在 for 循环中更新它。

我的方法是一样的,可能对你有帮助

void removeDuplicates(struct node *start)
{
  struct node *ptr1, *ptr2, *dup;
  ptr1 = start;

  /* Pick elements one by one */
  while(ptr1 != NULL && ptr1->next != NULL)
  {
     ptr2 = ptr1;

     /* Compare the picked element with rest of the elements */
 while(ptr2->next != NULL)
 {
   /* If duplicate then delete it */
   if(ptr1->data == ptr2->next->data)
   {
      /* sequence of steps is important here */
      dup = ptr2->next;
      ptr2->next = ptr2->next->next;
      free(dup);
   }
     else /* This is tricky */
      {
        ptr2 = ptr2->next;
       }
     }
     ptr1 = ptr1->next;
  }
}

使用 while 循环我试图节省时间来检查一些我们可以忽略的条件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 2020-04-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多