簡體   English   中英

刪除雙向鏈接列表中的項目

[英]deleting an item in Doubly-linked list

我的程序應該執行3個操作:1.插入2.刪除3.使用雙向鏈接列表顯示...我的刪除功能有問題。 這是代碼:

void List::del()
{
    int num;
    Node *Aux1=first;
    Node *Aux2=NULL;
    if(isempty())
        cout<<"List is Empty!"<<endl;

    else
    {
        cout<<"Enter the number that you want to DELETE:"<<endl;
        cin>>num;
        while(Aux1->info!=num && Aux1 != NULL)
        {
            Aux2=Aux1;
            Aux1=Aux1->left;
        }
        if(Aux1!=NULL)
        {
            if(Aux2!=NULL)
            {
                if(Aux1->left==NULL)
                    Aux2->left=NULL;
                else
                {
                Aux2->left=Aux1->left;
                Aux1=Aux1->left;
                Aux1->right=Aux2;
                }
            }
            else
            {
                first=Aux1->left;
                //first->right=NULL;
            }
        }
        system("pause");
    }
}

在刪除功能中,我想找到用戶要刪除的號碼,然后將其從列表中刪除...問題是當用戶輸入列表中不存在的號碼時! 在這種情況下,我希望我的程序在列表上什么也不做,並且不要從列表中刪除任何項目。 但發生這種情況時,我會遇到此錯誤:

應用崩潰窗口

我的代碼有什么問題? ;-?

while循環在檢查它是否為NULL之前先取消引用NULL指針。 您需要將循環更改為此:

while(Aux1 != NULL && Aux1->info!=num)

問題部分是以下部分:

    while(Aux1->info!=num && Aux1 != NULL)
    {
        Aux2=Aux1;
        Aux1=Aux1->left;
    }

在檢查Aux1是否為NULL之前,請先取消引用。 因此,您將在此循環中遇到分段錯誤。

但是,您的數據結構存在更嚴重的問題。

首先,您的字段名稱有點奇怪。 通常,雙向鏈接列表分別具有針對上一個元素和下一個元素的上一個和下一個指針。

其次,您實際上並不計算項目,而是依靠它們的信息字段。 但是您永遠不會更新此字段,因此一段時間后,此ID將變得毫無意義且零碎。

考慮用戶輸入五個節點的情況:

0 --> 1 --> 2 --> 3 --> 4

現在調用delete(2):

0 --> 1 --> 3 --> 4

現在,您的用戶必須獲取所有顯示的ID並選擇正確的ID,在這種情況下,您的細分錯誤就會發生-如果用戶再次調用delete(2),現在會發生什么? 通常,不會通過魔術ID號刪除節點,而是具有一種函數,該函數采用指向需要刪除的節點的指針。

NodePayload* delete(Node* node)

然后,這將刪除適當的節點,並有選擇地返回指向實際刪除的節點/或其有效負載的指針。 因為通常出於內存管理的原因,您的List類可能會分配Node,而不分配其有效載荷,因此用戶可以將List與分配的自定義有效載荷一起使用。

暫無
暫無

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

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