Sorting a linked list in C

前端 未结 5 1477
北恋
北恋 2020-12-09 23:01

I\'m trying to sort a linked list by finding the largest value, deleting it from its position, and then inserting it at the top of the list.

The difficulty I\'m runn

5条回答
  •  猫巷女王i
    2020-12-09 23:56

    Here is my attempt to sort a singly linked list using QuickSort algorithm. If you know n then run time will be O(n log n). Check if this helps.

    #include "malloc.h"
    
    typedef struct node {
        struct node *next;
        int val;
    } node;
    
    bool insert_node(struct node **head, int val)
    {
        struct node *elem;
        elem = (struct node *)malloc(sizeof(struct node));
        if (!elem)
            return false;
        elem->val = val;
        elem->next = *head;
        *head = elem;
        return true;
    }
    
    int get_lval(struct node *head, int l)
    {
        while(head && l) {
            head = head->next;
            l--;
        }
        if (head != NULL)
            return head->val;
        else
            return -1;
    }
    
    void swap(struct node *head, int i, int j)
    {
        struct node *tmp = head;
        int tmpival;
        int tmpjval;
        int ti = i;
        while(tmp && i) {
            i--;
            tmp = tmp->next;
        }
        tmpival = tmp->val;
        tmp = head;
        while(tmp && j) {
            j--;
            tmp = tmp->next;
        }
        tmpjval = tmp->val;
        tmp->val = tmpival;
        tmp = head;
        i = ti;
        while(tmp && i) {
            i--;
            tmp = tmp->next;
        }
        tmp->val = tmpjval;
    }
    
    
    struct node *Quick_Sort_List(struct node *head, int l, int r)
    {
        int i, j;
        int jval;
        int pivot;
        i = l + 1;
        if (l + 1 < r) {
            pivot = get_lval(head, l);
            printf("Pivot = %d\n", pivot);
            for (j = l + 1; j <= r; j++) {
                jval = get_lval(head, j);
                if (jval < pivot && jval != -1) {
                    swap(head, i, j);
                    i++;
                }
            }
            swap(head, i - 1, l);
            Quick_Sort_List(head, l, i);
            Quick_Sort_List(head, i, r);
        }
        return head;
    }
    
    struct node *Sort_linkedlist(struct node *head)
    {
        struct node *tmp = head;
        // Using Quick sort.
        int n = 0;
    
        while (tmp) {
            n++;
            tmp = tmp->next;
        }
        printf("n = %d\n", n);
        head = Quick_Sort_List(head, 0, n);
        return head;
    }
    
    void print_list(struct node *head)
    {
        while(head) {
            printf("%d->", head->val);
            head = head->next;
        }
        printf("\n");
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        struct node *head = NULL;
        struct node *shead = NULL;
    
        insert_node(&head, 10);
        insert_node(&head, 12);
        insert_node(&head, 9);
        insert_node(&head, 11);
        insert_node(&head, 7);
        insert_node(&head, 1);
        insert_node(&head, 3);
        insert_node(&head, 8);
        insert_node(&head, 5);
        insert_node(&head, 2);
        insert_node(&head, 4);
        insert_node(&head, 6);
        print_list(head);
    
        shead = Sort_linkedlist(head);
        print_list(shead);
    
        return 0;
    }
    

提交回复
热议问题