从键盘输入任意多个正整数,输入以-1结束。逆序输出这些整数(不包括-1)。
提示:
1、逆序创建单链表。结点数据域是整型数。每输入一个整数,向链表中插入一个结点。当输入-1时结束链表的创建。
2、遍历链表,输出结点数据域的值。
3、遍历完成后,要求销毁该链表。
输入格式:
任意多的正整数,输入序列以-1结束。
输出格式:
逆序输出这些整数(不包括-1)。
输入样例:
在这里给出一组输入。例如:
3 8 2 9 7 4 -1
输出样例:
在这里给出相应的输出。例如:
4 7 9 2 8 3
代码长度限制
16 KB
时间限制
500 ms
内存限制
64 MB
栈限制
8192 KB
解题思路如下:
首先,需要明确题目要求的功能是创建一个链表,然后允许用户输入一系列的数字,并将这些数字作为链表元素依次添加到链表的头部,且每次添加后链表都应该是反转的。最后,要能够显示链表的内容并在结束时销毁链表。
解题步骤如下:
- 定义链表结构:
- 使用
typedef
定义链表节点的数据类型Node
,包括一个数据域Data
和一个指向下一个节点的指针域Next
。 - 同时定义指向
Node
的指针类型List
,便于后续操作。
- 使用
- 创建空链表:
- 实现
Makeempty
函数,用于创建一个只有一个头节点的空链表。头节点不包含数据,只用来简化链表操作。
- 实现
- 添加元素并反转链表:
- 实现
ReversLinkList
函数,该函数接收链表头节点和一个新元素。 - 在函数内部,为新元素创建一个新节点,并将其插入到链表的头部。
- 由于每次插入都是在头部,所以每次插入都会导致链表反转。
- 实现
- 显示链表内容:
- 实现
DisplayLinkList
函数,遍历链表,从头节点后的第一个节点开始,打印每个节点的数据。
- 实现
- 销毁链表:
- 实现
DestroyLinkList
函数,遍历链表,逐个释放每个节点所占用的内存空间。 - 注意,需要从头节点的下一个节点开始释放,最后释放头节点本身。
- 实现
- 主函数流程:
- 在
main
函数中,首先调用Makeempty
创建一个空链表。 - 进入一个无限循环,不断读取用户输入的数字,直到输入-1为止。
- 对于每个输入的数字,调用
ReversLinkList
将其添加到链表头部,并反转链表。 - 调用
DisplayLinkList
显示当前链表的内容。 - 最后,调用
DestroyLinkList
销毁链表,释放内存。
- 在
具体代码如下:
#include<stdio.h>
#include<stdlib.h>
// 定义链表元素的类型为整型
typedef int ELemtype;
// 定义链表节点结构体
typedef struct Node {
ELemtype Data; // 节点数据
struct Node* Next; // 指向下一个节点的指针
}Node,*List;
// 创建一个空的链表
List Makeempty();
// 反转链表,并添加新元素X到链表头部
void ReversLinkList(List L, ELemtype X);
// 显示链表的内容
void DisplayLinkList(List L);
// 销毁链表,释放其占用的内存
void DestroyLinkList(List L);
int main() {
ELemtype n;
List L;
// 创建一个空的链表
L = Makeempty();
// 不断读取用户输入,直到输入-1为止
while (1) {
scanf("%d", &n);
if (n == -1) {
break;
}
else {
// 将新元素添加到链表头部,并反转链表
ReversLinkList(L, n);
}
}
// 显示链表的内容
DisplayLinkList(L);
printf("\n");
// 销毁链表
DestroyLinkList(L);
}
// 创建一个空的链表,并返回其头节点
List Makeempty() {
List newNode = (List)malloc(sizeof(struct Node));
if (newNode == NULL) {
exit(EXIT_FAILURE); // 内存分配失败,退出程序
}
newNode->Next = NULL; // 初始时,链表为空
return newNode;
}
// 反转链表,并添加新元素X到链表头部
void ReversLinkList(List L, ELemtype X) {
List list;
// 创建一个新的节点,其数据为X
list = Makeempty();
list->Data = X;
// 将新节点插入到原链表的头部,并反转链表
list->Next = L->Next;
L->Next = list;
}
// 显示链表的内容
void DisplayLinkList(List L) {
// 跳过头节点,从头节点的下一个节点开始显示
L = L->Next;
while (L != NULL) {
printf("%d ", L->Data); // 显示节点数据
L = L->Next; // 移动到下一个节点
}
}
// 销毁链表,释放其占用的内存
void DestroyLinkList(List L) {
List p, q;
p = L;
q = p->Next;
// 从链表的第二个节点开始,逐个释放节点
while (q != NULL) {
free(p);
p = q;
q = q->Next;
}
// 释放头节点
free(p);
}