单链表排序

从大到小排序.
链表带头结点, 链表不动, 只对链表里的值进行排序.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct list {
    int data;
    struct list *next;
};
typedef struct list s_list;
typedef struct list *p_list;

void getRandomList (p_list p, int n); // 为p随机赋n个值
void printList (p_list phead); // 打印phead
void del (p_list p, int pos); // 删除p中第pos个节点
void swap (int *x, int *y); // 交换两个变量的值
int getLength (p_list p); // 得到p的长度
void order (p_list p); // 对p进行排序

int main () {
    int n = 10; // 链表初始值个数
    p_list head = (s_list*)malloc(sizeof(s_list));
    head->next = NULL;

    // 随机赋值
    getRandomList(head, n);
    printList(head);

    order(head);
    printList(head);

    return 0;
}

// 参数: p为链表头结点, n是需要赋值的个数
void getRandomList (p_list p, int n) {
    int i = 0;
    p_list temp;
    srand(time(0));

    while (n) {
        temp = (s_list*)malloc(sizeof(s_list));
        temp->data = rand() % 150 + 1; // data in [1, 150]
        temp->next = p->next;
        p->next = temp;
        n--;
    }
}

// 参数: phead为链表的头结点
void printList (p_list phead) {
    p_list p;
    int length = 0;
    p = phead->next;
    while (p != NULL) {
        printf("%6d", p->data);
        p = p->next;
        length++;
    }
    printf("---Length: %d\n", length);
}

// 删除操作
// 参数: p是要删除链表的头结点, pos是删除的位置
void del (p_list p, int pos) {
    p_list pre = (s_list*)malloc(sizeof(s_list)); // 要删节点的前一个
    p_list cur = (s_list*)malloc(sizeof(s_list)); // 要删的节点
    int count = 1;
    pre = p;

    while (count < pos) {
        pre = pre->next;
        count++;
    }
    cur = pre->next;
    pre->next = cur->next;
    free(cur);
}

void swap (int *x, int *y) {
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

// 对链表进行从大到小排序
// 参数: p要排序的链表
void order (p_list p) {
    p_list temp = (s_list*)malloc(sizeof(s_list));
    int n = getLength(p); // 链表长度
    int i;
    int j;

    /*  假如n=5, 也就是单链表中有5个元素需要排序
        通过分析, 我们需要的是双层循环. 我需要变量像下面这样变化
        i = 4, j = 4
        i = 4, j = 3
        i = 4, j = 2
        i = 4, j = 1

        i = 3, j = 3
        i = 3, j = 2
        i = 3, j = 1

        i = 2, j = 2
        i = 2, j = 1

        i = 1, j = 1
        我下面的循环, 就是为了实现如上所述的效果.
    */
    n = n - 1;
    for (i=n; i>=1; i--) {
        temp = p->next;
        for (j=i; j>=1; j--) {
            // printf("i = %d, j = %d\n", i ,j);
            if (temp->data < temp->next->data) {
                swap(&temp->data, &temp->next->data);
            }
            temp = temp->next;
        }
    }
}

int getLength (p_list p) {
    p_list temp = (s_list*)malloc(sizeof(s_list));
    int length = 0;
    temp = p->next;
    while (temp) {
        temp = temp->next;
        length++;
    }
    return length;
}
posted @ 2017-10-08 11:49  阿胜4K  阅读(179)  评论(0编辑  收藏  举报