【问题描述】输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2
【输入形式】先输入整数的个数,再输入整数列。
【输出形式】以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。
【样例输入】5 3 1 2 4 5
【样例输出】1 2 3 4 5
【样例说明】输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。
【评分标准】根据输入的数据创建双向循环链表,并把原来部分有序的链表处理成有序的链表并输出。
#include
#include
using namespace std;
typedef struct DLnode
{
int data;
struct DLnode *prior;
struct DLnode *next;
}DLnode,*Dlnode;
void InitDlist(Dlnode &head) //循环双向初始化
{
head=(Dlnode)malloc(sizeof(DLnode));
head->prior=head;
head->next=head;
}
void InsertDlist(DLnode *head,int i) //头插法
{
Dlnode p=NULL;
p=(DLnode *)malloc(sizeof(DLnode));
p->data=i;
p->next=head->next;
p->next->prior=p;
p->prior=head;
head->next=p;
}
void PrintDlist(Dlnode head)
{
Dlnode p=head->next;
while(head!=p)
{
cout<data<<' ';
p=p->next;
}
cout<next;
while(p!=head)
{
len++;
p=p->next;
}
return len;
}
Dlnode Sort(Dlnode head) //形参返回值为头指针,形参也为头指针
{
int i=0,j=0;
int n=LengthDlist(head);//调用求长函数
Dlnode p=head;
Dlnode q=head;
//接下来进行冒泡排序
for(i=0;inext;
q=p->next;
for(j=0;jdata>q->data)
{
if(q->next==NULL) //判断是否是尾结点
{
p->next=q->next;
q->prior=p->prior;
q->next=p;
p->prior->next=q;
p->prior=q;
}
else
{
p->next=q->next;
q->prior=p->prior;
q->next=p;
p->prior->next=q;
//下一行与之前不同
q->next->prior=p;
p->prior=q;
//位置交换结束
q=p->next;//位置交换结束之后往后移
}
}
else //条件不成立
{
p=p->next;
q=p->next;
}
}
}
return head;
}
int main()
{
int n,i;
Dlnode head=NULL;
InitDlist(head);
cin>>n;
while(n--)
{
cin>>i;
InsertDlist(head,i);
}
Sort(head);
PrintDlist(head);
}