数据结构|第二章 线性表2
目录2.3线性表的链式表示2.3.1单链表的定义2.3.2单链表的基本操作1.单链表的初始化2.单链表的插入删除1.按位序插入带头结点1.指定结点的后插操作2.指定结点的前插操作2.按位序删除带头结点1.按位序删除2.指定结点的删除2.3线性表的链式表示2.3.1单链表的定义1.即线性表的链式存储2.3.typedef的使用例struct LNode{ int data; struct LNode *Next; }; typedef struct LNode LNode; typedef struct LNode *LinkList //等价于 typedef struct LNode{ int data; struct LNode *Next; }LNode, *LinkList;4.LNode *和LinkList 本质相同2.3.2单链表的基本操作1.单链表的初始化#includestdio.h typedef struct LNode{ //定义单链表的节点类型 int data; //每个节点存放一个数据元素 struct LNode *Next; //指针指向下一个节点 }LNode, *LinkList; //要表示一个单链表时只需声明一个头指针L指向单链表的第一个节点LNode *L或LinkList L; //初始化一个单链表 bool initList(LinkList L){ LNULL; //空表暂时还没有任何节点 return true; } //判断单链表无头结点是否为空 bool Empty(LinkList L){ if(LNULL) return true; else return false; } //或 //bool Empty(LinkList L) //{ // return (LNULL); //} //初始化一个单链表(带头节点) bool initList(LinkList L){ L(LNode *)malloc(sizeof(LNode));//分配一个头结点 if(LNULL) //内存不足分配失败 return false; L-NextNULL; //头结点之后暂时还没有节点 return true; } //判断单链表(带头结点)是否为空 bool Empty(LinkList L){ if(L.NextNULL) return true; else return false; } void test(){ LinkList L; //声明一个指向单链表的指针 initList(L); //... }2.单链表的插入删除1.按位序插入带头结点ListinsertL,i,e例1若i2先创建一个新的节点把e放入节点接下来对指针进行修改插入完成代码实现#includestdio.h #includestdLib.h #includestdbool.h typedef struct LNode{ //定义单链表的节点类型 int data; //每个节点存放一个数据元素 struct LNode *Next; //指针指向下一个节点 }LNode, *LinkList; //要表示一个单链表时只需声明一个头指针L指向单链表的第一个节点LNode *L或LinkList L; //初始化一个单链表(带头节点) bool initList(LinkList L){ L(LNode *)malloc(sizeof(LNode));//分配一个头结点 if(LNULL) //内存不足分配失败 return false; L-NextNULL; //头结点之后暂时还没有节点 return true; } //在第i个位置插入元素e带头结点 bool Listinsert(LinkList L,int i,int e) { if(i1) return false; LNode *p;//指针q指向当前扫描的结点 int j0;//当前p指向的是第几个结点 pL;//l指向头结点头结点是第0个结点(不存数据) while(p!NULL ji-1) { pp-Next; j; } if(pNULL) return false; LNode *s (LNode *)malloc(sizeof(LNode)); s-datae; s-Nextp-Next; p-Nexts;//将s插到p后 return true; } void printList(LinkList L){ LNode *pL-Next; while(p!NULL){ printf(%d -,p-data); pp-Next; } printf(NULL\n); } int main(){ LinkList L; //声明一个指向单链表的指针 initList(L); int a[]{1,2,3,4,5}; for(int i0;i5;i){ Listinsert(L,i1,a[i]); } printList(L); return 0; }1.指定结点的后插操作//指定结点的后插操作 bool insertNextNode(LNode *p,int e){ if(pNULL){ return false; } LNode *s(LNode *)malloc(sizeof(LNode)); if(sNULL) { return false;//内存不够时分配失败 } s-datae; s-Nextp-Next p-Nexts;//s连到p后 return true; }时间复杂度O12.指定结点的前插操作bool insertPriorNode(LNode *p,int e){ if(pNULL){ return false; } LNode *p(LNode *)malloc(sizeof(LNode)); s-Nextp-Next; int tempp-data; p-datae; return true; }时间复杂度O12.按位序删除带头结点1.按位序删除bool Listdelete(LinkList L,int i,int e){ if(i1) return false; LNode *p; int j0; pL; while(p!NULL ji-1){ pp-Next; j; } if(pNULL){ return false; if(p-Next NULL)//第i-1个结点之后已无其他结点 return false; LNode *qp-Next;//令q指向被删除结点 eq-data; //用e返回删除的值 p-Nextq-Next; //将*q结点从链中断开 free(q); //释放删除结点储存空间 return true; } }2.指定结点的删除bool deleteNode(LNode *p){ if(pNULL){ return false; } LNode *qp-Next; p-datap-Next-data;//p-Next-dataq-data p-Nextq-Next ; free(q); return true; }若p为最后一个结点则只能从表头开始依次寻找p的前驱时间复杂度为On故单链表有局限性有时候不方便

