我正在处理双重链接列表,我无法解决我已经解决过的众多问题之一。
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;
}
我得到的错误是tail
是nullptr
但是它不应该是,因为我的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;
}
我得到的错误:
为了记录,我在创建结构时将head
和tail
设置为0。
答案 0 :(得分:2)
您的pop_back()
:
在从tail
阅读之前,您没有检查tail->value
是否有效。当size() == 0
,tail
为nullptr
时(您甚至可以在屏幕截图中看到错误发生时tail
为"0x00000000 <NULL>"
)。
在更新temp
之前,您没有检查temp->next
是否有效。当size() == 1
时,temp
将为nullptr
,因为tail
指向列表中的唯一节点。
您根本没有更新head
。当size() == 1
,head
和tail
指向同一个节点时,delete
该节点将使head
无效更新它(您还可以在屏幕截图中看到head->next
和head->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;
}