我已经用助手 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,所以你得到 p>
head -|
v
B -> A
如果交换头部元素,则需要将头部指针移动到新的头部。
关于c - 冒泡排序链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233766/