#include <stdio.h>
#include <malloc.h>
typedef struct lnode
{
int data;
struct lnode *next;
struct lnode *prior;
}lnode;
void bul(lnode *&s)
{
lnode *p,*q;
s=(lnode *)malloc(sizeof(lnode));
s->prior=NULL;
p=q=(lnode *)malloc(sizeof(lnode));
int n=0;
printf("请输入数据,以-1作为结束标志:");
scanf("%d",&p->data);
while(p->data!=-1)
{
if(n==0)
{
n++;
s->next=p;
p->prior=s;
}
else
{
q->next=p;
p->prior=q;
}
q=p;
p=(lnode *)malloc(sizeof(lnode));
scanf("%d",&p->data);
}
q->next=NULL;
}
void print(lnode *&s)
{
lnode *p;
p=s->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
lnode *jh(lnode *&s)
{
int min,count;
lnode *p,*q,*mi,*h,*tmp;
q=h=(lnode *)malloc(sizeof(lnode));//开辟新表头
q->prior=h->prior=NULL;
p=s->next;
while(p)
{
min=p->data;//设置最小元素,放在这里是为了防止p为零时,p->date不存在,而出错。
mi=p;//初始mi
while(p)
{
if(min > p->data)//寻找最小元素,并保存其节点
{
min=p->data;
mi=p;
}
p=p->next;
}
mi->prior->next=mi->next;//将mi从旧链接中断开
if(mi->next)//mi->next可能为空
mi->next->prior=mi->prior;
q->next=mi;//插入到新的双向链表
mi->prior=q;
q=mi;
p=s->next;//设置新初始,开始下一次循环
}
q->next=NULL;
return h;
}
void main()
{
lnode *l,*head;
bul(l);
print(l);
head=jh(l);
print(head);
}
双向链表排序
最新推荐文章于 2021-11-24 22:20:51 发布