【问题标题】:Deleting a specific Value from a linked list C++从链表 C++ 中删除特定值
【发布时间】:2014-10-15 23:57:03
【问题描述】:

所以这个问题可能有点奇怪,但在这里。

我遇到了一个函数问题,该函数在有序链表中搜索特定值并删除它遇到的第一个包含目标值的节点。我遇到的问题是,每当我传递一个不在链表上的值或试图通过运行它直到它返回 false 来删除目标值的所有副本时,它都会引发 Seg-fault(对于“未找到")。

我解决了这个问题,但我不太明白为什么我所做的更改解决了我遇到的问题,因为对我来说这些方法似乎是等效的。我已经在下面发布了“之前和之后”,我想知道是否更有经验的眼睛可以重温一遍,并解释为什么我所做的更改解决了我所描述的问题。

修复前:

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;
}

非常感谢您的帮助。

【问题讨论】:

    标签: c++ linked-list segmentation-fault delete-operator


    【解决方案1】:

    这里:

    if(scan->data == delVal)
    

    scan 可以为空,你不检查;在第二个版本中,您检查它是否为空,但不检查该值是否与您要删除的值匹配。也许你想要这个?

    if(scan != nullptr && scan->data == delVal)
    

    【讨论】:

    • 很可能,我想我从没想过scan既可以为null又可以满足scan->data == delVal,但似乎确实如此。
    • 不能。关键是在检查scan->data 之前,您必须检查scan 是否为空。否则它是未定义的行为。
    • 啊啊啊我明白了;如果 scan 为 null,则 scan->data 是非法操作。我可能应该看到...感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多