当我删除第一个节点时,我的单链链接的删除功能不起作用。说我有{33,40,50}当我尝试删除33我得到一个段错误,但其他两个工作正常。我想我只需要一些新鲜的眼睛来看看我在删除功能中搞砸了什么。
删除功能
bool Set::remove(int X)
{
bool Flag = false;
Node * Prev = Head;
Node * Curr = Head->Succ;
//unsigned Z = 0;
while(Curr->Item != X)
{
Prev = Curr;
Curr = Curr->Succ;
}
Prev->Succ =Curr->Succ;
delete Curr;
Num--;
Flag = true;
return Flag;
}
答案 0 :(得分:1)
我认为是因为你从Curr = Head->Succ
开始已经过了33(Curr->item
是40)。你也永远不会检查它是否在列表的末尾。所以你正在访问超出范围的内存。
答案 1 :(得分:1)
你应该检查一下你是否经历了列表的末尾。
你应该从第一个元素而不是第二个元素开始(在这种情况下,这会使你通过列表并尝试继续进行)。
答案 2 :(得分:1)
您正在错误的地方开始搜索:
更改自:
Node * Prev = Head;
Node * Curr = Head->Succ;
为:
Node * Prev = null;
Node * Curr = Head;
但是段错误的真正问题在于,如果在链接列表中找不到指定的元素,则没有考虑终止条件的场景。
您可以按如下方式实现终止条件:
bool Set::remove(int X)
{
Node * Prev = Head;
Node * Curr = Head->Succ;
while(Curr->Item != X)
{
Prev = Curr;
Curr = Curr->Succ;
if ( null == Curr ) {
// If you've reached the end of your
// linked list and haven't found the item
// yet, give up looking and return
return false;
}
}
Prev->Succ =Curr->Succ;
delete Curr;
Num--;
return true;
}
注意:我还清理了一些代码以删除bool Flag
,因为这是不必要的。
答案 3 :(得分:1)
您的Curr变量从 SECOND 位置开始。头部指向第一个位置,而Curr指向头部指向两个位置(这是第二个!)。这会产生无限循环并导致程序崩溃。在curr
而不是
head
答案 4 :(得分:0)
Curr已初始化:
Node * Curr = Head->Succ;
意思是当你做
时while(Curr->Item != X)
您正在跳过“头部”值。由于Curr-> Item永远不会是33(头部值),因此您将继续使用Succ,直到最终到达列表末尾的NULL指针。 您没有检查是否已经到达列表的末尾,因此在执行
时会出现分段错误Curr->Item != X
OR
Curr = Curr->Succ;
尝试初始化:
Node * Curr = Head;