簡體   English   中英

C++ 從鏈表中刪除項目的問題

[英]C++ Issue with deleting item from linked list

上一個問題解決了!

新問題:代碼本身。 我一直在研究 function 的代碼,以從鏈接列表中刪除選定的項目,它可能會出現多少次。 但是,當我運行該部分程序以嘗試刪除節點時,它只會結束程序。 我知道肯定會發生一些事情,但是即使查看有關此的教程,我也不太了解如何實現此指令。 任何幫助將不勝感激。 [解決]

Function

void LinkedList::deleteItem(int _newItem)
{
if(isEmptyList())
    cout << "\t<ERROR> List is empty.\n";

else
{
    bool itemDelete = false;

    nodeType *q = first;

    while(q != NULL)
    {
        if(first->info == _newItem)
        {
            nodeType *p = first->link;
            first->link = p->link;
            delete p;
            --count;
            itemDelete = true;
        }

        if(q->link->info == _newItem)
        {
            nodeType *r = q;
            nodeType *p = q;
            r = r->link;
            p->link = r->link;
            delete r;
            --count;
            itemDelete = true;
        }

        q = q->link;
    }
    if(itemDelete == true)
        cout << "Item was deleted.";
    else
        cout << "Item was not found.";
}

}

Class 和結構

    struct nodeType
    {
     int info;
     nodeType *link;
    };

    class LinkedList
    {
     public:
        void initializeList();
        bool isEmptyList();
        void printList();
        int findLength();
        void destroyList();
        int infoFirst();
        int infoLast();
        bool searchItem(int);
        void insertFront(int);
        void insertBack(int);
        void deleteItem(int);
        int calcTotal();
        int calcAvg();
        LinkedList();

    private:
        nodeType *first, *last, *newNode;
        int count; //adds or remove one whenever a node is added or removed
    };

您的代碼的一個問題是這一行:

if(q->link->info == _newItem)

您正在訪問鏈接列表中的下一個鏈接,但下一個鏈接可能是 nullptr:

if(q->link != nullptr && q->link->info == _newItem)

在訪問其成員信息之前,您應該首先檢查它是否為 nullptr。

您還應該考慮搬家:

        if(first->info == _newItem)
        {
            nodeType *p = first->link;
            first->link = p->link;
            delete p;
            --count;
            itemDelete = true;
        }

在循環之外,因為您將在每次進入循環時通過此檢查 go 如果您嘗試刪除的節點不是第一個,因為您首先檢查節點,而不是您用來循環的節點 q你的鏈表。

另外請考慮使用 nullptr 代替 NULL。

else
{
    bool itemDelete = false;

    nodeType *q = first;

    if(first->info == _newItem)
    {
        nodeType *p = first->link;
        first->link = p->link;
        delete p;
        --count;
        itemDelete = true;
    }
// by doing !itemDelete you will exit once you find the item
// or you won't enter the loop if the item was the first in the list
    while(q != nullptr && !itemDelete)
    {
        if(q->link != nullptr && q->link->info == _newItem)
        {
            nodeType *r = q;
            nodeType *p = q;
            r = r->link;
            p->link = r->link;
            delete r;
            --count;
            itemDelete = true;
        }

        q = q->link;
    }
    if(itemDelete == true)
        cout << "Item was deleted.";
    else
        cout << "Item was not found.";
}

這部分可以進一步折疊:

// by doing !itemDelete you will exit once you find the item
while(q != nullptr && !itemDelete)
{
    if(q->link != nullptr && q->link->info == _newItem)
    {
        nodeType *r = q;
        nodeType *p = q;
        r = r->link;
        p->link = r->link;
        delete r;
        --count;
        itemDelete = true;
    }

    q = q->link;
}

至:

 // by doing !itemDelete you will exit once you find the item
    while(q->link != nullptr && !itemDelete)
    {
        if(q->link->info == _newItem)
        {
            nodeType *r = q;
            nodeType *p = q;
            r = r->link;
            p->link = r->link;
            delete r;
            --count;
            itemDelete = true;
        }

        q = q->link;
    }

我希望這對你有幫助。

暫無
暫無

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

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