用c语言写程序,【问题描述】输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2<a3<...<an) (ai为第i个整数)。试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。 【输入形式】先输入整数的个数,再输入整数列。 【输出形式】以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。 【样例输入】5 3 1 2 4 5 【样例输出】1 2 3 4 5 【样例说明】输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。 【评分标准】根据输入的数据创建双向循环链表,并把原来部分有序的链表处理成有序的链表并输出。
时间: 2024-02-13 16:00:48 浏览: 86
以下是使用C语言编写的程序,实现了输入n个整数,创建一个双向循环链表进行存储,并按递增顺序输出链表中的整数:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义双向循环链表结构体
typedef struct Node {
int data; // 数据域
struct Node *prior; // 指向前驱结点的指针
struct Node *next; // 指向后继结点的指针
} Node, *LinkedList;
// 创建双向循环链表
LinkedList createLinkedList(int n) {
LinkedList L = (LinkedList) malloc(sizeof(Node)); // 创建头结点
L->prior = L->next = L; // 头结点的前驱和后继都指向自身
Node *p = L; // 定义指向当前结点的指针
for (int i = 1; i <= n; i++) {
Node *newNode = (Node *) malloc(sizeof(Node)); // 创建新结点
scanf("%d", &newNode->data); // 输入结点的数据域
newNode->prior = p; // 新结点的前驱指向当前结点
newNode->next = L; // 新结点的后继指向头结点
p->next = newNode; // 当前结点的后继指向新结点
L->prior = newNode; // 头结点的前驱指向新结点
p = newNode; // 当前结点指向新结点
}
return L;
}
// 将第一个结点删除并插入链表中的适当位置,使整个链表递增有序
void insertNode(LinkedList L) {
Node *p = L->next; // 定义指向第一个结点的指针
L->next = p->next; // 头结点的后继指向第二个结点
p->next->prior = L; // 第二个结点的前驱指向头结点
Node *q = L->next; // 定义指向当前结点的指针
while (q != L && p->data > q->data) { // 找到第一个数据域大于等于p->data的结点q
q = q->next;
}
// 将p插入到q的前面
p->next = q;
p->prior = q->prior;
q->prior->next = p;
q->prior = p;
}
// 输出双向循环链表中的数据
void printLinkedList(LinkedList L) {
Node *p = L->next; // 定义指向第一个结点的指针
while (p != L) { // 遍历整个链表
printf("%d ", p->data);
p = p->next;
}
}
int main() {
int n;
scanf("%d", &n); // 输入整数的个数
LinkedList L = createLinkedList(n); // 创建双向循环链表
insertNode(L); // 将第一个结点删除并插入链表中的适当位置,使整个链表递增有序
printLinkedList(L); // 输出双向循环链表中的数据
return 0;
}
```
使用样例:
输入:
```
5
3 1 2 4 5
```
输出:
```
1 2 3 4 5
```
阅读全文