数据结构 - 链表
线性表的链式存储结构
概念
将线性表 L = (a0, a1, … , an-1)中各元素分布在存储器的不同存储块,成为结点,通过地址或指针建立元素之间的联系。
结点的 data 域存放数据元素 ai ,而 next 域是一个指针,指向 ai 的直接后继 ai+1 所在的结点。
-
下图中的首元结点(头结点) A 的 data 不重要,next 域指向链表的真正的第一个结点,头结点的作用也是为了指明哪个结点是链表的第一个结点。
-
最后一个结点的 next 域,也就是下图中最后一个结点的那个 ^ 代表的是 NULL。
结点类型描述
typedef struct node
{data_t data; //结点的数据域struct node *next; //结点的后继指针域
}listnode, *linklist;
则有:
listnode A;
linklist p = &A;
结点声明
设 P 指向链表中结点 ai
获取 ai,写作:p->data
获取 ai+1,写作:p->next->data
若指针 p 的值为 NULL,则它不指向任何结点,此时 p->data
或 p->next
是非法操作。
可调用 C 语言中 malloc() 函数向系统申请结点的存储空间:
linklist p;
p = (linklist)malloc(sizeof(listnode));
则创建一个类型为 linklist 的结点,且该结点的地址已存入指针变量 p 中。
建立单链表
- 目标:建立单链表
- 思路:
1、给头结点分配空间然后判空
2、初始化头结点(H->data,H->next)
3、返回头结点 - 代码:
linklist list_create()
{linklist H; //头结点//分配空间并判空if ((H = (linklist)malloc(sizeof(listnode))) == NULL){printf("malloc H failed!\n");return NULL;}//初始化头结点H->data = 0;H->next = NULL;//返回头结点return H;
}
链表尾部插入节点
- 目标:向单链表的尾部插入新的节点
- 思路:
1、建立新节点,给新节点分配空间并初始化
2、定义指针指示插入节点的位置,这个位置的 next 为空,这样才能在 next 插入新节点,才能保证在链表的结尾插入节点 (从 H 开始,通过 q=q->next 遍历链表直到链表尾部)
3、在指针的 next 插入新节点 - 代码:
int list_insert_tail(linklist H, data_t value)
{linklist p; //要插入的新节点 linklist q; //确定插入位置的指针//如果头结点为空那么以后的操作也没办法进行if (H == NULL){printf("H is NULL!\n");return -1;}//给新节点分配空间并判空if ((p = (linklist)malloc(sizeof(listnode))) == NULL){printf("malloc p failed!\n");return -1;}//初始化新节点p->data = 0;p->next = value;q = H;//确定插入节点的位置while (q->next){q = q->next;}//在链表尾部插入节点q->next = p;return 0;
}
根据下标查找节点
- 目标:根据位置获取链表中的节点
- 思路:
1、判头结点是否为空,判下标是否合法;
2、定义遍历链表的指针和 i 遍历链表直到找到指定位置(注意遍历完链表也没有找到指定节点的情况);
3、返回要查找的节点或空节点(未找到的情况) - 代码:
linklist list_get(linklist H, int pos)
{linklist p; //遍历用指针int i; //遍历用标记if (H == NULL){printf("H is NULL!\n");return NULL;}if (pos < 0){printf("pos is invalid\n");return NULL;}p = H;i = -1;while (i < pos){p = p->next; //指针p向下移动//已经遍历完链表但没找到这个位置则breakif (p == NULL){break;}i++; //i迭代}return p;
}
在链表指定位置插入新节点
- 目标:给定链表、位置和新节点的值将这个新节点插入到链表的指定位置
- 思路:
1、判头节点是否为空,位置是否合法(初步)
2、通过指针和 i 遍历链表找到这个要插入节点的前一个节点的位置,让指针指向这个节点
3、通过改变指针指向插入这个新节点 - 代码:
int list_insert_between(linklist H, data_t value, int pos)
{linklist p; //遍历用指针linklist q; //新节点int i;//如果头结点为空那么以后的操作也没办法进行if (H == NULL){printf("H is NULL!\n");return -1;}//这种位置无效if (pos < -1){printf("H is invalid!\n");return -1;}//给新节点分配空间并判空if ((q = (linklist)malloc(sizeof(listnode))) == NULL){printf("malloc p failed!\n");return -1;}//初始化新节点q->next = NULL;q->data = value;//p从头结点开始遍历p = H;while (i < pos - 1) //注意这里是 pos - 1,一定要在循环结束时让指针指向指定位置的前一个节点{p = p->next;//i还没到pos指针指向节点就空了,证明给定的位置无效if (p == NULL){printf("the pos not found!\n");return -1;}i++;}//此时指针指向指定位置的前一个节点,通过改变指针指向插入新节点q->next = p->next;p->next = q;return 0;
}
打印链表
- 目标:打印链表节点
- 思路:通过指针遍历链表并打印
- 代码:
int list_show(linklist H) {linklist p;if (H == NULL) {printf("H is NULL\n");return -1;}p = H;while (p->next != NULL) {printf("%d ", p->next->data);p = p->next;}puts("");return 0;
}
相关文章:
数据结构 - 链表
线性表的链式存储结构 概念 将线性表 L (a0, a1, … , an-1)中各元素分布在存储器的不同存储块,成为结点,通过地址或指针建立元素之间的联系。 结点的 data 域存放数据元素 ai ,而 next 域是一个指针,指向 ai 的直接后继 ai1 …...
Android 12 Bluetooth源码分析蓝牙配对
本文主要是列出一些蓝牙配对重要的类和方法/函数,遇到相关问题时方便查找添加log排查。 蓝牙扫描列表页面:packages/apps/Settings/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java点击其中一个设备会调用:onPrefere…...
Python异步编程并发执行爬虫任务,用回调函数解析响应
一、问题:当发送API请求,读写数据库任务较重时,程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文…...
React组件化开发
1.组件的定义方式 函数组件Functional Component类组件Class Component 2.类组件 export class Profile extends Component {render() {console.log(this.context);return (<div>Profile</div>)} } 组件的名称是大写字符开头(无论类组件还是函数组件…...
LuatOS-SOC接口文档(air780E)--crypto - 加解密和hash函数
crypto.md5(str) 计算md5值 参数 传入值类型 解释 string 需要计算的字符串 返回值 返回值类型 解释 string 计算得出的md5值的hex字符串 例子 -- 计算字符串"abc"的md5 log.info("md5", crypto.md5("abc"))crypto.hmac_md5(str, k…...
自动化测试的定位及一些思考
大家对自动化的理解,首先是想到Web UI自动化,这就为什么我一说自动化,公司一般就会有很多人反对,因为自动化的成本实在太高了,其实自动化是分为三个层面的(UI层自动化、接口自动化、单元测试)&a…...
展会动态 | 迪捷软件邀您参加2023世界智能网联汽车大会
*9月18日之前注册的观众免收门票费* 由北京市人民政府、工业和信息化部、公安部、交通运输部和中国科学技术协会联合主办的2023世界智能网联汽车大会将于9月21日-24日在北京中国国际展览中心(顺义馆)举行。 论坛背景 本届展会以“聚智成势 协同向新——…...
jenkins自动化部署springboot、gitee项目
服务器需要安装jdk11、maven、gitee 1. jenkins安装 # yum源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo # 公钥 sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key # 安装 yum install jenkins如果yum源报…...
Python环境配置及基础用法Pycharm库安装与背景设置及避免Venv文件夹
目录 一、Python环境部署及简单使用 1、Python下载安装 2、环境变量配置 3、检查是否安装成功 4、Python的两种模式(编辑模式&交互模式) 二、Pycharm库安装与背景设置 1、Python库安装 2、Pycharm自定义背景 三、如何避免Venv文件夹 一、P…...
PHP常见的SQL防注入方法
利用Mysqli和PDO 产生原因主要就是一些数据没有经过严格的验证,然后直接拼接 SQL 去查询。导致产生漏洞,比如: $id $_GET[id]; $sql "SELECT name FROM users WHERE id $id";因为没有对 $_GET[‘id’] 做数据类型验证…...
分布式和中间件等
raft协议 paxos算法ddos 如何避免?怎么预防?怎么发现?利用了TCP什么特点?怎么改进TCP可以预防?服务端处理不了的请求怎么办?连接数最大值需要设置吗?怎么设置? Thrift RPC过程是什么样子的?异构系统怎么完成通信?跟http相比什么优缺点?了解grpc吗?kafka topic part…...
通过http发送post请求的三种Content-Type分析
通过okhttp向服务端发起post网络请求,可以通过Content-Type设置发送请求数据的格式。 常用到的三种: 1)application/x-www-form-urlencoded; charsetutf-8 2)application/json; charsetutf-8 3)multipart/form-dat…...
Vue中的自定义指令详解
文章目录 自定义指令自定义指令-指令的值(给自定义指令传参数) 自定义指令 自定义指令:自己定义的指令,可以封装一些dom 操作,扩展额外功能(自动聚焦,自动加载,懒加载等复杂的指令封…...
[管理与领导-100]:管理者到底是什么?调度器?路由器?交换机?监控器?
目录 前言: 二层交换机 三层路由器 监视器(Monitor) 调度器 前言: 人在群体中,有点像设备在网络中,管理者到底承担什么的功能? 二层交换机 交换机是计算机网络中,用于连接多台…...
保研CS/软件工程/通信问题汇总
机器学习 1.TP、TN、FP、FN、F1 2.机器学习和深度学习的区别和联系 模型复杂性:深度学习是机器学习的一个子领域,其主要区别在于使用深层的神经网络模型。深度学习模型通常包含多个隐层,可以学习更加复杂的特征表示,因此在某些任…...
word、excel、ppt转为PDF
相关引用对象在代码里了 相关依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency> <dependency><groupId>org.apache.poi</group…...
2023华为杯D题——基于Kaya模型的碳排放达峰实证研究
一、前言 化石能源是推动现代经济增长的重要生产要素,经济生产活动与碳排放活动密切相关。充分认识经济增长与碳排放之间的关系对转变生产方式,确定碳达峰、碳中和路径极为必要。本研究在对经济增长与碳排放关系现有研究梳理的基础上,系统地分…...
有哪些好用的上网行为管理软件?(上网行为管理软件功能好的软件推荐)
随着互联网的快速发展,企业的信息化管理和员工的上网行为已经成为企业信息化建设的重要组成部分。上网行为管理软件作为一种新型的管理工具,可以帮助企业实现对员工上网行为的管控和优化,进而提高企业的工作效率和网络安全。本文将对多款市场…...
npm install报错 code:128
报的错误: npm ERR! code 128 npm ERR! An unknown git error occurred npm ERR! command git --no-replace-objects ls-remote ssh://gitgithub.com/nhn/raphael.git npm ERR! gitgithub.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote re…...
爬虫 — Scrapy 框架(一)
目录 一、介绍1、同步与异步2、阻塞与非阻塞 二、工作流程三、项目结构1、安装2、项目文件夹2.1、方式一2.2、方式二 3、创建项目4、项目文件组成4.1、piders/__ init __.py4.2、spiders/demo.py4.3、__ init __.py4.4、items.py4.5、middlewares.py4.6、pipelines.py4.7、sett…...
Python编程语言学习笔记
目录 1 书写格式1.1 程序框架格式1.1 注释1.2 保留字 2 数据2.1 整数类型2.2 浮点类型2.3 复数类型2.4 数值运算符2.5 数值运函数2.6 数值类型转换函数2.7 math 库2.8 字符串2.8.1 字符串的表示2.8.2 字符串的区间访问2.8.3 字符串操作符2.8.4 字符串操作函数 2.9 字符串类型的…...
【运维面试100问】(三)说说你在故障排除方面的经历
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
Postman 全局配置接口路径变量等
Postman 全局配置接口路径变量等 一、简介 这里主要是介绍通过配置postman接口测试工具,简化每次新增模块等接口时修改url的繁琐过程,方便以后查阅!!! 二、全局变量设置 1、新增测试环境 新增测试环境 2、接口集合设…...
一文掌握CodiMD安装与使用
简介:CodiMD 是一个基于 Markdown 语言的实时协作文档编辑器,它允许多个用户在同一个文档上进行实时编辑。CodiMD 的前身是 HackMD,但为了满足更开放的开源社区需求,CodiMD 作为其社区版本独立出来。 优势: 1. 开源且…...
无人机顶会顶刊2023
无人机顶会顶刊2023 国际期刊1、Science Robotics2、IEEE Transactions on Robotics(TRO)3、IEEE Transactions on Automation Science and Engineering(TASE)4、International Journal of Robotics Research(IJRR)5、IEEE Robotics and Automation Lett…...
【Java毕设项目】基于SpringBoot+Vue校园便利平台的设计与实现
博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…...
03Nginx的静态资源部署,反向代理,负载均衡,动静分离的配置
Nginx具体应用 部署静态资源 Nginx相对于Tomcat处理静态资源的能力更加高效,所以在生产环境下一般都会将Nginx可以作为静态web服务器来部署静态资源 静态资源: 在服务端真实存在并且能够直接展示的一些html页面、css文件、js文件、图片、视频等资源文件将静态资源部署到Ngin…...
刷题笔记24——完全二叉树的节点个数
有些事情是不能告诉别人的,有些事情是不必告诉别人的,有些事情是根本没有办法告诉别人的,而且有些事情是,即使告诉了别人,你也会马上后悔的。——罗曼罗兰 222. 完全二叉树的节点个数 java的幂运算要 (int) Math.pow(2,l1)-1计算满二叉树的节点数量公式:2 ^ height…...
sentinel环境搭建以及微服务接入
• sentinel部署 • sentinel-镜像制造 • sentinel-镜像推送 • sentinel-部署配置文件 • 访问控制台 • 外网访问控制台 • 集群内访问 • 配置规则 • 限流效果 • 微服务接入 • pom文件引入依赖 • pod部署文件添加配置 Sentinel 控制台是流量控制、熔断降级规则统一配置…...
Klotski: Efficient Obfuscated Execution against Controlled-Channel Attacks
标题:Klotski: Efficient Obfuscated Execution against Controlled-Channel Attacks 作者:Pan Zhang,Chengyu Song,Heng Yin,Deqing Zou,Elaine Shi and Hai Jin 发布:ASPLOS【计算机体系结构顶会】 时间:2020 摘要 Intel Soft…...
镇江网站建设 的公司/腾讯企点下载
什么是gerber文件 Gerber文件是所有电路设计软件都可以产生的文件,在电子组装行业又称为模版文件(stencil data),在PCB制造业又称为光绘文件。可以说Gerber文件是电子组装业中最通用最广泛的文件格式。因此对于一个电子生产企业,拥…...
怎么宣传自己的网站推广/百度关键词排名技术
Cobar执行流程:...
太原做网站的鸣蝉公司/网页百度网盘
来源:http://www.open-open.com/news/view/102a2de 特性一:正则表达式 相信大家都会非常喜欢这个特性,无须服务器端的检测,使用浏览器的本地功能就可以帮助你判断电子邮件的格式,URL,或者是电话格式&#x…...
响应式网站排名/网络网站推广选择乐云seo
1、C工程的组成c程序是由一个或者多个.c文件和.h文件组成的。其中 .c文件是c源代码文件,是程序具体实现的部分。.h文件时C的头文件,用来声明.c文件中函数的。也可以申明自定义的数据。如下图,我定义了一个宏:#define kAD_MAX_DIM …...
有什么教做甜品的网站/广州信息流推广公司
2019独角兽企业重金招聘Python工程师标准>>> 江苏省钢铁行业联合重组正在酝酿中。重组目标设定为全省前4家钢铁企业占全省粗钢产能比例争取超过80%,前8家产能占比力争达到100%。这意味着,未来江苏省内的合规钢铁企业有望整合为8大企业集团&am…...
外贸网站开发莆田/陕西网站建设制作
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 打印99乘法表 解题思路 外层循环,获取被乘数内层循环,获取乘数 答案 for i in …...