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

[408] [数据结构] 链表-代码基础

1.单链表的定义typedef struct LNode{ //定义单链表结点类型 ElemType data; //数据域 struct LNode *next; //指针域 }LNode, *LinkList;单链表是一种非随机存取的存储结构。当头指针为NULL时表示链表为空。在带头结点的单链表中头指针L指向头结点而头结点的next指向第一个数据节点。在不带头结点的单链表中头指针L直接指向第一个数据结点。2.单链表上基本操作的实现2.1 单链表的初始化bool InitList(LinkList L){ //带头结点的单链表初始化 L(LNode*)malloc(sizeof(LNode)); //创建头结点 L-nextNULL; //头节点之后暂无数据结点 return true; }不带头结点的单链表初始化时只需将头指针L初始化为NULL。bool InitList(LinkList L){ //不带头结点的单链表初始化 LNULL; return true; }2.2 求表长操作求表长是指统计单链表中数据结点的个数不包括头结点int Length(LinkList L){ int len0; //计数变量初始为0 LNode *pL; while(p-next!NULL){ pp-next; len; //每访问一个结点计数加1 } return len; }求表长操作的时间复杂度为O(n)O(n)O(n)。2.3 按序号查找结点LNode *GetElem(LinkList L, int i){ LNode *pL; //指针p指向当前扫描结点。 int j0; //j记录当前位序头结点为第0个结点。 while(p!NULLji){ //循环找到第i个结点 pp-next; j; } return p; //返回第i个节点的指针或NULL }按序号查找操作的时间复杂度为O(n)O(n)O(n)。2.4 按值查找表结点LNode *LocateElem(LinkList L, elemtype e){ LNode *pL-next; while(p!NULLp-data!e) //从第一个结点开始擦汗中阿数据域为e的节点 pp-next; return p; //找到后返回该结点指针否则返回NULL }按值查找操作的时间复杂度为O(n)O(n)O(n)。2.5 插入结点操作bool ListInsert(LinkList L, int i, Elemtype e){ LNode *pL; //p指向当前扫描结点 int j0; //j记录当前位序头结点为第0个结点 while(p!NULLji-1){ //循环找到第i-1个结点 pp-next; j; } if(pNULL) //i值不合法 return false; LNode *s(LNode*)malloc(sizeof(LNode)); s-datae; s-nextp-next; //(1) p-nexts; //(2) return true; }时间复杂度为O(n)O(n)O(n)。(1)和(2)的顺序不可颠倒。扩展对某个节点进行前插操作。前插操作是指在某结点前插入一个新结点与后插操作相反。主要代码片段如下s-nextp-next; //修改指针域不能颠倒 pnexts; tempp-data; //交换数据域部分 p-datas-data; s-datatemp;时间复杂度为O(n)O(n)O(n)。2.6 删除结点操作bool ListDelete(LinkList L, int i, ElemType e){ LNode *pL; //指针p指向当前扫描到的结点 int j0; //记录当前结点的位序头结点是第0个结点 while(p-next!NULLji-1){ //循环找到第i-1个结点 pp-next; j; } if(p-nextNULL||ji-1) //i值不合法 return false; LNode *qp-next; //令q指向被删除结点 eq-data; //用e返回元素的值 p-nextq-next; //将*q节点从链中“断开” free(q); //释放节点的存储空间 return true; }时间复杂度为O(n)O(n)O(n)。扩展删除给定结点*p。主要代码片段LNode *qp-next; //令q指向*p的后继结点 p-datap-next-data; //用后继结点的数据域覆盖 p-nextq-next; //将*q节点从链中“断开” free(q); //释放后继结点的存储空间时间复杂度为O(n)O(n)O(n)。2.7 采用头插法建立单链表LinkList List_HeadInsert(LinkList L){ //逆向建立单链表 LNode *s; int x; //设元素类型为整数 L(LNode*)malloc(sizeof(LNode)); //创建头结点 L-nextNULL; //初始为空链表 scanf(%d, x); //输入结点的值 while(x19999){ //输入9999表示结束 s(LNode*)malloc(sizeof(LNode)); //创建新结点 s-datax; s-nextL-next; L-nexts; //将新结点插入表中L为头结点 scanf(%d, x); } return L; }每插入一个结点的时间复杂度为O(1)O(1)O(1)总时间复杂度为O(n)O(n)O(n)。2.8 采用尾插法建立单链表LinkList List_TailInsert(LinkList L){ //正向建立单链表 int x; //设元素类型为整数 L-(LNode*)malloc(sizeof(LNode)); //创建头结点 LNode *s, *rL; //r为表尾指针 scanf(%d, x); //输入结点的值 while(x!9999){ //输入9999表示结束 s(LNode*)malloc(sizeof(LNode)); s-datax; r-nexts; rs; //r指向新的表尾结点 scanf(%d, x); } r-nextNULL; //尾节点置空 return L; }因为附设了一个尾指针故无须遍历查找尾部总时间复杂度为O(n)O(n)O(n)。3.双链表3.1 双链表的定义typedef struct DNode{ //定义双链表结点类型 ElemType data; //数据域 struct DNode *prior,*next; //前驱和后继指针 }DNode, *Dlinklist;3.2 双链表的插入操作核心代码片段如下s-nextp-next; p-next-priors; s-priorp; p-nexts;3.3 双链表的删除操作p-nextq-next; q-next-priorp; free(q);4.静态链表定义#define MaxSize 50 //静态链表的最大长度 typedef struct{ //静态链表的结构类型定义 ElemType data; //存储数据元素 int next; //下一个元素的数组下标 } SLinkList[MaxSize];
http://www.rkmt.cn/news/1376103.html

相关文章:

  • 以书香润心,借坚韧前行
  • 信创运维实战:在ARM版银河麒麟V10上离线搞定telnet的完整流程(附软件包查找技巧)
  • 百度网盘解析工具终极指南:3分钟突破限速实现高速下载
  • 从 Session 到 JWT:Web 认证系统的发展与 JWT 原理详解
  • 匿名内部类的使用场景 java反射机制
  • 小小屠龙原始火龙手游官网下载:小小屠龙原始火龙最新官方下载渠道
  • 普通人如何在 GPT‑5.5 时代保持竞争力:不被替代、学会协作、放大优势
  • IwaraDownloadTool:浏览器扩展视频嗅探引擎深度解析与架构设计
  • 阿里云服务器CPU 100%排查指南:识别伪装挖矿病毒的三步法
  • 鸿蒙PC:Qt适配OpenHarmony实战【书栖】:图书列表、阅读进度和简介卡片的组合实现
  • 卷积神经网络(CNN)与深度学习视觉应用综述
  • 十二周学习报告
  • 免费游戏加速神器OpenSpeedy:5分钟解锁极致流畅体验终极指南 [特殊字符]
  • Laravel vs ThinkPHP:主流PHP框架终极对决
  • 拉普拉斯变换与自注意力机制的革新融合
  • PC端微信消息加密机制与合法数据访问实践
  • 微信小程序ERR_CERT_DATE_INVALID错误深度解析与修复指南
  • 闪卡网页 第五人格 html 开源
  • 从滴滴D²-City到实战:手把手教你用Python脚本构建自己的交通场景YOLO数据集
  • 线性系统理论学懵了?手把手带你推导能控性格拉姆矩阵判据(附详细证明步骤)
  • window11 恢复右键刷新
  • 别再让Ubuntu22.04时间错乱了!用hwclock和timedatectl搞定硬件时钟时区的保姆级教程
  • Web渗透与移动逆向:两种安全范式的本质差异
  • 英雄联盟客户端美化革命:用LeaguePrank打造个性化游戏体验
  • DeepMech:基于图神经网络与模板学习的化学反应机理预测框架
  • 2026年Claude API中转站权威性能与成本榜单 企业级生产场景选型全指南
  • 5大架构优势解析:为什么选择BepInEx进行Unity游戏插件开发
  • RAID5双盘离线还能恢复吗?底层原理与实战抢救指南
  • 机器学习力场(MLFF)在量子材料原子模拟与设计中的实战应用
  • BepInEx 6.0技术揭秘:如何构建跨平台Unity插件框架的5大核心机制