1、使用双向循环链表,实现自动插入数据并且对链表进行排序。
代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定义一个结构体
typedef struct node
{
int data;
struct node *prev;
struct node *next;
}node;
//初始化结构体
node *initialize(void)
{
node *new=malloc(sizeof(node));
if (new==NULL)
{
printf("malloc failure!");
return NULL;
}
new->data=0;
new->next=new;
new->prev=new;
return new;
}
// 将新节点插入到链表的尾部
void insertHead(node *head, node *new)
{
new->prev = head->prev;
head->prev->next = new;
head->prev = new;
new->next = head;
}
//打印数据
void display(node *head)
{
node *p;
//遍历打印
for(p = head->next; p != head; p=p->next)
{
printf("%d\t", p->data);
}
printf("\n");
}
//第一种排序
void sort_1(node *head)
{
node *p=NULL,*tmp=NULL;
int num;
//遍历进行判断然后排序
for (p = head->next; p != head->prev; p=p->next)
{
for(tmp= p->next; tmp != head; tmp=tmp->next)
{
if ((p->data) > (tmp->data))
{
num=p->data;
p->data=tmp->data;
tmp->data=num;
}
}
}
}
//第二种排序
void sort_2(node *head)
{
int i, j, len=0;
node *p=NULL, *tmp=NULL;
//计算个数
for(p = head->next; p != head; p=p->next)
{
len++;
}
//如果为空,直接返回
if(len == 0)
return;
//循环做判断,并做排序操作
for (i=0;i<(len-1);i++)
{
p = head->next;
for(j=0;j<(len-1-i);j++)
{
tmp= p->next;
if ((p->data) > (tmp->data))
{
p->next = tmp->next;
tmp->next->prev=p;
p->prev->next=tmp;
tmp->prev=p->prev;
tmp->next=p;
p->prev=tmp;
}
else
{
//如果不满足上面的if条件,就继续跟下一个比较
p=p->next;
}
}
}
}
int main()
{
//定义局部变量
int i,sum,data;
node *head,*new;
//初始化一个新的结构体
head=initialize();
//随机种子
srand((int)time(0));
for ( i = 0; i < 10; i++)
{
//初始化一个新的结构体
new=initialize();
//生成1-100之间的随机数
sum=(rand()%100+1);
//赋值
new->data=sum;
//插入
insertHead(head,new);
}
printf("排序前:");
display(head);
printf("排序后第一种:\n");
sort_1(head);
display(head);
printf("排序后第二种:\n");
sort_2(head);
display(head);
return 0;
}
运行结果: