c - 冒泡排序链表

标签 c sorting linked-list bubble-sort

我已经用助手 swapper() 制定了一个排序函数。该函数按节点在内存中的地址降序(从最高地址到最低地址)对列表中的节点进行排序。

只要列表的头部不变,该函数就可以很好地排序,但是当头部发生变化时,返回的只是头部及其后面的内容。我在某个地方丢失了列表的其余部分,我无法弄清楚。

到目前为止我的功能:

void swapper(NODE *left, NODE *right)
{
    if(left->prev)
        left->prev->next = right;
    if(right->next)
        right->next->prev = left;

    left->next = right->next;
    right->prev = left->prev;

    right->next = left;
    left->prev = right;
}
NODE *sort_nodes(NODE *head)
{
    NODE *new_second, *new_first, *list = head;
    int swaps;
    do{
        swaps = 0;
        while(list)
        {
            if(&(*list) < &(*(list->next)))
            {
                swapper(list, list->next);
                swaps = 1;
            }
            list = list->next;
        }
        list = head;
    }while(swaps);
    return list;
}

如果列表的头部是列表中声明的第三个节点,则示例输出:

Unsorted: 0x93657050 -> 0x936570d0 -> 0x93657070 -> 0x93657090 -> 0x93657030 -> 0x936570b0 -> 0x93657010 -> NULL
Sorted:   0x93657050 -> 0x93657030 -> 0x93657010 -> NULL

最佳答案

想一想就很简单了。

你有

head -> A -> B

然后你在不改变头部的情况下交换 A 和 B,所以你得到

head -|
      v
 B -> A

如果交换头部元素,则需要将头部指针移动到新的头部。

关于c - 冒泡排序链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233766/

相关文章:

使用C编译DLL

c - Ubuntu 中有 gedit 的调试器吗?

python - 在 Python 中对混合列表进行排序

创建具有多种元素类型的链表

c - 我的链表代码有什么问题?

c - 带有 BIO API 的 OpenSSL EVP_aes_128_gcm

linux - Bash 对 CSV 大文件进行排序并将输出排序到单独的文件

c# - C# 数组中的 System.InvalidCastException 错误

c++ - 为什么这个 pop() 函数会产生段错误?

c - 这个错误是关于什么的?结构体、指针、动态内存分配,C