【发布时间】:2017-11-11 02:32:52
【问题描述】:
我已经用一个 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
【问题讨论】:
-
if (&(*list) < ..很奇怪。为什么不只是if (list < ...)? -
我对您按 pointer 而不是存储在节点中的“值”排序的原因更感兴趣?这真的没有意义,因为指向节点的指针真的彼此没有关系,它们只是任意地址。这有什么要求?
-
我知道它们的地址确实没有任何价值,但无论如何我想按内存中的属性对它们进行排序。因此,为了获取 struct _Node (NODE) 的地址,我获取了解引用指针的地址。
-
至于解决问题的另一种可能方法:改为重新创建列表。 “弹出”(删除)列表中的第一个节点,使其成为新列表的头部。然后“弹出”下一个节点,并将其插入新列表中的正确位置。迭代直到没有更多节点。
标签: c sorting linked-list bubble-sort