(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;
}