当前位置: 首页 > news >正文

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

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

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

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

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

    int x;  // 用于存储用户输入的临时变量
    scanf("%d", &x);  // 2. 读取第一个输入值

    // 3. 头插法循环插入节点
    while(x != -1) {  // 当输入不是-1时继续循环
        // 3.1 创建新节点
        LNode *S = (LNode *)malloc(sizeof(LNode));  // 为新节点分配内存
        S -> data = x;       // 将输入值存入新节点的data域
        
        // 3.2 头插法关键操作
        S -> next = L -> next;  // 新节点指向原首节点(头结点的next)
        L -> next = 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_HeadInsert() {
    // 创建头结点(哨兵节点)
    LinkList L = (LNode*)malloc(sizeof(LNode));  // 分配头节点内存
    if (!L) exit(EXIT_FAILURE);  // 内存分配失败则退出程序
    L->next = NULL;              // 初始化头节点的next指针为NULL
    
    int x;  // 用于存储用户输入的临时变量
    printf("输入数字(-1结束): ");
    scanf("%d", &x);  // 读取第一个输入值
    
    // 处理直接输入-1的情况
    if (x == -1) {
        free(L);  // 释放刚创建的头节点
        return NULL;  // 返回空链表
    }

    // 头插法插入节点
    while (x != -1) {  // 当输入不是-1时循环
        LNode *s = (LNode*)malloc(sizeof(LNode));  // 创建新节点
        if (!s) exit(EXIT_FAILURE);  // 内存分配失败处理
        s->data = x;       // 将输入值存入新节点
        s->next = L->next; // 新节点指向原首节点(头插法关键步骤)
        L->next = s;       // 头结点指向新节点(完成插入)
        scanf("%d", &x);   // 读取下一个输入值
    }
    return L;  // 返回链表头指针
}

int main() {
    // 创建链表
    LinkList L = List_HeadInsert();
    
    // 打印链表
    LNode *p = L ? L->next : NULL;  // p指向第一个实际节点(跳过头结点)
    while (p) {  // 遍历链表直到NULL
        printf("%d ", p->data);  // 打印当前节点数据
        p = p->next;            // 移动到下一个节点
    }
    
    return 0;
}

输入/输出示例:

输入数字(-1结束): 3 5 2 -1
输出: 2 5 3  // 头插法导致逆序

示例执行流程:

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

在这里插入图片描述

相关文章:

  • Docker技术系列文章,第十篇——Docker 集群与编排(以 Kubernetes 为例)
  • mysql sql语句orderby,groupby优化
  • 电力物联网数据采集装置 高精度电能计量表
  • 手写数据库MYDB(一):项目启动效果展示和环境配置问题说明
  • 【蓝桥杯】算法笔记1
  • vue项目中播放ws(Websocket协议)视频流
  • AI时代的数据底座:火山引擎多模态数据湖的设计与实践
  • 英语不好,可以考取Oracle OCP认证吗?
  • 闭包、装饰器学习笔记(第二次学习)
  • 【老电脑翻新】华硕A456U(换电池+换固态+光驱换机械+重装系统+重装系统后开始菜单失灵问题解决)
  • 高质量思维链(CoT)数据助力Deepseek成为国产大模型之光
  • Maven 中 maven.test.skip 与skipTests 区别
  • 实战 | 基于 SpringBoot + UniApp 打造国际版打车系统:架构设计与性能优化全解析
  • 关于ArcGIS中加载影像数据,符号系统中渲染参数的解析
  • nccl的框架结构图 (来自deepseek)
  • QT学习笔记(进程与多线程)
  • 线程池详解:在SpringBoot中的最佳实践
  • 16个气象数据可视化网站整理分享
  • 安科瑞Acrel-2000ES储能能量管理为储能柜厂家赋能未来能源
  • 甘肃旅游服务平台+论文源码视频演示
  • 建设银行网站上改手机号码/上google必须翻墙吗
  • godaddy做网站/西安百度搜索排名
  • 河北集团网站建设/seo和sem的区别与联系
  • 视频上到什么地方可以做网站链接/重要新闻今天8条新闻
  • 上海公司牌照价格最新价格/seo博客教程
  • 建设政府信息资源共享网站/百色seo外包