2025-03-27 学习记录--C/C++-C语言 尾插法插入单链表

单链表的结构体定义,请查看我的另一篇文章

C语言 尾插法插入单链表 ⭐️

题目】采用尾插法在头指针为L处建立一个带头结点的单链表,输入-1表示结束,结果返回建立的单链表。

/**
 * 尾插法创建链表(输入-1终止)
 * @return LinkList 返回创建好的链表头指针
 */
LinkList list_TailInsert() {
    // 1. 创建头结点(哨兵节点)
    LinkList L = (LNode *)malloc(sizeof(LNode));  // 分配头节点内存空间
    L->next = NULL;  // 初始化头节点的next指针为空,表示空链表

    // 2. 初始化尾指针(开始时指向头结点)
    LNode *r = L;  // r指针用于跟踪链表当前尾节点
    
    int x;  // 用于存储用户输入的临时变量
    scanf("%d", &x);  // 读取第一个输入值
    
    // 3. 尾插法循环插入节点
    while(x != -1) {  // 当输入不是-1时继续循环
        // 3.1 创建新节点
        LNode *S = (LNode *)malloc(sizeof(LNode));  // 为新节点分配内存
        S->data = x;   // 将输入值存入新节点的data域
        S->next = NULL; // 新节点的next指针初始化为NULL
        
        // 3.2 尾插法关键操作
        r->next = S;  // 将新节点链接到当前尾节点后面
        r = S;       // 更新尾指针,使其指向新的尾节点
        
        scanf("%d", &x);  // 3.3 读取下一个输入值
    }
    
    return L;  // 4. 返回链表头指针
}

完整代码: 👇🏻

#include <stdio.h>   // 标准输入输出头文件
#include <stdlib.h>  // 标准库头文件(包含malloc和exit函数)

// 定义链表节点结构体
typedef struct LNode {
    int data;            // 节点数据域,存储整型数据
    struct LNode *next;  // 指向下一个节点的指针
} LNode, *LinkList;      // LNode是节点类型,LinkList是指向节点的指针类型

/**
 * 尾插法创建链表(输入-1终止)
 * @return 返回创建好的链表头指针
 */
LinkList list_TailInsert() {
    // 1. 创建头结点(哨兵节点)
    LinkList L = (LNode *)malloc(sizeof(LNode));  // 动态分配头节点内存
    if (!L) {  // 检查内存是否分配成功
        printf("内存分配失败!\n");
        exit(EXIT_FAILURE);  // 分配失败则退出程序
    }
    L->next = NULL;  // 初始化头节点的next指针为NULL,表示空链表

    // 2. 初始化尾指针(开始时指向头结点)
    LNode *r = L;  // r指针用于跟踪链表尾部

    int x;  // 用于存储用户输入的临时变量
    printf("请输入数字(输入-1结束): ");
    scanf("%d", &x);  // 读取第一个输入值

    // 3. 尾插法循环插入节点
    while (x != -1) {  // 当输入不是-1时继续循环
        // 3.1 创建新节点
        LNode *S = (LNode *)malloc(sizeof(LNode));  // 为新节点分配内存
        if (!S) {  // 检查内存是否分配成功
            printf("内存分配失败!\n");
            exit(EXIT_FAILURE);  // 分配失败则退出程序
        }
        S->data = x;      // 将输入值存入新节点的data域
        S->next = NULL;   // 新节点的next指针初始化为NULL

        // 3.2 将新节点链接到链表尾部
        r->next = S;  // 将新节点挂到当前尾节点后面
        r = S;        // 更新尾指针,使其指向新的尾节点

        scanf("%d", &x);  // 3.3 读取下一个输入值
    }

    return L;  // 返回链表头指针(包含头结点)
}

/**
 * 打印链表
 * @param L 链表头指针
 */
void printList(LinkList L) {
    LNode *p = L->next;  // p指向第一个实际节点(跳过头结点)
    while (p) {  // 遍历链表直到NULL
        printf("%d ", p->data);  // 打印当前节点数据
        p = p->next;            // 移动到下一个节点
    }
    printf("\n");  // 打印换行
}

int main() {
    // 创建链表
    LinkList L = list_TailInsert();  // 调用尾插法创建链表

    // 打印链表
    printf("创建的链表: ");
    printList(L);  // 调用打印函数

    return 0;  // 程序正常结束
}

输入/输出示例:

请输入数字(输入-1结束): 1 2 3 -1
创建的链表: 1 2 3 // 节点顺序与输入顺序一致

示例执行流程:

  • 输入:1 2 3 -1
    • 1、创建头结点L
    • 2、插入1:链表结构 头->1
    • 3、插入2:链表结构 头->1->2
    • 4、插入3:链表结构 头->1->2->3
    • 5、遇到-1结束
  • 输出:1 2 3(与输入顺序相同)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呀小萝卜儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值