单链表的按位序插入(带头结点与不带头结点)
📅 2026/7/16 9:03:07
👁️ 次浏览
文章目录带头结点 的 按位序插入代码核心代码解读寻找 i-1 结点判断 i 越界新建结点并连接指针不带头结点 的 按位序插入代码不带头结点单链表特征代码解读i 1 表头插入分支i ≥ 2寻找前驱结点以及连接结点时间复杂度不同点带头结点与不带头结点的插入代码直观对照带头结点没有 i1 分支不带头结点先单独处理 i1带头结点 的 按位序插入代码#includestdio.h#includestdlib.htypedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;// 在第 i 个位序插入元素 e 带头结点单链表boolListInsert(LinkListL,inti,inte){// 1. 位序不能小于 1if(i1)returnfalse;LNode*p;// 遍历指针用来寻找第 i-1 个结点intj0;// 记录 p 当前是第几个结点,即当前指向的位序头结点是第 0 位pL;// p 初始指向头结点头结点定义为第 0 位无数据// 循环找到第 i-1 个前驱结点while(p!NULLji-1){pp-next;j;}// p为空说明 i 超过链表长度 1位置非法if(pNULL)returnfalse;// 新建结点 sLNode*s(LNode*)malloc(sizeof(LNode));s-datae;// 先让 s 接上 p 后面的结点再修改p的后继s-nextp-next;p-nexts;returntrue;}// 配套初始化函数带头结点boolInitList(LinkListL){L(LNode*)malloc(sizeof(LNode));if(LNULL)returnfalse;L-nextNULL;returntrue;}intmain(){LinkList L;InitList(L);// 在第1位插入10、第2位插入20ListInsert(L,1,10);ListInsert(L,2,20);return0;}核心代码解读寻找 i-1 结点LNode*p;intj0;// j 记录当前 p 对应的位序pL;// p 一开始指向头结点规定头结点是第 0 位while(p!NULLji-1){// i-1即循环次数pp-next;j;}核心规则插入第i个位置必须先找到第 i-1 个结点前驱循环两个条件缺一不可p ! NULL防止p-next访问空指针崩溃j i - 1没走到前驱结点就继续后移。两种退出循环情况j i-1成功找到前驱正常插入p NULL链表遍历完仍没走到i-1i过大位置不存在。判断 i 越界if(pNULL)returnfalse;// 例如链表现有 2 个元素最大可插入 i3传入 i4循环结束 pNULL插入失败。新建结点并连接指针LNode*s(LNode*)malloc(sizeof(LNode));s-datae;s-nextp-next;p-nexts;指针顺序绝对不能颠倒先让新结点s接上p原来后面的结点保存后半段链表再让p指向新结点s错误写法断链丢失后面所有节点p-next s;s-next p-next; // p-next已经变成s自循环不带头结点 的 按位序插入代码#includestdio.h#includestdlib.htypedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;// 不带头结点 初始化L直接置NULL不malloc不创建任何结点// LNULL 代表链表为空boolInitList(LinkListL){LNULL;returntrue;}// 在第 i 个位序插入元素 e 【不带头结点单链表】boolListInsert(LinkListL,inti,inte){if(i1)// 位序从 1 开始0 和负数非法returnfalse;// 情况1插入第1个位置表头需要修改头指针L单独处理if(i1){LNode*s(LNode*)malloc(sizeof(LNode));s-datae;s-nextL;Ls;// 头指针指向新结点returntrue;}// 情况2i≥2寻找第 i-1 个结点LNode*p;intj1;// p一开始指向第1个数据结点pL;// L直接指向第一个有效结点无头部空结点while(p!NULLji-1){pp-next;j;}if(pNULL)returnfalse;LNode*s(LNode*)malloc(sizeof(LNode));s-datae;s-nextp-next;p-nexts;returntrue;}intmain(){LinkList L;InitList(L);// 不带头结点初始化 LNULLListInsert(L,1,10);// 第1位插入ListInsert(L,2,20);// 第2位插入return0;}不带头结点单链表特征LinkList L直接指向第一个有效数据结点空链表判定L NULL表头插入i1特殊需要修改头指针L必须单独分支带头结点链表不需要单独处理表头这是两者最大区别。代码解读i 1 表头插入分支LNode*s(LNode*)malloc(sizeof(LNode));s-datae;s-nextL;Ls;执行顺序新建结点s存入数据es-next L新结点接上原来链表第一个结点L s头指针更新让L指向新结点新的表头。i ≥ 2寻找前驱结点以及连接结点目标插入第 i 个位置要先找到第 i-1 号结点。后续逻辑和带头结点一样LNode*p;intj1;// p一开始指向第1个数据结点pL;// L直接指向第一个有效结点无头部空结点while(p!NULLji-1){// 循环找到第 i-1 个结点pp-next;j;}if(pNULL)returnfalse;LNode*s(LNode*)malloc(sizeof(LNode));s-datae;s-nextp-next;//先让 s 接住 p 后面的链表再修改 p 的后继。p-nexts;时间复杂度最好时间复杂度O(1)最坏时间复杂度O(n)平均时间复杂度O(n)不同点带头结点与不带头结点的插入不同点对比带头结点不带头结点初始化malloc创建头结点L永远不为NULLL NULL不创建任何结点空表即没有结点空链表判断L-next NULLL NULLi1表头插入无需单独分支统一代码前驱就是头结点必须单独if(i1)分支需要修改头指针L遍历指针初始设置p Lp一开始指向头结点j 0头结点编号0p Lp一开始指向第1个数据结点j 1第一个有效结点编号1前驱查找逻辑所有i统一处理无特殊情况i1特殊处理i≥2才走循环寻找前驱代码直观对照带头结点没有 i1 分支pL;intj0;while(p!NULLji-1){pp-next;j;}不带头结点先单独处理 i1if(i1){// 表头插入单独逻辑s-nextL;Ls;returntrue;}// i≥2才执行下面遍历pL;intj1;while(p!NULLji-1){pp-next;j;}
做本地生活流量这行三年了,见过太多老板因为不懂行,把真金白银扔进水里连个响都听不见。今天不整那些虚头巴脑的概念,就聊聊大家最关心的本地搜索排名。很多人以为上了个什么AI智多星geo优化工具,就能一夜爆单。天真了,真的天真了。上周有个做餐饮的朋友找我哭诉,说花了大…
📅 2026/7/16 9:02:26
《你别回头找我》适合被放进一个具体时刻里理解:长路返程,人需要的不是喧哗,而是一点能把心扶稳的亮。放在数字音乐和内容传播观察里,这首歌最值得写的是歌名、听感和搜索动作怎样连成一条自然路径。它的价值在于把低处的情绪写得…
📅 2026/7/16 9:02:06
计划以后转到计算机架构方向上去,系统学习一遍C语言基础,参考教材-C程序设计语言(机械工业出版社的计算机黑书),并且结合B站教程来学习1.win安装编译器与配置vscode参考【C语言环境设置 | Windows安装编译器和VS Code】…
📅 2026/7/16 9:02:06
1. 多目标跟踪评价指标的演进背景 我第一次接触多目标跟踪(MOT)是在2015年的一个智能监控项目。当时团队花了两周时间调试算法,结果在MOTA指标上只取得了0.72的成绩,客户却问"为什么不是1.0?"这个尴尬场景让我意识到,理…
📅 2026/7/16 9:54:09
1. 项目背景与行业意义ACM Multimedia作为多媒体领域的顶级学术会议,每年收录的论文代表着该领域最前沿的技术突破。字节跳动此次入选的论文聚焦数字水印技术,这一领域在内容保护、版权追踪等方面具有重要应用价值。数字水印技术本质上是一种将标识信息嵌…
📅 2026/7/16 9:54:09
在实际 C 语言项目中,处理文件时经常需要知道文件的大小,比如读取整个文件到内存、校验文件完整性或者限制上传文件体积。但 C 语言标准库并没有直接提供一个类似 get_file_size() 的函数,这让很多初学者在第一次需要获取文件大小时感到困惑…
📅 2026/7/16 9:54:09
目录
方法1:使用LINQ的ToArray方法
方法2:使用数组的初始化器
方法3:手动转换每个元素 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
在C#中,将List<long>转换为objec…
📅 2026/7/16 9:54:09
1. 什么是JSSDK及其核心价值JSSDK(JavaScript Software Development Kit)是平台方提供给网页开发者的工具包,它架起了网页与原生应用之间的桥梁。以微信JSSDK为例,它让H5页面能够调用微信客户端的原生能力,比如&#x…
📅 2026/7/16 9:54:09
1. 为什么需要关注AI Skills仓库? 作为一名长期跟踪AI技术发展的从业者,我深刻体会到优质技能资源对开发效率的倍增作用。AI Skills仓库本质上是经过验证的技术方案集合,它们通常包含: 预训练模型适配代码 特定场景的解决方案模…
📅 2026/7/16 9:53:08
1. 项目概述:为什么用遗传算法解5皇后问题,而不是直接回溯?我带过十几届算法课,也给不少初创团队做过AI架构咨询。每次讲到组合优化问题,学生和工程师的第一反应永远是“写个回溯试试”。这没错——55棋盘上找所有合法…
📅 2026/7/16 0:00:02
前几天调试一个简单的电源模块,用到了5.1V稳压管。电路接好,上电测试,万用表一量——输出居然只有4.7V。第一反应是稳压管坏了,换了一个新的,结果还是4.7V。这让我想起很多初学者都会遇到的困惑:明明标称5.…
📅 2026/7/16 0:00:02
1. 项目概述与核心价值 在高速数字系统、通信设备乃至精密测量仪器中,一个稳定、纯净且可精确调控的时钟信号,往往是整个系统稳定运行的“心跳”。无论是确保数据在光纤中无误传输,还是让ADC/DAC芯片精准采样,亦或是让多块FPGA板卡…
📅 2026/7/16 0:00:02
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/15 22:51:06
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/15 19:03:10
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/15 14:09:20
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/15 22:46:06
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/16 4:59:31
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/15 22:51:03