单链表的基本操作

定义一个结点

typedef struct ElemType{char name[20];int sex;int age;char number[11];
};//定义一个结点 
typedef struct Lnode{     ElemType data;struct Lnode* next;
}LNode,*LinkList;

 

 

链表的初始化

一般包含两步:给结点分配空间,头指针指针域为空

相当于建立一个空表


/*链表初始化,头结点指针域为空 */
Status InitList_L(LinkList &L){         //L为指向头结点的指针 L=(LinkList)malloc(sizeof(LNode));  //L中存放着头结点的地址L->next=NULL; return OK;
}

 

 

单链表的简单操作

单链表的销毁


/*销毁单链表(头结点,头指针都不存在)*/
Status DestoryList_L(LinkList &L){     //L为指向头结点的指针 Lnode * p;                         //或者LinkList p;while(L){                          p=L;                           //p和L指向同一个结点 L=L->next;                     //L向后移动一个 free(p);                       //释放p } return OK;
} 

 

 

清空单链表


/*清空单链表*/
Status ClearList(LinkList &L){Lnode *p,*q;p=L->next;                       //p指向首元结点 while(p){q=p->next;                   //q指向p后面的结点 free(p);                     //释放p p=q;                         //p,q指向同一结点 }L->next=NULL;return OK;
}

清空链表与销毁链表的不同在于:清空会保留单链表的头结点和头指针,相当于一个空表,而小胡链表,整个表都不存在。

 

 

 

求单链表的表长


/*求单链表的表长*/
int ListLength_L(LinkList &L){LinkList p;p=L->next;                    //p指向首元结点 int i=0;while(p){                     //遍历单链表 i++;p=p->next;} return i;
}

 

 

单链表的基本操作

查找

取出链表中第i个元素的内容


/*取出链表中第i个元素的内容*/
//<1>从第一个结点顺着链表扫描,p=L->next;
//<2>j做计数器,初始值为1,记录已扫描的结点的个数
//<3>p向后移动,j++
//<4>当j==i时找到该结点
Status GetElem_L(LinkList &L,int i,ElemType &e){      /*通过变量e返回*/ LinkList p;p=L->next;j=1;while(p&&j<i){p=p->next;++j;}if(!p||j>i){                  //第i个元素不存在 return ERROR;}e=p->data;return OK;
} 

 

 根据指定数据元素获取该数据所在的位置


/*根据指定数据元素获取该数据所在的位置*/
Lnode * LocateElem_L(LinkList &L,ElemType e){      //查找值为e的元素 p=L->next;while(p&&p->data!=e){p=p->next;}return p;                                    //若找到,则返回该值的地址,查找失败就返回NULL 
} 

 

 

 根据指定数据元素获取该数据的序号

跟上面根据指定数据元素获取该数据所在的位置有点类似,只是多了一个计数器


/*根据指定数据元素获取该数据的序号*/
Lnode * LocateElem_L(LinkList &L,ElemType e){      //查找值为e的元素 p=L->next;j=1;while(p&&p->data!=e){p=p->next;j++;}if(p){return j;}else{return 0;}
} 

插入

在单链表的第i个结点前插入值为e的结点


/*在单链表的第i个结点前插入值为e的结点*/
//<1>找到a(i-1)的位置p 
//<2>生成一个数据域为e的新结点 
//<3>插入新结点 //新结点的指针域指向a(i);//结点a(i-1)的指针域指向新结点
Status ListInsert_L(LinkList &L,int i,ElemType e){p=L;j=0;while(p&&j<i-1){             //找到第i-1个结点 p=p->next;++j;}if(!p||j>i-1){           //第i-1个元素不存在 return ERROR;}s=(LinkList)malloc(sizeof(LNode));s->next=p->next;             //新结点的指针域指向a(i);p->next=s;                   //结点a(i-1)的指针域指向新结点return OK;
} 

 

 删除

删除第i个结点


/*删除第i个结点*/
//<1>找到a(i-1)的位置p,(如需必要保存结点i的值) 
//<2>令p->next指向a(i+1) 
//<3>释放a(i)的空间
Status ListDelete_L(LinkList &L,int i,ElemType &e){p=L;j=0;while(p&&j<i-1){             //找到第i-1个结点 p=p->next;++j;}if(!p||j>i-1){           //第i-1个元素不存在 return ERROR;}q=(LinkList)malloc(sizeof(LNode));q=p->next;                  //结点i p->next=q->next;            //令p->next指向a(i+1)e=q->data;                  //保存结点i的值free q;return OK; 
} 

//查找:因为线性链表只能顺序存取,所以要从头查找,时间复杂度为O(n)
//插入,删除:因为线性链表不用移动元素,只用修改指针,一般情况下时间复杂度为O(1),但是要在单链表中进行,要从头找到相应的前驱结点,时间复杂度为O(n) 

单链表的建立

头插法建立单链表


/*头插法建立单链表*/ 
//<1>从一个空表开始,重复读入数据 
//<2>生成新的节点,将读入的数据放在结点的数据域中 
//<3>从最后一个结点开始依次将各结点插入到链表前端
void CreateList_H(LinkList &L,int i){        //i为结点个数 L=(LinkList)malloc(sizeof(LNode));L->next=NULL;           //建立一个空表for(int i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));p->data=读取数据元素;p->next=L->next;      //链表的插入 L->next=p;} 
尾插法建立单链表

/*尾插法建立单链表*/
//<1>从一个空表开始,将新的结点依次插入到链表尾部,尾指针r指向尾节点 
//<2>开始时L与r均指向头结点,每个数据元素申请一个新结点,r指向新结点
void CreateList_R(LinkList &L,int i){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;LinkList r;r=L;for(int i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));p->data=读取数据元素;p->next=NULL;r->next=p;          //插到表尾 r=p;                //指向新结点 }
} 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CompletableFuture使用详解

简单的任务&#xff0c;用Future获取结果还好&#xff0c;但我们并行提交的多个异步任务&#xff0c;往往并不是独立的&#xff0c;很多 时候业务逻辑处理存在串行[依赖]、并行、聚合的关系。如果要我们手动用 Future 实现&#xff0c;是非常麻烦的。 CompletableFutur…

JMeter基本使用

一、JMeter线程组相关 进程&#xff1a;正在运行的程序。线程&#xff1a;是进程中的执行线索。线程组&#xff1a;进程中有许多线程&#xff0c;为了方便管理&#xff0c;可以对线程按照性质分组&#xff0c;分组的结果就是线程组。PS&#xff1a;三者关系&#xff0c;一个进…

Pytest设置日志

在 pytest 中,您可以使用内置的日志功能来记录测试过程中的信息。pytest 默认使用了 logging 模块来处理日志记录。此外,您还可以使用 pytest 的插件来增强日志功能,比如 pytest-loguru 插件,它结合了 loguru 库来提供更强大的日志管理能力。 1. 使用内置的日志功能 设置…

【设计模式】(万字总结)深入理解Java中的创建型设计模式

1. 前言 在软件开发的世界里&#xff0c;设计模式是一种被广泛接受并应用的解决方案。它们不仅仅是代码的设计&#xff0c;更是对问题的思考和解决的方法论。在Java开发中&#xff0c;特别是在面向对象的编程中&#xff0c;设计模式尤为重要。创建型设计模式&#xff0c;作为设…

【初阶数据结构篇】实现顺序结构二叉树(堆的实现方法)

文章目录 实现顺序结构二叉树&#xff08;堆&#xff09;前言代码位置堆的概念与结构概念 堆的实现堆初始化和销毁堆的插入堆的判空堆的删除数据取堆顶数据 实现顺序结构二叉树&#xff08;堆&#xff09; 前言 ​ ⼀般堆使⽤顺序结构的数组来存储数据&#xff0c;堆是⼀种特…

一键生成惊艳图像:使用Stable Diffusion打造惊人视觉效果

一、简介 Stable Diffusion是一种由Stability AI开发的生成式AI模型&#xff0c;能够将文本提示转换为高质量的图像。作为生成式扩散模型的一部分&#xff0c;Stable Diffusion通过解析和理解输入的文本提示&#xff0c;逐步生成与描述相匹配的图像。这一技术不仅在图像生成和…

AUTOSAR从入门到精通-T-Box

目录 前言 算法原理 TBOX主要模块 主控模块 CAN通讯模块 高通4G模块 蓝牙模块 & WIFI & Bluetooth模块 WIFI模块 天线 T-BOX功能 网络接入 车辆信息实时上传 远程诊断 车辆异常告警上传 E/B-call服务 OTA功能 V2X 位置查询/车辆追踪 平台监控/国家监…

树莓派4b的Mysql数据库操作

卸载树莓派中的 MySQL。 停止 MySQL 服务&#xff1a; sudo systemctl stop mysql卸载 MySQL 服务器和客户端&#xff1a; sudo apt-get remove --purge mysql-server mysql-client mysql-common删除 MySQL 数据库和配置文件&#xff1a; sudo rm -rf /etc/mysql /var/lib/mysq…

鸿蒙next ArkUI 单例模式和手游sdk接口设计

前言: 各位同学大家,有段时间没有跟大家见面了,因为最近一直在更新鸿蒙的那个实战课程所以就没有去更新文章实在是不好意思, 所以今天就给大家更新一起鸿蒙里面的案例模式来给大家做一个分享。 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为…

Vue3-导出导入excel

功能 主要实现excel导入导出功能&#xff0c;同时具有合并单元格&#xff0c;美化单元格等功能&#xff0c;引用依赖包exceljs、file-saver&#xff0c;好像也没有什么要介绍的&#xff0c;可以看看官网文档然后直接使用了 导入依赖包 pnpm install exceljs file-saver type…

MybatisPlus核心用法

MybatisPlus核心用法 目录 MybatisPlus核心用法1.使用MybatisPlus的基本步骤&#xff1a;2.MybatisPlus是如何获取实现CRUD的数据库表信息的&#xff1f;3.MybatisPlus的常用注解有哪些&#xff1f;如果表名称和实体类名称不符合约定该怎么做&#xff1f;IdType的常见类型有哪些…

漏洞复现-F6-11泛微-E-Cology-SQL

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://www.wwlib.cn/index.php/artread/artid/15575.html 0x01 产品简介 泛微协同管理应用平台e-cology是一套企业级大型协同管理平台 0x02 漏洞概述 该漏洞是由于泛微e-cology未对用户的输入进行有效的过滤&#xff0…

Python爬虫技术 第17节 使用BeautifulSoup

使用Python进行网页爬取是一个常见的任务&#xff0c;特别是当需要从网站上批量获取数据时。BeautifulSoup是一个非常流行的Python库&#xff0c;用于解析HTML和XML文档&#xff0c;非常适合用来提取网页中的信息。 下面我将通过一个简单的案例来介绍如何使用Python和Beautifu…

Skyeye云智能制造企业版源代码全部开放

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

vue3 快速入门 (六) : vue中调用HTTP请求

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 1.91.0 2. 访问HTTP 在Vue中&#xff0c;访问HTTP&#xff0c;可以使用axios第三方库。 axios 是一个基于 promise 的网络请求库&#xff0c;可以用于浏览器和 node.js。 axios使用简…

DelegateExecution和EXecution有啥区别

DelegateExecution 和 Execution 都是 Activiti 引擎中用于表示流程实例的执行对象&#xff0c;但它们在具体使用上有一些区别&#xff1a; DelegateExecution • 接口&#xff1a;DelegateExecution 是一个接口&#xff0c;继承自 VariableScope 接口。它主要在扩展点&#…

遗传算法与深度学习实战——进化深度学习

遗传算法与深度学习实战——进化深度学习 0. 前言1. 进化深度学习1.1 进化深度学习简介1.2 进化计算简介 2. 进化深度学习应用场景3. 深度学习优化3.1 优化网络体系结构 4. 通过自动机器学习进行优化4.1 自动机器学习简介4.2 AutoML 工具 5. 进化深度学习应用5.1 模型选择&…

【mybatis的批量操作】

在日常开发中&#xff0c;如果要操作数据库的话&#xff0c;或多或少都会遇到批量数据的处理&#xff0c;我们公司使用的mybaits-plus作为持久层的框架&#xff0c;今天就简单介绍一下mybaits批量操作数据库的几种方式。 1.循环插入 其实这种方式并不是批量插入&#xff0c;只…

功能实现——使用 OpenPDF 将 HTML 转换为 PDF,并将其上传到 FTP 服务器

目录 1.需求分析2.项目环境搭建3.将 HTML 转换为 PDF3.1.代码实现mail.htmlHtmlToPDFController.javaPDFConverterService.javaPDFConverterServiceImpl.java 3.2.测试3.3.注意事项 4.将生成的 PDF 上传到 FTP 服务器4.1.搭建 FTP 服务器4.2.配置文件4.3.代码实现FtpUtil.javaF…

谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新

文章目录 一&#xff0c;引入Mybatis Plus分页插件二&#xff0c;品牌列表的模糊查询三&#xff0c;增加品牌测试数据四&#xff0c;开发后台品牌关联分类接口1&#xff0c;接口product/categorybrandrelation/catelog/list2&#xff0c;接口product/categorybrandrelation/sav…