7 单链表的创建,遍历与销毁

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

解题思路如下:

首先,需要明确题目要求的功能是创建一个链表,然后允许用户输入一系列的数字,并将这些数字作为链表元素依次添加到链表的头部,且每次添加后链表都应该是反转的。最后,要能够显示链表的内容并在结束时销毁链表。

解题步骤如下:

  1. 定义链表结构
    • 使用typedef定义链表节点的数据类型Node,包括一个数据域Data和一个指向下一个节点的指针域Next
    • 同时定义指向Node的指针类型List,便于后续操作。
  2. 创建空链表
    • 实现Makeempty函数,用于创建一个只有一个头节点的空链表。头节点不包含数据,只用来简化链表操作。
  3. 添加元素并反转链表
    • 实现ReversLinkList函数,该函数接收链表头节点和一个新元素。
    • 在函数内部,为新元素创建一个新节点,并将其插入到链表的头部。
    • 由于每次插入都是在头部,所以每次插入都会导致链表反转。
  4. 显示链表内容
    • 实现DisplayLinkList函数,遍历链表,从头节点后的第一个节点开始,打印每个节点的数据。
  5. 销毁链表
    • 实现DestroyLinkList函数,遍历链表,逐个释放每个节点所占用的内存空间。
    • 注意,需要从头节点的下一个节点开始释放,最后释放头节点本身。
  6. 主函数流程
    • 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);  
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值