从键盘输入任意多个正整数,输入以-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);
}