我已经用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。

07-24 09:46
查看更多