【问题标题】:Deleting Node from Circular Doubly Linked List从循环双向链表中删除节点
【发布时间】:2016-03-31 04:50:52
【问题描述】:

我编写了将元素插入循环双向链表并显示这些元素的代码。我还应该能够从列表中删除尾节点,以及在列表中搜索特定元素。

这是我用于添加和打印的工作代码:

void Circular_DLList::add_to_tail(int a)
{
    DLLNode *temp = new DLLNode;
    temp->info = a;
    if (is_empty()) {   
        tail = temp;
        temp->next = tail;
        temp->prev = tail;
    }
    else {
        temp->next = tail->next;
        temp->prev = tail;
        tail = temp;
        tail->prev->next = temp;
    }
}

void Circular_DLList::print_list()
{
    DLLNode *ptr;
    ptr = tail->next;
    do {
        cout<< ptr->info << endl;
        ptr = ptr->next;
    }
    while(ptr != tail->next);
}

无论我为 delete_from_tail 函数写什么,它都会导致分段错误:11。这是我对该函数的尝试(会引发错误)。

int Circular_DLList::delete_from_tail()
{
    int a = tail->info;
    if(tail == tail->next) {
        delete tail;
        tail = NULL;
    }
    else {
        tail = tail->prev;
        delete tail->next;
        tail->next = NULL;
    }
    return a;
}

任何关于如何解决这个问题的建议都很棒。我已经尝试过调试,但我似乎无法弄清楚这个问题或者它与它的确切关系。 谢谢

【问题讨论】:

  • 你知道循环链表的概念其实就是没有尽头吧?
  • @UsamaZafar 是的,但是我们正在使用一个名为 tail 的节点,所以这只是一种简单的表达方式。我将编辑帖子以澄清
  • 删除本身是否会出现错误?我猜不是。我认为它是在删除后发生在打印上的吗?
  • @UsamaZafar 是的,你是对的,调试器告诉我它在调用 print 时发生,这就是为什么我不知道如何修复它
  • 给我一点时间写下答案。

标签: c++ linked-list segmentation-fault doubly-linked-list circular-list


【解决方案1】:

如果你仔细观察,这个问题就很明显了。您的删除功能正在破坏链接列表的循环链。怎么会这样?请参阅下面的删除功能:

int Circular_DLList::delete_from_tail()
{
    int a = tail->info;
    DLLNode *temp;

    if(tail == tail->next) {
        delete tail;
        tail = NULL;
    }
    else {
        tail = tail->prev;
        delete tail->next;
        tail->next = NULL;
    }
    return a;
}

else-condition 中,您正在设置tail-&gt;next = NULL,这实际上是错误,因此会破坏链条。因此,当调用 print 时,它假定循环链是完整的,因此意外地尝试访问 NULL 指针,这反过来又导致分段错误。

修复很简单,见下面的代码:

int Circular_DLList::delete_from_tail()
{
    int a = tail->info;
    if(tail == tail->next) {
        delete tail;
        tail = NULL;
    }
    else {
        temp = tail;
        tail = tail->prev;
        tail->next = temp->next;        // To maintain the circular chain
        tail->next->previous = tail;    // Since this element's previous also point to the node about to be deleted
        delete temp;
        temp = NULL;
    }
    return a;
}

【讨论】:

  • 非常感谢,您不知道我对此有多感激,也非常感谢您的解释。效果很好!
  • @btoohey 很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多