输入一个整数n,再输入n(n小于30000)个整数,按照输入的顺序建立单链表,并遍历所建立的单链表,输出这些数据。 输入格式 测试数据有多组,处理到文件尾。每组测试输入一个整数n,再输入n个整数。 输出格式 对于每组测试,输出顺序链表中的各结点的数据域的值(数据之间留一个空格)。 输入样例 在这里给出一组输入。例如: 5 1 2 3 4 5 输出样例 在这里给出相应的输出。例如: 5 4 3 2 1 用c解决并逐步解释
时间: 2025-03-22 19:01:00 浏览: 56
以下是用C语言实现的一个完整程序,它能够创建一个单向链表、插入节点,并逆序输出链表的内容。下面是详细的步骤及代码解释。
---
### **解决方案**
#### 1. 数据结构定义
我们需要先定义一个简单的链表节点 `struct` 来存储每个整数值以及指向下一个节点的指针。
```c
typedef struct Node {
int data; // 存储当前节点的数据
struct Node* next; // 指向下个节点的指针
} Node;
```
#### 2. 创建新节点函数
编写一个用于动态分配内存并初始化的新节点函数:
```c
Node* create_node(int value) {
Node* new_node = (Node*)malloc(sizeof(Node)); // 分配空间给新的节点
if (!new_node) { // 内存不足检查
printf("Memory allocation failed\n");
exit(1);
}
new_node->data = value; // 设置数据域
new_node->next = NULL; // 初始化指针为空
return new_node;
}
```
#### 3. 插入到头部
为了实现倒叙输出,每次读取数字时都将其作为头节点加入链表中:
```c
void insert_at_head(Node** head_ref, int value) {
Node* new_node = create_node(value); // 调用create_node()生成新节点
new_node->next = *head_ref; // 将原首节点赋值为新节点的下一节点
*head_ref = new_node; // 更新头指针至新节点位置
}
```
#### 4. 遍历链表打印内容
当所有元素都被添加完成后,需要从头部开始遍历整个列表直到遇到最后一个NULL结尾为止:
```c
void print_list(Node* node) {
while (node != NULL) { // 循环直至到达链表尾端(NULL)
printf("%d ", node->data); // 打印当前节点的数据
node = node->next; // 移动到下个节点继续操作
}
printf("\n"); // 最终换行结束输出
}
```
#### 5. 主体部分完成循环处理多组输入
完整的主函数如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 函数声明
Node* create_node(int value);
void insert_at_head(Node** head_ref, int value);
void print_list(Node* node);
int main(void){
int n,i,value;
while(scanf("%d",&n)!=EOF && n<30000){ // 处理每一组输入直到文件末尾
Node *head=NULL,*current;
for(i=0;i<n;i++){
scanf("%d",&value);
insert_at_head(&head,value); // 将每个数值按顺序插进链表前端形成反转效果
}
print_list(head); // 输出结果
// 清空链表释放资源避免泄露
current=head;
while(current!=NULL){
Node *temp=current;
current=current->next;
free(temp);
}
}
return 0;
}
// 创建新节点辅助函数
Node* create_node(int value) {
Node* new_node=(Node *) malloc(sizeof(Node));
new_node->data=value;
new_node->next=NULL;
return new_node;
}
// 在链表头部插入元素
void insert_at_head(Node** head_ref,int value){
Node* new_node=create_node(value);
new_node->next=*head_ref;
*head_ref=new_node;
}
// 打印链表中的全部数据项
void print_list(Node* node){
while(node!=NULL){
printf("%d ",node->data);
node=node->next;
}
putchar('\n');
}
```
以上就是该题目的解答过程。
---
### **逐步解析**
- 我们首先通过用户输入确定了有多少个数将被放入我们的单链表之中;
- 紧接着利用for loop逐一获取每一个具体数值;
- 使用自定义好的insert_at_head方法把刚刚得到的那个数字放置于我们已经构建好了的部分链表之前,从而达到反序的效果;
- 当所有的输入都已经妥善安排进了这个单一方向前进式的链条之后,最后一步便是依照指定格式准确无误地把这些储存起来的信息逐条呈现出来;
阅读全文
相关推荐












