【问题描述】输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2<a3<…<an) (ai为第i个整数)。试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。
【输入形式】先输入整数的个数,再输入整数列。
【输出形式】以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。
【样例输入】5 3 1 2 4 5
【样例输出】1 2 3 4 5
【样例说明】输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。
【评分标准】根据输入的数据创建双向循环链表,并把原来部分有序的链表处理成有序的链表并输出。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#include<string.h>
struct Node{
int data;
struct Node *pre,*next;
};
Node* create(int x)
{
Node *L,*s,*r;
int temp,i;
L=(Node*)malloc(sizeof(Node));
L->next=NULL;
r=L;
for(i=1;i<=x;i++)
{ scanf("%d",&temp);
s=(Node*)malloc(sizeof(Node));
s->data=temp;
r->next=s;
r=s;
}
r->next=L;
return L;
}
void show(Node* &L)
{ Node *p;
p=L->next;
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
Node* Insert(Node* &L,int pos,int x)
{
int k=0;
Node* p=L->next;
Node *s;
while(p!=L&&k<pos-1)
{
p=p->next;
k++;
}
s=(Node*)malloc(sizeof(Node));
s->data=x;
s->pre=p;
s->next=p->next;
p->next=s;
return L;
}
Node* Delete(Node* &L,int pos)
{
int k=0;
Node *p=L;
while(p->next!=L&&k<pos)
{
p=p->next;
k++;
}
L->next=p->next;
p->next->pre=L;
return L;
}
Node* s_ort(Node* &L)
{
int i=1;
Node *p,*q;
p=L->next;
q=L->next->next;
while(q!=L&&p->data>q->data)
{
q=q->next;
i++;
}
L=Insert(L,i,p->data);
return L;
}
int main()
{
int a;
Node *L;
scanf("%d",&a);
L=create(a);
L=s_ort(L);
L=Delete(L,1);
show(L);
}