簡體   English   中英

C ++按排序順序添加到鏈接列表

[英]C++ Add to linked list in sorted order

嗨我有一個使用結構的鏈表。 現在我得到它在最后添加每個元素。 但是,我想根據ID按排序順序添加每個元素。 該結構有兩個元素:字符串名稱和長ID。

node* temp = new node;
temp->name = nameRead;
temp->id = idRead;

//check if first item, if so add as head
if(head == NULL)
{
    head = temp;
}
else
{
   node* temp2 = head;
   while(temp2->next != NULL)
   {
      temp2 = temp2->next;
   }
   temp2->next = temp;
}
node* temp = new node;
temp->name = nameRead;
temp->id = idRead;

node* temp2 = head;
node** temp3 = &head;
while(temp2 != null && temp2->id < temp->id)
{
   temp3 = &temp2->next;
   temp2 = temp2->next;
}
*temp3 = temp;
temp->next = temp2;

編輯:說明:'temp3'指針指向'temp'需要去的地方。 將temp2初始化為head,並保持循環直到我們到達列表的末尾,或者直到temp2的id> = temp而不是temp的id。 在循環的每次迭代中,前進temp3和temp2。

在循環結束時,'temp3'將保存指針所在的地址。 因此,指定* temp3指向temp,並指定temp-> next指向temp2(此時它將為null,或者指向id大於temp-> id的項目)。

取自我的學生筆記本:

void addSorted(node * head, int id){
        node* newNode = new node;
        newNode->number = n;
        newNode->next = NULL;

        if(head == NULL || head->number >= id   ){
            newNode->next = head;
            head = newNode;
            return;
        }else if(head->next != NULL && head->next->id >= id){
            node * nextNode = head->next;
            newNode->next = nextNode;
            head->next = newNode;
            return;
        }else{
            node * left;
            node * right = head;
            while(right != NULL && right->next->id <= id){
                left = right;
                right = right->next;
            }
            left->next=newNode;
            newNode->next = right;
        }
    }

對代碼的大多數修改都非常簡單 - 只需添加基於ID的比較,這樣您只需遍歷列表,直到您到達ID大於您需要插入的新節點(或到達終點)列表)。

事情變得有點棘手:在你“意識到”你已經到達列表中的正確位置之前,你已經走了一個節點太遠了(在單鏈表中,沒有辦法回去)。 修復它的技巧非常簡單:分配一個新的(空)節點並在找到的太大的節點之后插入它。 將太大的節點內容復制到剛剛插入的新節點中,然后將新節點的數據復制到剛剛騰出的位置。

但是,我應該補充一點,所有這些都是一個有爭議的問題。 如果你想要一個有序的項目集合,鏈表往往是一個非常糟糕的選擇。 除非你做了類似家庭作業的事情,你別無選擇,只能做任何已被分配的腦死亡廢話,查找std::set [編輯:或std::multiset ,如果允許重復 - 或者可能std::mapstd::multimap ,如果你想能夠找到一個基於ID的節點]而忘記自己實現它。

暫無
暫無

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

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