所以这个问题可能有点奇怪,但现在开始。
我遇到了一个函数问题,该函数在有序链表中搜索特定值,并删除它遇到的第一个包含目标值的节点。我遇到的问题是,每当我向它传递一个不在链表上的值,或者试图通过运行它来删除目标值的所有副本,直到它返回false(表示"未找到")时,它就会抛出Seg错误。
我解决了这个问题,但我不太明白为什么我所做的更改解决了我所面临的问题,因为对我来说,这些方法似乎是等效的。我在下面发布了"之前和之后",我想知道更有经验的人是否可以重新审视一下,并解释为什么我所做的更改解决了我描述的问题。
修复前:
bool deleteNode(Node *&headRef, int delVal)
{
Node *delPtr; // for use in deletion
Node *scan; // " "
Node *prev; // " "
if( headRef != nullptr ) {
if( headRef->data == delVal ) {
delPtr = headRef;
headRef = headRef->next;
delete delPtr;
} else {
scan = headRef->next;
prev = headRef;
while( scan != nullptr && scan->data != delVal ) {
scan = scan->next;
prev = prev->next;
}
if( scan->data == delVal ) {
delPtr = scan;
prev->next = delPtr->next;
delete delPtr;
} else return false;
}
}
return true;
}
之后(已标记更改):
bool deleteNode(Node *&headRef, int delVal)
{
Node *delPtr; // for use in deletion
Node *scan; // " "
Node *prev; // " "
if( headRef == nullptr ) // *CHANGE #1*
return false;
if( headRef->data == delVal ) {
delPtr = headRef;
headRef = headRef->next;
delete delPtr;
} else {
scan = headRef->next;
prev = headRef;
while( scan != nullptr && scan->data != delVal ) {
scan = scan->next;
prev = prev->next;
}
if( scan != nullptr ) { // *CHANGE #2*
delPtr = scan;
prev->next = delPtr->next;
delete delPtr;
} else return false;
}
return true;
}
提前感谢你的帮助。
此处:
if(scan->data == delVal)
scan
可能为null,并且您不进行检查;在第二个版本中,您检查它是否为null,但不检查该值是否与要删除的值匹配。也许你想要这个?
if(scan != nullptr && scan->data == delVal)