从链表中的第一个节点中删除时的段错误

时间:2012-11-15 21:16:21

标签: c++ linked-list

当我删除第一个节点时,我的单链链接的删除功能不起作用。说我有{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;
}

5 个答案:

答案 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;