相关新闻

OpenClaw 私人 AI 助手平台:架构拆解与部署实战

OpenClaw 私人 AI 助手平台:架构拆解与部署实战

1. 从零认识 OpenClaw:它到底解决了什么问题第一次看到“OpenClaw”这个名字,很多人会以为又是一个套壳的聊天窗口。我最初也是这么想的,直到把它跑起来、接上自己的模型和工具链之后,才发现它真正想做的事情,是把“AI…

2026/10/13 22:06:48 阅读更多 →
低代码平台前端架构设计:渲染引擎与插件系统实战

低代码平台前端架构设计:渲染引擎与插件系统实战

做低代码可视化平台,最绕不开的就是前端架构怎么搭。我前几年在一家做企业数字化服务的技术团队里,主导过一个低代码可视化平台的核心前端架构设计,重点就是标题里这两块:渲染引擎——把平台产出的页面配置描述(内部叫…

2026/10/13 22:06:48 阅读更多 →
ESXi虚拟机故障关机排查全流程:从告警到根因定位与加固

ESXi虚拟机故障关机排查全流程:从告警到根因定位与加固

前两天收到一条监控告警,凌晨 2 点多某个业务虚拟机突然失联。到现场发现虚拟机关机了,不是重启也不是被迁移。这种“故障关机”在虚拟化运维里属于高频事件,但每次处理起来都有点折磨人——因为同样的现象背后可能藏着五六种完全不同的原因&…

2026/10/13 22:06:48 阅读更多 →

最新新闻

Python爬虫实战:手机APP数据抓取与解析全流程

Python爬虫实战:手机APP数据抓取与解析全流程

简介:这份PDF资料面向具备Python基础、对网络请求与爬虫开发感兴趣的技术爱好者与研发工程师,围绕手机APP数据传输的抓取与解析展开,重点讲解如何借助Fiddler抓包定位登录与话题接口,再通过urllib2构造HTTP请求、携带Header与表单…

2026/10/14 3:04:31 阅读更多 →
C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:04:31 阅读更多 →
SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

第一次折腾SQLite的时候,我找了一圈“Setup.exe”,愣是没找到。下载页面全是压缩包,网上一堆教程各写各的,有人说不用装,有人说得编译源码,看得人发懵。后来我才搞明白:SQLite的“安装”逻辑跟M…

2026/10/14 3:04:31 阅读更多 →
C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

简介:《Implementing Useful Algorithms in C》由Dmytro Kedyk撰写,面向具备一定C基础、希望深入掌握算法设计与工程实现的开发者与计算机专业学生。全书从算法正确性证明、渐进记法与机器模型等基本原则切入,系统讲解数据类型选择、内存管理…

2026/10/14 3:04:31 阅读更多 →
本地27B模型配Function Calling:工具不触发的原因与实战

本地27B模型配Function Calling:工具不触发的原因与实战

给本地跑的27B模型配了三个专业工具之后,我做的第一件事就是拿它试聊天。你猜怎么着——工具列表明明挂在接口定义里,模型却像一个看见工具箱、却只肯用手拧瓶盖的人,简单问题全凭语言能力直接答,一个工具都不碰。我一度觉得这套配…

2026/10/14 3:04:31 阅读更多 →
容器内nvidia-smi报Unknown Error的排查与根治

容器内nvidia-smi报Unknown Error的排查与根治

凌晨两点半,工作群里弹出一条消息:某个长期跑的容器,前一秒还好好的,后一秒容器里的nvidia-smi直接报Failed to initialize NVML: Unknown Error。宿主机上执行nvidia-smi一切正常,新建一个临时容器也能正常看到卡&…

2026/10/14 3:03:31 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →