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

标签 c swap doubly-linked-list

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

我使用了这种选择排序的变体,但它会导致访问冲突错误。我假设这是因为我正在尝试访问一些 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;

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

关于c - 通过交换节点对双向链表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962854/

相关文章:

c++ - 将数据从 C 进程传递到 C++ 进程

c - stdlib.h、stdio.h 中所有函数和常量的引用?

java - 如何交换 map 中的两个键

c - 如果在冒泡排序程序中输入偶数个整数,则在中间插入一个随机数

java - 在 Java 中的双向链表上设置头部和尾部引用真的会从内存中清除它吗?

python - Leetcode 426.将二叉搜索树转换为有序双向链表?

c - while 循环中的增量不起作用?

c - 获取总线错误 : 10 when looping through a string array

linux - 最近需要一个内存文件交换算法

c - 在双向链表的末尾插入节点