簡體   English   中英

在C ++中的鏈接列表中的任意位置插入/刪除

[英]Insert/Delete Anywhere in a Linked List in C++

我學習C ++已有一段時間了,最​​近才開始查看鏈接列表。 我可以使用從后/前插入/刪除常用功能構造一個模板類List。 現在我想出了一個練習,要求我編寫一個函數來處理列表中任何位置的插入/刪除。

請記住,我的問題是非常基本的。

我的問題是我認為這個問題模棱兩可。 該功能需要什么樣的信息? 例如,對於刪除,我可以提出幾個候選對象:1)刪除具有特定值(參數:值)的第一個節點2)刪除具有特定值(參數:值)的所有節點3)刪除特定節點(參數:指向該節點的指針)1)和2)我可以輕松編寫代碼。 3)比較難,但我也可以做到。 我只是看不到3)中的要點。 使用列表時,通常會操縱節點(在列表定義之外)嗎? 像這樣,使用列表的程序通常實際操作指向節點的指針嗎?

在此設置中“刪除任何地方”的通常含義是什么?

同樣,對於“在任何地方插入”,措辭很奇怪。 “任何地方”是什么意思? 鏈表中的位置是否應該由特定節點指定?

在鏈接列表中,您可以恆定時間訪問第一個元素。 因此,在任何地方刪除/插入都意味着第一個元素與最后一個元素之間存在的位置。 基本上,您需要有2個迭代器。 當找到要刪除/插入元素的位置時,應在該對象之前引用該對象。 因為您無權訪問prev元素,而只能訪問下一個元素:假設我們的鏈接列表如下所示:
E0-> E1-> E2-> E3-> E4

如果要刪除E3,則需要在E2上設置迭代器,以便可以更正E2-> next的指針。

很好的參考書是Nicolai M. Josuttis撰寫的Standard Library一書。 您所遇到的問題在此處得到了廣泛描述。

node*insert(node*head,int d){

    node*temp=new node;
    temp->data=d;
    if(head==NULL){
        temp->next=NULL;
        head=temp;}
    else 
         {node*curr=head,*pre=NULL;
    while (curr!=NULL && curr->data<temp->data)
    {
        pre=curr;
        curr=curr->next;
    }
    temp->next=curr;
    if(pre==NULL)
        head=temp;
    pre->next=temp;
    }
    return head;
}

暫無
暫無

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

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