当前位置: 首页 > 知识库问答 >
问题:

删除双链表中的节点(C++)

谭昊乾
2023-03-14

这是我的remove函数,用于删除具有item元素的节点。我得到了一个seg错误,我很确定这是因为temp->prev是前面的哨兵,所以从技术上来说,它不在双链表中。如果这是正确的,我实际上如何防止这种情况?如有任何帮助,不胜感激。

编辑:刚刚更新了代码,但仍然出现了Seg错误

void list::remove(const list_element & item)
{
  list_node* temp = _front;
  for (int i = 0; i < _size; i++)
    {
      if (temp -> next -> data == item)
      {
       if (temp -> prev == _front)
        {    
          _front = temp -> next;
        }
      else if (temp -> next == _rear)
        {    
          temp -> prev -> next = _rear;
        }
      else
        {
          temp -> prev -> next = temp -> next;
          temp -> next -> prev = temp -> prev;
        }
    }
      delete temp;
    }
}

共有1个答案

谯嘉胜
2023-03-14

您希望使用while()循环逐节点地遍历列表。由于_front是一个哨兵,因此不需要明确检查nextprev节点是head还是tail。

void list::remove(const list_element& item) {
  list_node* current = _front;
  while (current->next != nullptr) {
    if (current->next->data == item) {
      current->next = current->next->next;
      if (current->next != nullptr) {
        delete current->next->prev;
        current->next->prev = current;
      }
      break;
    }
    current = current->next;
  }
  // update pointer to rear if it changed
  if (current->next == nullptr)
    _rear = current;
}
 类似资料:
  • 双链表节点是在main函数中创建的。Ender和header已定义。在删除节点函数处中断-ender为空。 释放最后一个和第一个输入的内存的最佳方法是什么,即:删除:233,A和888,F?

  • 我试图从基于阉羊的双链表中删除一个元素,该列表中的节点满足返回bool的函数。由于某种原因,替换节点的前一个指针(下一个被删除)不更新,而是引用回它自己。 我的代码 测试结果

  • 我有麻烦删除双向链表中的节点,程序崩溃,我不能解决这个问题。你能帮我吗?这是创建新节点,查看它们并删除它们的完整代码。 我认为这个问题与Node del的scanf()有关,但我不确定。当我只是通过或

  • 我理解得对吗?(从虚拟节点开始) dummy->a->b->c->d->dummy(环绕到dummy节点) 因此,如果我想删除第一个实际的数据段(A),我需要将它分配给一个临时变量。所以Node first=head.next。然后我需要有一个虚拟的头部引用“B”,所以我需要做head.next=first.next。这就是所有需要做的吗? 在从列表中删除任何节点N的情况下(假设它在列表中),这是

  • 我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)

  • 我写了下面的代码,但它在执行create()函数后停止工作。我想从头节点开始删除替代元素。我的delete_Alt()函数正确吗?请告诉我哪里错了。