双链表,尾巴问题

时间:2018-05-22 00:34:34

标签: c++ list double

我正在处理双重链接列表,我无法解决我已经解决过的众多问题之一。

double linked_list::pop_back()
{
    double value = tail->value;
    if (size() == 1)
    {
        delete tail;
        tail = NULL;
    }
    else
    {
        node_t * temp = tail->prev;
        temp->next = nullptr;
        delete tail;
        tail = temp;
    }
    return value;
}

我得到的错误是tailnullptr但是它不应该是,因为我的push_back()函数工作正常。

void linked_list::push_back(double value) {
    node_t * n = new node_t(value);
    n->value = value;

    if (head == nullptr) {
        head = n; 
    }
    if (tail != nullptr) {
        tail->next = n;
    }
    n->next = nullptr;
    n->prev = tail;
    tail = n;
}

我得到的错误:

image

为了记录,我在创建结构时将headtail设置为0。

1 个答案:

答案 0 :(得分:2)

您的pop_back()

存在一些逻辑缺陷
  • 在从tail阅读之前,您没有检查tail->value是否有效。当size() == 0tailnullptr时(您甚至可以在屏幕截图中看到错误发生时tail"0x00000000 <NULL>")。

    < / LI>
  • 在更新temp之前,您没有检查temp->next是否有效。当size() == 1时,temp将为nullptr,因为tail指向列表中的唯一节点。

  • 您根本没有更新head。当size() == 1headtail指向同一个节点时,delete该节点将使head无效更新它(您还可以在屏幕截图中看到head->nexthead->prev都无效 - 0xdddddddd - 这也表明您没有正确管理节点。“ / p>

尝试更像这样的东西:

double linked_list::pop_back()
{
    // if the list is empty, return whatever you want, but it
    // would be better to throw an exception instead, since
    // there is nothing to pop ...
    if (!tail)
        return 0.0;

    node_t *n = tail;
    double value = n->value;

    if (n->prev)
        n->prev->next = nullptr;
    else
        head = nullptr;

    tail = n->prev;
    delete n;

    return value;
}