链表的SIGABRT错误

时间:2016-03-22 04:42:58

标签: c++ function linked-list

我创建了一个链表,我的目标是删除链表中的重复数据。每个节点中只有一个数据和指针组件。该算法可能不完美,但我担心的是为什么我在尝试删除节点时在Xcode中收到错误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; } } 意味着什么。

 <script>

        $(function(){
            var text = $('.chapters').html(); 
            console.log(text);

            var str = text.match(/<\/blockquote>([\s\S]*?)<\/div>/);

            console.log(str);

        });

    </script>

2 个答案:

答案 0 :(得分:0)

这里你的方法是错误的。内部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循环我试图节省检查一些我们可以忽略的条件的时间

答案 1 :(得分:0)

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

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。