gpt4 book ai didi

c++ - 双向链表,tail 的问题

转载 作者:行者123 更新时间:2023-11-30 03:23:18 25 4
gpt4 key购买 nike

我正在使用双向链表,但我在尝试解决我已经解决的众多问题之一时遇到了麻烦。

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

根据记录,我在创建结构时从 0 开始了 headtail

最佳答案

您的 pop_back() 中存在多个逻辑缺陷:

  • 你没有检查 tail在读取 tail->value 之前有效.当size() == 0 , tail将是 nullptr (您甚至可以在屏幕截图中看到当错误发生时 tail"0x00000000 <NULL>")。

  • 你没有检查 temp在更新前有效 temp->next .当size() == 1 , temp将是 nullptrtail指向列表中的唯一节点。

  • 您没有更新 head根本。当size() == 1 , headtail将指向同一个节点,所以 delete 'ing 该节点将离开 head如果您不更新它,则无效(您还可以在屏幕截图中看到 head->nexthead->prev 都是无效的 - 0xdddddddd - 这也表明您没有正确管理您的节点)。

尝试更像这样的东西:

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;
}

关于c++ - 双向链表,tail 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50458227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com