簡體   English   中英

通過交換節點對雙鏈表進行排序

[英]Sorting doubly linked list by swapping nodes

我正在實現霍夫曼算法,為此,我使用了雙向鏈表。 實現需要對列表進行排序,但是僅交換數據是不夠的-我需要交換整個節點。 但是,事實證明這比我預期的要復雜一些。

我使用了選擇排序的這種變體,但它會導致訪問沖突錯誤。 我假設這是因為我正在嘗試訪問一些NULL指針,而這兩個條件本可以防止這種情況。

任何幫助或建議,將不勝感激。

void sortiraj()
{
    Node *curr = top, *nxt;
    for (int i = 0; i < num - 1; ++i)
    {
        nxt = curr->next;
        for (int j = i + 1; j < num; ++j)
        {
            if (curr->prob > nxt->prob)
            {
                //swap prev
                if (curr != top)
                {
                    Node *temp_prev = curr->prev;
                    curr->prev = nxt->prev;
                    nxt->prev = temp_prev;
                }

                //swap next
                if (nxt != last)
                {
                    Node *temp_next = curr->next;
                    curr->next = nxt->next;
                    nxt->next = temp_next;
                }
            }
            nxt = nxt->next;
        }
        curr = curr->next;
    }
}

如果當前節點是TOP節點,則仍然需要交換先前的指針。 這是因為您需要指示新頂部將其“先前指針”設置為NULL,而舊頂部將其“先前指針”設置為新頂部。

“下一個指針”也是如此。

您不需要條件即可交換上一個和下一個標志。 相反,您需要條件來指示頂部和最后一個節點已更改。

此外,交換時,您不能僅交換先前的指針。 這是因為,這意味着其中之一將指向自己。 正確的方法是這樣的

nxt->prev = curr->prev;
curr->prev = nxt;

交換下一個指針時同樣適用。

暫無
暫無

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

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