因此,似乎发生的情况是,我的程序无法识别何时将节点设置为nullptr。。。我不知道为什么会这样。每当我检查if(node != nullptr)
时,它似乎就会通过并直接进入语句。我这么说可能是错的,但我认为这就是正在发生的事情。。。也许你会得出不同的结论。以下是您应该需要的所有代码,如果您需要我发布更多信息以找到问题,请告诉我。
感谢您提前提供的帮助。
这是我的代码
void UseList::deleteNode(std::pair <unsigned, unsigned> data){
node *pre = nullptr, *del = nullptr;
// Check if its the head, if so then delete and update it
if(head->data == data){
del = head;
head = del->next;
delete del;
return;
}
pre = head;
del = head->next;
while(del != nullptr) { // <----- On the first execution, head is nullptr, so head->next should also be nullptr. This line should not be allowing the program to descend into the code.
if(del->data == data){ // <----- Seg fault occurs here.
pre->next = del->next;
if(del = tail)
tail = pre;
delete del;
break;
}
pre = del;
del = del->next;
}
}
这是GDB的seg断层记录
注意:当调用此删除时,列表为空。它应该认识到head->next是一个nullptr,而不是试图将其数据与要删除的数据进行比较。
50 while(del != nullptr) {
(gdb)
51 if(del->data == data){
(gdb)
std::operator==<unsigned int, unsigned int> (__x=..., __y=...)
at c:/mingw/lib/gcc/mingw32/4.8.1/include/c++/bits/stl_pair.h:215
215 { return __x.first == __y.first && __x.second == __y.second; }
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x00406352 in std::operator==<unsigned int, unsigned int> (__x=..., __y=...)
at c:/mingw/lib/gcc/mingw32/4.8.1/include/c++/bits/stl_pair.h:215
215 { return __x.first == __y.first && __x.second == __y.second; }
(gdb)
节点类定义&施工单位
class node {
public:
std::pair <unsigned, unsigned> data;
node *next;
node *prev;
node(){
next = nullptr;
prev = nullptr;
}
~node(){
delete next;
}
};
列表构造函数
UseList::UseList(){
head = tail = nullptr;
head->next = head->prev = nullptr;
tail->next = tail->prev = nullptr;
}
我认为是打字错误造成的。
您写道:
if(del = tail)
tail = pre;
你的意思可能是:
if(del == tail)
tail = pre;
我看到的问题
这可能不是你的问题,但值得一提。您有:
if(head->data == data){
如果列表为空,即
head == nullptr
,这将是一个问题。构造函数中的代码不正确。您有:
UseList::UseList(){ head = tail = nullptr; head->next = head->prev = nullptr; // Since head is nullptr, head->next and head->prev should // produce run time errors. tail->next = tail->prev = nullptr; // Same thing here also. }
deleteNode
中的while
循环需要仔细遍历,以确保您做的是正确的事情。您有:
if(del->data == data){ pre->next = del->next; if(del = tail) tail = pre; delete del; break; }
假设你的列表中有25个项目,给定的数据是列表中的第5个项目。此时,
pre
指向第4个节点,del
指向第5个节点。然后执行:pre->next = del->next; // This is good.
然后执行:
if(del = tail)
此语句将
del
指向列表的尾部,即第25个节点。表达式(del = tail)
的计算结果为"true"。所以,你执行:tail = pre;
现在tail
指向列表中的第4个节点。
然后执行:
delete del;
其删除列表的第25个节点。
现在,这个列表是一个奇怪的状态。CCD_ 10指向第4个节点。第25个节点已被删除,但第24个节点仍指向它。
如果head
是nullptr
,则无法访问head->next
。
所以这一行出现错误:
del = head->next; // if head is nullptr
对于head
是nullptr
的情况,也许你可以用不同的方式来写。