《C++》解密--单链表

《C++》解密--单链表

目录

一、概念与结构

二、实现单链表

三、链表的分类

四、单链表算法题


一、概念与结构

        1、节点

          结点的组成主要有:当前结点要保存的数据和保存下一个节点的地址(指针变量)

        图中指针变量plist保存的是第一个结点的地址,我们称plist此时“指向”第一个结点。

        链表中每个结点都是独立申请的(如果需要插入数据时才去申请一块结点的空间),我们需            要通过指针变量来保存下一个结点位置才能从当前结点找到下一个结点。

        2、链表的性质

【链表机构在逻辑上是连续的,在物理结构上不一定连续。

【结点一般是从堆上申请的。

【从堆上申请来的空间,是按照一定策略分配出来的,每次申请的空间可能连续,可能不连续。

  

二、实现单链表

 1、创立文件

 2、定义链表的结构

【SList.h】
//定义链表(结点)的位置 typedef int SLTDataType; typedef struct SListNode { SLTDataType data; struct SListNode* next; }SLTNode; void SLTPrint(SLTNode* phead);

3、打印函数

【SList.h】
//打印函数 void SLTPrint(SLTNode* phead);
【SList.c】
//打印函数 void SLTPrint(SLTNode* phead) { SLTNode* pcur = phead; while (pcur) { printf("%d->", pcur->data); pcur = pcur->next; } printf("NULL\n"); }
【test.c】
//创建一个链表,并且打印链表 void createSList() { SLTNode* node1 = (SLTNode*)malloc(sizeof(SLTNode)); node1->data = 1; SLTNode* node2 = (SLTNode*)malloc(sizeof(SLTNode)); node1->data = 2; SLTNode* node3 = (SLTNode*)malloc(sizeof(SLTNode)); node1->data = 3; SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode)); node1->data = 4; node1->next = node2; node2->next = node3; node3->next = node4; node4->next = NULL; //第一个结点的地址作为参数传递过去 SLTNode* plist = node1; SLTPrint(node1); }

4、判断插入时,空间是否足够

【SList.c】
//判断插入数据时,空间是否足够 SLTNode* SLTBuyNode(SLTDataType x) { SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode)); if (node == NULL) { perror("malloc fail!"); exit(1); } node->data = x; node->next = NULL; return node; }

5、尾插

【SList.h】
//尾插 void SLTPushBack(SLTNode** pphead,SLTDataType x);
【SList.c】
//尾插 void SLTPushBack(SLTNode** pphead, SLTDataType x) { assert(pphead); //形参:pphead --> 实参:&plist //*pphead 解引用 --> plist //申请新结点 SLTNode* newnode = SLTBuyNode(x); //判断是否有足够空间 if (*pphead == NULL) { *pphead = newnode; } else { //尾节点 --> 新结点 //找尾节点 SLTNode* ptail = *pphead; while (ptail->next) { ptail = ptail->next; } //ptail --> newnode ptail->next = newnode; } }
【test.c】
void SListTest01() { SLTNode* plist = NULL; SLTPushBack(&plist, 1); SLTPrint(plist); //1->NULL SLTPushBack(&plist, 2); SLTPrint(plist); //1->2->NULL SLTPushBack(&plist, 3); SLTPrint(plist); //1->2->3->NULL SLTPushBack(&plist, 4); SLTPrint(plist); //1->2->3->4->NULL }
【运行结果】

6、头插

Read more

Spring Boot 机制四: AOP 代理机制源码级深度解析(JDK / CGLIB 全链路)

Spring Boot 机制四: AOP 代理机制源码级深度解析(JDK / CGLIB 全链路)

博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 文章目录 * Spring Boot 机制四: AOP 代理机制源码级深度解析(JDK / CGLIB 全链路) * 目录 * 1. Spring Boot AOP 的本质是什么? * 2. JDK vs CGLIB:

By Ne0inhk
Java 大视界 -- Java 大数据机器学习模型在电商供应链库存协同管理与成本控制中的应用(421)

Java 大视界 -- Java 大数据机器学习模型在电商供应链库存协同管理与成本控制中的应用(421)

Java 大视界 -- Java 大数据机器学习模型在电商供应链库存协同管理与成本控制中的应用(421) * 引言: * 正文: * 一、电商供应链库存管理的核心痛点与行业现状 * 1.1 电商库存管理的四大核心痛点(2024 年行业实测数据) * 1.2 传统方案 vs Java 大数据机器学习方案(3 轮实测对比) * 二、Java 大数据机器学习技术栈适配逻辑 * 2.1 核心技术组件选型(按电商规模 + 商品特性适配) * 2.2 核心技术组件的电商场景作用(附实战参数) * 三、核心模块落地实践(含完整可运行代码 + 经典注释) * 3.1 模块一:基于 LSTM 的需求预测模型(Java 实现,适配生鲜 / 3C) * 3.

By Ne0inhk
易语言子程序高级应用:递归、回调与参数设计实战

易语言子程序高级应用:递归、回调与参数设计实战

易语言子程序高级应用:递归、回调与参数设计实战 一、学习目标与重点 💡学习目标:1. 深入理解易语言子程序的递归调用机制与实现条件;2. 掌握参数传递的高级形式(引用传递、数组参数、自定义数据类型参数);3. 学会使用回调函数实现程序模块间的解耦;4. 初步了解多线程环境下的子程序调用(线程同步基础);5. 通过真实案例(递归计算斐波那契数列、文件目录遍历、员工薪资计算系统的模块解耦)巩固所学知识。 ⚠️学习重点:递归的退出条件设置、栈溢出风险规避、引用传递与值传递的区别、数组/UDT参数的类型声明、回调函数的指针实现方法、线程同步的临界区使用。 二、递归调用机制与实现 2.1 递归的基本概念与实现条件 2.1.1 递归的基本概念 递归调用是指子程序直接或间接调用自身的过程,常用于解决具有重复子问题的问题(如计算阶乘、斐波那契数列、遍历文件目录、二叉树操作等)。 2.1.2

By Ne0inhk
【Java 开发日记】我们来说说 ThreadLocal 的原理,使用场景及内存泄漏问题

【Java 开发日记】我们来说说 ThreadLocal 的原理,使用场景及内存泄漏问题

目录 一、核心原理 1. 数据存储结构 2. 关键设计 二、源码分析 1. set() 方法流程 2. get() 方法流程 三、使用场景 1. 典型应用场景 2. 使用建议 四、内存泄漏问题 1. 泄漏原理 2. 解决方案对比 3. 最佳实践 五、注意事项 六、替代方案 七、调试技巧 面试回答 1. 首先,它的核心原理是什么? 2. 其次,它的典型使用场景有哪些? 3. 最后,关于它的内存泄漏问题 一、核心原理 1. 数据存储结构 // 每个

By Ne0inhk