西南科技大学OJ题 双向链表的操作问题0960

双向链表的操作问题

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

输入

第一行:双向表的长度; 
第二行:链表中的数据元素。

输出

输出双向链表中的数据元素的值。

样例输入

10
2 4 6 3 5 8 10 21 12 9

样例输出

2 3 4 5 6 8 9 10 12 21

 

#include<stdio.h>
#include<malloc.h>
struct DLinkNode//双链表结点 
{
	int data;//储存数据 
	struct DLinkNode *prior;//储存前结点 
	struct DLinkNode *next;//储存后结点 
 };

void CreateList(struct DLinkNode *&head,int n)
{
	struct DLinkNode *p1,*p2;//声明p1,p2操作指针 
	head=p1=p2=(struct DLinkNode*)malloc(sizeof(DLinkNode));//申请空间,并且将head,p1,p2指向这个空间 
	scanf("%d",&p1->data);//输入第一个数据
	p1->prior=NULL;//设置第一个结点的前结点为空 
	for(int i=1;i<n;i++)//循环储存单链表第二个到最后的所有数据 
	{
		p2=(struct DLinkNode*)malloc(sizeof(DLinkNode));//申请一个新的空间,并且p2指向这个空间 
		p1->next=p2;//设置p1结点的后结点next 
		p2->prior=p1;//设置p2结点的前结点prior 
		p1=p2;
		scanf("%d",&p1->data);
	}
	p1->next=NULL;
}
int main()
{
	int n;
	struct DLinkNode *head,*p;
	scanf("%d",&n);
	CreateList(head,n);//创建链表 
	for(int i=0;i<n;i++)
	{
		p=head;
		while(p->next!=NULL)
		{
			if(p->data>p->next->data)//如果p结点的值大于p的后结点的值,则交换这个两个结点
			{
				if(p->prior!=NULL&&p->next->next!=NULL)//交换的两个结点在中间时 
				{
					struct DLinkNode *a,*b,*c,*d;
					a=p->prior;
					b=p;
					c=p->next;
					d=c->next;
					a->next=c;
					d->prior=b;
					c->prior=a;
					c->next=b;
					b->prior=c;
					b->next=d;
					p=c;//因为b和c交换了位置,所以p的指向要改变为当前位置 
				}
				else if(p->prior==NULL)//交换的结点为第一个和第二个时 
				{
					struct DLinkNode *a,*b,*c;
					a=p;
					b=p->next;
					c=p->next->next;
					c->prior=a;
					b->next=a;
					b->prior=NULL;
					a->next=c;
					a->prior=b;
					p=b;//因为 a和b交换了位置,所以p的指向要改变为当前位置 
					head=b;//因为改变了第一个结点位置,所以要更改头结点 
				}
				else if(p->next->next==NULL)//交换的结点为倒数第二和倒数第一时 
				{
					struct DLinkNode *a,*b,*c;
					a=p->prior;
					b=p;
					c=p->next;
					a->next=c;
					b->next=NULL;
					b->prior=c;
					c->prior=a;
					c->next=b;
					p=c;//因为 b和c交换了位置,所以p的指向要改变为当前位置 
				}
			}
			p=p->next;
		}
		
	}
	p=head;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
}


/* 
#include<stdio.h>
int main()
{
	int n,a[100];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n-1;j++)
		{
			if(a[j]>a[j+1])
			{
				int k=a[j];
				a[j]=a[j+1];
				a[j+1]=k;
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
}
*/ 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值