通过交换节点对双向链表进行排序

时间:2014-11-16 22:35:18

标签: c swap doubly-linked-list

我正在实施霍夫曼的算法,为此我使用了一个双向链表。实现需要对列表进行排序,但简单地交换数据还不够 - 我需要交换整个节点。然而,事实证明这比我预期的要复杂一些。

我使用了这种选择排序的变体,但它会导致访问冲突错误。我假设它是因为我试图访问一些空指针,这两个条件应该阻止。

任何帮助或建议都将不胜感激。

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;
    }
}

1 个答案:

答案 0 :(得分:2)

如果当前节点是TOP节点,则仍需要交换先前的指针。这是因为你需要指出新顶部的“previous pointer”设置为NULL,而旧顶部的“previous指针”设置为新顶部。

“下一个指针”也是如此。

您不需要条件来交换上一个和下一个标志。您需要条件来指示顶部和最后一个节点已更改。

此外,在交换时,您不能只交换先前的指针。这是因为,这意味着他们中的一个将指向自己。正确的方法就是这样

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

交换下一个指针时同样适用。