【问题描述】
输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2<a3<...<an) (ai为第i个整数)。
试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。
【输入形式】
先输入整数的个数,再输入整数列。
【输出形式】
以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。
【样例输入】
5 3 1 2 4 5
【样例输出】
1 2 3 4 5
【样例说明】
输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。
【评分标准】
根据输入的数据创建双向循环链表,并把原来部分有序的链表处理成有序的链表并输出。
题解:
#include<stdio.h>
#include<stdlib.h>
typedef struct DoubleList
{
int data;
DoubleList* next;
DoubleList *pre;
}doubleLIst;
int main()
{
DoubleList* head = (DoubleList*)malloc(sizeof(DoubleList));
head->next = head;
head->pre = head;
DoubleList* p =head, *p1 = head,*p2 = head;
int n;
scanf("%d", &n);
int i = 0, j;
for (i = 0; i < n; i++)
{
p1 = (DoubleList*)malloc(sizeof(DoubleList));
scanf("%d", &j);
p1->data = j;
p2->next = p1;
p1->pre = p2;
head->pre = p1;
p2 = p1;
p1->next = head;
}
p1 = p2 = head->next;
for (p = head->next->next, i = 0; p != head; p = p->next, i++)
{
if (p->data > head->next->data)
break;
}
p = p->pre;
if (i != 0)
{
head->next = head->next->next;
head->next->next->pre = head;
p->next->pre = p1;
p1->next = p->next;
p->next = p1;
p1->pre = p;
}
for (p = head->next; p != head; p = p->next)
{
printf("%d ", p->data);
}
}