C中按节点的int值对链表进行升序排序

zrfyljdw  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(91)

有史以来第一次使用链表。我试图得到一个函数,如标题所述,它按int值(val)对链表的节点进行排序。但是当函数被调用时,程序就把我晾在一边了。
给定我的简单节点结构:

struct node {
    int val;
    struct node* next;
};

这是我希望的函数:

void sort(struct node** head) {
    struct node* curr = *head;

    while (curr != NULL) {
        struct node* next = curr->next;
        while (next != NULL) {
            if(curr->val > next->val) {
                swap(&curr->val, &next->val);
                // next = next->next; 
            }
            next = next->next; // has to go here
        }
        curr = curr->next;
    }    
}

我承认这可能会让人感到困惑,我试图重复使用相同的逻辑,就像我必须对向量进行排序一样(比较每个项目,就像我有一个索引一样)。先谢谢你帮我。
编辑:开个玩笑,我刚刚注意到我错误地配置了第二个whilenext->next节点必须超出if条件

a64a0gku

a64a0gku1#

你的代码不能工作是有道理的,因为你正在做冒泡排序,这并不能保证列表通过列表,数组或数组来排序。一次
要对一个链表进行排序,你应该这样做:

void sortList(node** head)
{
    // Initialize previous and current
    // nodes
    node* prev = (*head);
    node* curr = (*head)->next;

    // Traverse list
    while (curr != NULL)
    {
        // If curr is smaller than prev,
        // Then it must be moved to head
        if (curr->val < prev->val)
        {
            // Detach curr from the linked list
            prev->next = curr->next;

            // Move the current node to begin
            curr->next = (*head);
            (*head) = curr;

            // Update current
            curr = prev;
        }

        // Nothing to do if current
        // element is at the right place
        else
            prev = curr;

        // Move current
        curr = curr->next;
    }
}

相关问题