C语言编写一个程序,输入n(由用户输入)个10以内的数,每输入i(0≤≤9)就把它插到第i号队列中,最后把10个队中的非空队列按队列号从小到大的顺序串接成一条链,并输出该链中的所有元素。
时间: 2023-08-31 18:31:22 浏览: 100
### 回答1:
以下是 C 语言编写的程序,实现了上述功能:
```
#include <stdio.h>
#define MAX_N 10
#define MAX_M 10
struct Node {
int val;
struct Node *next;
};
int main() {
int n, i, j;
struct Node *head[MAX_M], *tail[MAX_M], *p, *q;
// 初始化队列头尾指针
for (i = 0; i < MAX_M; i++) {
head[i] = tail[i] = NULL;
}
// 输入 n 个数,插入到对应的队列中
printf("请输入 %d 个数:\n", n);
for (i = 0; i < n; i++) {
int x;
scanf("%d", &x);
if (x >= 0 && x <= 9) {
struct Node *node = (struct Node *) malloc(sizeof(struct Node));
node->val = x;
node->next = NULL;
if (head[x] == NULL) {
head[x] = tail[x] = node;
} else {
tail[x]->next = node;
tail[x] = node;
}
}
}
// 将非空队列按队列号从小到大串接成一条链
p = q = NULL;
for (i = 0; i < MAX_M; i++) {
if (head[i] != NULL) {
if (p == NULL) {
p = q = head[i];
} else {
q->next = head[i];
q = tail[i];
}
}
}
// 输出链中的所有元素
printf("链中的所有元素为:");
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
return 0;
}
```
注意:这段代码可能存在一些小错误,仅供参考。
### 回答2:
下面是用C语言编写的求解该问题的程序:
```c
#include <stdio.h>
#define MAX_N 10 // 最大队列数量
#define MAX_SIZE 10 // 每个队列的最大容量
typedef struct node {
int data;
struct node *next;
} Node;
void enqueue(Node *queue[], int index, int value) {
Node *newNode = malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (queue[index] == NULL) {
queue[index] = newNode;
} else {
Node *curr = queue[index];
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newNode;
}
}
void printQueue(Node *queue[], int index) {
Node *curr = queue[index];
while (curr != NULL) {
printf("%d ", curr->data);
curr = curr->next;
}
}
int main() {
int n;
printf("请输入n的值:");
scanf("%d", &n);
Node *queue[MAX_N] = {NULL}; // 用数组保存队列
for (int i = 0; i < n; i++) {
int num;
printf("请输入第%d个数:", i + 1);
scanf("%d", &num);
enqueue(queue, num, i);
}
for (int i = 0; i < MAX_N; i++) {
if (queue[i] != NULL) {
printQueue(queue, i);
}
}
return 0;
}
```
程序首先定义了一个Node结构体表示链表中的节点,其中包含了data和next两个成员变量。然后定义了一个enqueue函数用于向队列中插入元素。该函数首先判断队列中是否已经存在节点,如果队列为空,则直接将新节点插入队列头,如果队列不为空,则将新节点插入队列尾。然后定义了printQueue函数用于打印链表中的元素。接下来是主函数main,首先要求用户输入n的值,即要插入的数的个数。然后用一个数组queue保存10个队列的头节点,初始为空。接着进入一个循环,循环中要求用户输入每个数并插入相应的队列中。最后遍历10个队列,将非空队列的元素打印出来。
### 回答3:
下面是C语言编写的满足题意的程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 在第i号队列中插入元素
void insert(Node* queues[], int i, int num) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = num;
newNode->next = NULL;
if (queues[i] == NULL) {
queues[i] = newNode;
} else {
Node* current = queues[i];
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 输出链表中的所有元素
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
int n;
printf("请输入要输入的数的个数n: ");
scanf("%d", &n);
Node* queues[10] = { NULL }; // 申请10个队列
printf("请输入%d个10以内的数: ", n);
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
insert(queues, num, num); // 将每个数插入对应的队列
}
Node* head = NULL; // 链表头部
Node* tail = NULL; // 链表尾部
for (int i = 0; i < 10; i++) {
if (queues[i] != NULL) {
if (head == NULL) {
head = queues[i];
tail = queues[i];
} else {
tail->next = queues[i];
tail = queues[i];
}
}
}
printf("链中的所有元素为:");
printList(head); // 输出链表中的所有元素
return 0;
}
```
运行程序后,按照提示输入要输入的数的个数n以及n个10以内的数,程序将会按照每个数的值将其插入对应的队列中,并最终将非空队列按队列号从小到大的顺序连接成一条链表,并输出该链表中的所有元素。
阅读全文