簡體   English   中英

從鏈接列表C中刪除特定值

[英]Deleting a specific Value from a linked list C++

因此,這個問題可能有點奇怪,但是可以解決。

我在搜索有序鏈表中的特定值並刪除遇到的包含目標值的第一個節點的函數時遇到問題。 我遇到的問題是,每當我給它傳遞鏈表中未提供的值或試圖通過運行它來刪除目標值的所有副本直到返回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;
}

在此先感謝您的幫助。

這里:

if(scan->data == delVal)

scan可能為空,並且您不檢查; 在第二個版本中,您檢查它是否為null,但不檢查該值是否與要刪除的值匹配。 也許你想要這個?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM