【问题标题】:Deleting node in a double linked list is not working删除双链表中的节点不起作用
【发布时间】:2021-06-09 21:56:00
【问题描述】:

这是一个基本函数,它采用迭代器位置并删除该位置的节点,但它给我一个运行时错误。我做错了什么?

iterate erase(iterate position)
{
    iterate i;
    Node<T>* temp = head;
    if (head == NULL) {
        cout << "empty list" << endl;
    }
    else if (position.pointer == head) {
        head = temp->next;
        temp->next->previous = NULL;
        delete position.pointer;
    }
    else {
        while (temp != NULL) {
            if (temp == position.pointer->previous) {
                temp->next = position.pointer->next;
                temp->next->previous = temp;
                i.pointer = temp->next;
                delete position.pointer;
                return i;
            }
        }
    }

【问题讨论】:

  • 格式化您的代码使其可读。
  • 并非所有路径都返回一个值,即未定义行为。此外,该 while 循环通常永远不会结束,因为您不更新 temp
  • 我修复了格式,但缺少}
  • 就此而言,在处理双链表时,您根本不需要while 循环。
  • @Nada 似乎这个 while 循环 while (temp != NULL) 是无限的。

标签: c++ doubly-linked-list


【解决方案1】:

您的函数缺少足够的return 语句。有多个流可以导致函数退出,但其中只有一个具有return 语句。所以返回值很大程度上是不确定的,导致任何试图使用返回值的调用者未定义的行为

在任何情况下,您的 while 循环都会永远迭代,因为您不会在循环的每次迭代中更新 temp。如果position 指向列表中的最后一个节点,您还有一个NULL 指针取消引用,因为您在访问temp-&gt;next-&gt;previous 之前没有检查新的temp-&gt;next 是否为NULL。

但是,您真的根本不需要while 循环双重-链表的特点是,给定列表中的 any 节点,您可以直接访问它周围的节点两侧。所以不需要迭代列表寻找节点。

试试类似的方法:

iterate erase(iterate position)
{
    Node<T> *temp = position.pointer;
    if (!temp) return end();

    Node<T> *next = temp->next;
    Node<T> *previous = temp->previous;

    if (next) next->previous = previous;
    if (previous) previous->next = next;
    if (temp == head) head = next;
    //if (temp == tail) tail = previous;
    delete temp;

    iterate i;
    i.pointer = next;
    return i;
}

或者:

iterate erase(iterate position)
{
    Node<T> *temp = position.pointer;
    if (!temp) return end();

    Node<T> *dummy; // <-- only if no tail ...
    Node<T> **previous = (temp->next) ? &(temp->next->previous) : &dummy/*&tail*/;
    Node<T> **next = (temp->previous) ? &(temp->previous->next) : &head;

    *previous = temp->previous;
    *next = temp->next;
    delete temp;

    iterate i;
    i.pointer = *next;
    return i;
}

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多