题目描述
建立一个长度为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>
#define MaxSize 1000
typedef struct DNode
{
int data;
struct DNode *prior;
struct DNode *next;
}DLinkNode;
void Create(DLinkNode*&L,int a[],int n)//尾插法
{
DLinkNode*r,*s;
L=(DLinkNode*)malloc(sizeof(DLinkNode));
r=L;
for(int i=0;i<n;i++)
{
s=(DLinkNode*)malloc(sizeof(DLinkNode));
s->data=a[i];
r->next=s;s->prior=r;
r=s;
}
r->next=NULL;
}
void Sort(DLinkNode*&L)//其实就是选择排序
{
DLinkNode *p=L->next;//p为当前访问结点
DLinkNode *q;//q为p的后一个结点
DLinkNode *flag;//找到最小值,记录地址为flag
int MIN;//存每次查找到的最小值
while(p!=NULL)//从头开始
{
bool sign=false;//默认没找到
MIN=p->data;//假设当前结点数最小
q=p->next;//从p的后一结点开始
while(q!=NULL)
{
if(q->data<MIN)//找到最小数,更新
{
flag=q;//记录最小数的地址
sign=true;//标记找到了
MIN=q->data;//更新最小数
}
q=q->next;//往后继续,看是否有更小数
}
if(sign)//如果找到,仅交换数即可,无需交换位置
{
flag->data=p->data;//flag结点的数变为p结点的数
p->data=MIN;//p结点的数变为最小数
//这样最小的数就排在前面了
}
p=p->next;//p结点后移一位,接着查找
}
}
void display(DLinkNode*L)
{
DLinkNode *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
int n,a[MaxSize];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
DLinkNode*L;
Create(L,a,n);//尾插法建表,书55页
Sort(L);//排序
display(L);//打表
}