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