我已经用helper 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
如果交换head元素,则需要将head指针移动到新的head。