一个双向链表排序问题

一个双向链表排序问题:

题目:

建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。)

思路:
根据题目建立好该双向链表(尾插法),然后用个指针依次查找,先从第一个节点往后走,找出最大节点max,再将max和最后一个元素交换,第一遍结束(即奇数遍正向查找);第二遍,从最后一个节点开始倒着往前找,找到最小节点min,与第一个节点交换,第二遍结束(即偶数遍反向查找);第三遍,再从指针此刻的位置即第2个节点往后找,找到第二大节点,与倒数第二个节点交换;第四遍,倒着往前找,。。。。依次循环,做n-1次。

typedef int DataType;
typedef struct node
{
	DataType data;
	struct node *prior;//前域
	struct node *next;//后继
}Node;//双向链表的创建

void Create(Node *&L,DataType a[],int n)
{
	int i;
	Node *s,*r;
	L=(Node*)malloc(sizeof(Node));
	r=L;
	for(i=0;i<n;i++)
	{
		s=(Node*)malloc(sizeof(Node));
		s->data=a[i];
		r->next=s;
		s->prior=r;
		r=s;
	}
	r->next=NULL;	
}//尾插法创建双链表

void Sort(Node *&L,int n)//排序
{
	int i,j,temp;
	int count=n;
	Node *p=L; 
	Node *min,*max; 
	p=p->next;
	for(i=1;i<count;i++)
	{	
		if(i%2!=0)//第奇数遍反向
		{
			min=p;		
			for(j=0;j<n-1;j++)
			{
				p=p->next;
				if(p->data<min->data)
				{
					temp=min->data;
					min->data=p->data;
					p->data=temp;
				}
			}
			n--;
		}
		else//第偶数遍正向
		{
			max=p;
			for(j=1;j<n;j++)
			{
				p=p->prior;
				if(p->data>max->data)
				{
					temp=max->data;
					max->data=p->data;
					p->data=temp;
				}
			}
			n--;
		}
	}
}

//就是来回折返查找。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值