链接列表的SIGABRT错误

SIGABRT error for linked list

本文关键字:错误 SIGABRT 列表 链接      更新时间:2023-10-16

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

第二个循环将再次迭代已移除的元素。当您找到相同的节点时,也需要交换指针。右侧版本:

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。

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

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

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循环,我试图节省检查某些条件的时间,我们可以忽略