Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链表的特定排序_C_Sorting_Linked List - Fatal编程技术网

C 链表的特定排序

C 链表的特定排序,c,sorting,linked-list,C,Sorting,Linked List,我必须以特定的方式对我的链表进行排序,例如,我有这样的链表:3->1->4->1->7->5->7。它必须按如下方式排序:7->1->7->1->3->4->5。所以据我所知,我必须在列表中找到max元素,并在开始处添加它,然后从当前列表中删除这样的元素,我很好奇是否有任何方法可以将列表中间元素的位置交换到列表的开始处。或者我必须删除这样的元素,用给定的数据分配内存,并在开始时添加它?总的来说,这是编程类测试的任务,必须使用单链表来完成。这里有一种方法:给定一个未排序的列表p: 创建一个列表Q

我必须以特定的方式对我的链表进行排序,例如,我有这样的链表:3->1->4->1->7->5->7。它必须按如下方式排序:7->1->7->1->3->4->5。所以据我所知,我必须在列表中找到max元素,并在开始处添加它,然后从当前列表中删除这样的元素,我很好奇是否有任何方法可以将列表中间元素的位置交换到列表的开始处。或者我必须删除这样的元素,用给定的数据分配内存,并在开始时添加它?总的来说,这是编程类测试的任务,必须使用单链表来完成。

这里有一种方法:给定一个未排序的列表
p

  • 创建一个列表
    Q
  • max(P)
    附加到
    Q
  • P
    中删除
    max(P)
  • min(P)
    附加到
    Q
  • P
    中删除
    min(P)
  • 再次重复步骤2至5
  • 按升序排序
    P
  • P
    附加到
    Q
  • Q
    现在是您的排序列表


    此方法假定
    p
    的长度不小于4。

    如果有指向列表节点指针的指针,即
    指针和节点的
    下一个
    指针,则可以交换单链接列表中的节点。您可以这样做,因为您必须遍历列表才能找到最大值。(请小心选择最后一个最大值,否则对该函数的子Qnet调用会将相同的
    7
    带到前面。)


    请注意,
    pv
    如何始终包含您到达当前节点的节点指针的地址,
    nd
    ,以便您可以对其进行更新
    mp
    只是具有最大值的节点的指针地址。

    我仍然不知道排序背后的逻辑是什么。您的问题不清楚,请给出具体细节。您只能在双链接列表中交换元素,因为即使您交换需要交换的节点的指针,您正在运行前一个节点的
    ->next
    。你能做的就是交换节点的
    数据。这类似于我在测试中得到的任务,我必须以这样的方式对数字进行排序:最大,最小,最大,最小,其余的数字。我在想怎么做。所以,唯一的方法是删除列表中找到的最小/最大元素,并将其添加到开始时,将其设置为新的头,并且仍然保留在列表的某个旧头位置?如果您引用任务本身,这将非常有用。你需要对数字进行排序吗?你为什么要为演习选择一个链接列表?是否允许使用双链接列表?你能写一个通用函数(比如标准算法的
    qsort()
    )来交换所需的节点或数据(根据需要和能力)吗?你只需要给他提供一个比较算法。我想这会起作用,因为我正在处理任务中给定的不少于8的预制数字列表,谢谢。
    void max_to_front(struct node **head)
    {
        struct node **mp = head;    // current max pointer address
        struct node **pv = head;    // iterator pointer address
        struct node *nd = *head;    // iterator pointer
        int mx;
    
        // nothing to do for empty or single-node lists
        if (*head == NULL || (*head)->next == NULL) return;
    
        // find maximum
        mx = nd->value;
        while (nd) {
            if (nd->value >= mx) {
                mp = pv;
                mx = nd->value;
            }
            pv = &nd->next;
            nd = nd->next;
        }
    
        // move max to the front, i.e.  update the pointers
        nd = *mp;
        *mp = (*mp)->next;
        nd->next = *head;
        *head = nd;
    }