一、问题
【问题描述】输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2<a3<…<an) (ai为第i个整数)。试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。
【输入形式】先输入整数的个数,再输入整数列。
【输出形式】以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。
【样例输入】5 3 1 2 4 5
【样例输出】1 2 3 4 5
【样例说明】输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。
二、代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct DNode
{
int num;
DNode *prior,*next;
};
DNode *creatList(int n)
{
DNode *head=NULL,*pend,*pnew;
while (n--)
{
pnew=new DNode;
cin>>pnew->num;
pnew->next=NULL;
if(head==NULL)
{
head=pnew;
pend=head;
}
else
{
pend->next=pnew;
pnew->prior=pend;
pend=pnew;
}
}
return head;
}
DNode *insertList(DNode *head)
{
DNode *p=head,*q=head->next;
if(p->num>q->num)
{
while(p->num>q->num)
{
if(q->next==NULL) break;
q=q->next;
}
DNode *c=q->prior;//保证结点不丢失
//两种可能所以是if和else关系
if(p->num<=q->num)
{
head=head->next;
c->next=p;
p->prior=c;
p->next=q;
q->prior=p;
}
else if(q->next==NULL)
{
head=head->next;
q->next=p;
p->prior=q;
p->next=NULL;
}
}
return head;
}
void showList(DNode *&head)
{
DNode *h=head;
while(h!=NULL)
{
cout<<h->num<<" ";
h=h->next;
}
cout<<endl;
}
int main()
{
int num;
cin>>num;
DNode *L;
L=creatList(num);
L=insertList(L);
showList(L);
}