双向链表的操作问题
建立一个长度为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]);
}
}
*/