带头节点的双链表排序

来源:互联网 发布:青少年网瘾数据2016年 编辑:程序博客网 时间:2024/04/30 05:19

(1)有头头插双链表排序

(思路:在原链表中逐个比较大小,将最小的插入新的链表(插入顺序按照尾插的顺序))

#include <stdio.h>#include <stdlib.h>typedef struct person{    int age;    struct person *pre;    struct person *next;}per;void head_list(per *one,int num)    //头插{    per *temp = (per *)malloc(sizeof(per));    temp->age = num;    per *head = one->next;    if(head)    {        head->pre = temp;        temp->next = head;    }    one->next = temp;   //取下一个}void show(per *head){    if(NULL == head)    {        return;    }    per *t = NULL;    while(head->next)    {        t = head->next;        printf("age is %d\n",head->next->age);        head = head->next;    }    printf("=======================\n");    while(t)    {        printf("age is %d\n",t->age);        t = t->pre;    }}void *sort(per *head){    if(NULL == head->next)    {        return;    }    if(NULL == head->next->next)    {        printf("min is head\n");        return;    }    per *min = head->next;    per *tmp = head->next;    per *new_list = NULL;    per *tail_sort = NULL;    while(head->next)    {        min = head->next;        tmp = head->next;        while(tmp->next)        {            if(min->age > tmp->next->age)            {                min = tmp->next;                min->pre = tmp;            }            tmp = tmp->next;        }        if(min == head->next)        {            head->next = min->next;        }        else            if(NULL == min->next)            {                min->pre->next = NULL;            }            else            {                min->pre->next = min->next;                min->next->pre = min->pre;            }//按尾插顺序组成新链表        min->pre = NULL;        min->next = NULL;        if(NULL == new_list)                {            tail_sort = min;            new_list = tail_sort;        }        else        {            tail_sort->next = min;            min->pre = tail_sort;            tail_sort = min;        }    }    head->next = new_list;  //因为是有头需要加上头    return new_list;}int main(){    int i = 0;    per head;    head.pre = NULL;    head.next = NULL;    while(i++ < 6)    {        head_list(&head,rand() % 100);    }    show(&head);    printf("===========after sort===========\n");    sort(&head);    show(&head);    return 0;}
(2)有头尾插双链表排序

(思路:在原链表中逐个比较大小,将最小的插入新的链表(插入顺序按照头插的顺序))

#include <stdio.h>#include <stdlib.h>typedef struct person{    int age;    struct person *pre;    struct person *next;}per;void tail_list(per *one, int num)   //尾插{    per *temp = (per *)malloc(sizeof(per));    temp->age = num;    per *head = one->next;    per *t = one->next;    while(one->next)    {        t = one->next;        one = one->next;    }    one->next = temp;    temp->pre = t;}void show(per *head)    //遍历打印{    if(NULL == head)    {        return;    }    per *t = NULL;    while(head->next)    {        t = head->next;        printf("age is %d\n",head->next->age);        head = head->next;    }    printf("==========================\n");    while(t)    {        printf("age is %d\n",t->age);        t = t->pre;    }}void *sort(per *head){    if(NULL == head->next)    {        return;    }    if(NULL == head->next->next)    {        printf("min is head\n");        return;    }    per *min = head->next;    per *tmp = head->next;    per *new_list = NULL;    while(head->next)    {        min = head->next;        tmp = head->next;        while(tmp->next)        {            if(min->age > tmp->next->age)            {                min = tmp->next;                min->pre = tmp;            }            tmp = tmp->next;        }        if(min == head->next)        {            head->next = min->next;        }        else            if(NULL == min->next)            {                min->pre->next = NULL;            }            else            {                min->pre->next = min->next;                min->next->pre = min->pre;            }//按头插顺序组成新链表        min->pre = NULL;        min->next = new_list;        if(NULL != new_list)        {            new_list->pre = min;        }        new_list = min;    }    head->next = new_list;  //因为是有头,需要加上头    return new_list;}int main(){    int i = 0;    per head;    head.pre = NULL;    head.next = NULL;    while(i++ < 6)    {        tail_list(&head,rand() %  100);     //rand()生成100以内的伪随机数    }    show(&head);    printf("========after sort=========\n");    sort(&head);    show(&head);    return 0;}