从链表C ++中删除特定值

时间:2014-10-15 23:57:04

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

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

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

我解决了这个问题,但我并不完全理解为什么我所做的改变解决了我遇到的问题,对我而言,这些方法看起来相当。我已经在"之前和之后发布了"下面,我想知道更有经验的眼睛能不能给它一次,并解释为什么我所做的改变解决了我所描述的问题。

修复前:

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

先谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

下面:

if(scan->data == delVal)

scan可能为null,您不检查;在第二个版本中,您检查它是否为null,但如果值与您要删除的值匹配则不会。也许你想要这个?

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