链表——单链表的简单介绍

news2024/11/25 22:31:28

前提须知:

顺序表的简单介绍_明 日 香的博客-CSDN博客

顺序表的缺点:

  • 从之前的博客中,我们得知,顺序表的本质实际上是一种数组。
  • 而数组的最大特征就是连续的空间。
  • 也因此,在线性表中,顺序表是一种物理上和逻辑上都连续的直线。

但是因为物理意义上的连续,顺序表有着众多的不便之处:

  • 空间的浪费和多余
  • 开辟空间时,所在空间的结余不多,会出现重新开辟和拷贝数据的操作,具体参考realloc函数调整空间的操作,realloc-CSDN博客 

链表:

  • 因为顺序表的不足之处,从而产生了链表。
  • 链表在线性表中,是一个逻辑上连续,但是物理上并不连续的结构。
  • 链表实质上是由多个节点,依次链接构成的一个类火车车厢的结构类型,每一个节点都是独立存在的。

图例:

  • 如图所示,plist就如同火车的车头,车头连接着车厢,这个链接点是靠车头内的地址来进行指引的。 
  • 同样,车厢和车厢之间也是靠着地址进行联系。
  • 而地址,是需要存储在指针中才会起到链接作用。
  • 所以,每一个节点分为了两个部分,一个是需要进行存储的数据,一个是指向下一个节点的指针,这个指针中存储的是下一个节点的地址!

单链表的创建: 

  • 与其说是单链表的创建,不如说是单链表的节点的创建。 

  • 如图,data是存储节点的数据,next是节点结构体类型,指向的是下一个节点,存储是下一个节点的地址。
  • 同时注意,因为我们为了之后的方便,对节点结构体进行了重命名操作,但是在节点结构体成员中,指向下一个节点的指针 这个成员的类型,不能使用重命名后的结构体名字作为类型。 

 创建几个节点组成一个链表,并打印链表

在创建节点和打印节点之前,我们要创造一个 “火车车头”   

SLNode*phead就是火车车头,它指向的是第一个节点,所以它是指针,其中SLNode*则是指针的类型,因为节点是结构体类型的。

头文件部分: (打印函数头文件部分)

打印部分:

打印部分的关键在于循环遍历,因此使用循环结构

而循环结构的判定关键在于下一个节点是否存在,这与链表的结构有着密切的关系。

 如图我们得知,链表结束的标志其实就是是否存在下一个节点,而判断下一个节点是否存在就是看节点内,指向下一个节点的指针指向的是否是NULL 

而同时,循环遍历的关键也是寻找下一个节点是否存在,如若存在,变需要将当前指针变为下一个节点中的指针,指向更后面的节点。

  • 因为指针需要进行更变,从指向当前节点的指针,变为指向下一个节点的指针,且为了进行循环,所以这就需要pcur= pcur->next 

 

主函数部分: 

数据的插入:

相比于顺序表,链表的每一个节点都是单独存在的,所以直接使用malloc对内存进行空间的申请 

指针的插入:

  • data是指向节点中的数据
  • next是节点中,指向下一个节点的指针 

“火车头的安装”和打印函数的调用: 

需要对火车头进行存放第一个节点的地址! 

 

打印效果:

前提注意:

操作中的调用函数里面的  最开始的  形参中的指针变量    其实指向的是“火车头” 

尾插: 

  • 本质上,尾插操作就是向内存申请空间,然后存入数据和指向下一个节点的指针,以及将自己的地址交给上一个节点。 
  • 但是,尾插也分为两种情况。
  • 第一种便是当前的链表为空,这时就直接将自己新开辟的空间地址交予火车头即可
  • 第二种便是链表不为空,这时我们需要寻找当前链表最后面一个节点内部的指向下一个节点的指针,将其从NULL变为新开辟空间的地址。

 但是!无论是第一种情况还是第二种情况,我们都需要向内存申请一个空间,进行存放我们需要插入的数据所以我们再次之前创建一个开辟空间的函数,在尾插函数中进行调用

开辟空间函数: 

  1. x表示插入的数据
  2. node表示当前空间的地址,或者说是当前空间结构体的变量名
  3. 将指向下一个空间的指针变为NULL
  4. 同时最后返回当前空间的地址,以便尾插的操作 

注意事项: 

  • 在进行尾插操作之前,还需要注意一点,别被指针变量迷惑!
  • 因为我们要改变的是指针变量内部的 节点内的 指针的地址内容 ,而地址内容被一层指针包裹,所以!这里需要使用的是二级指针! 

头文件: 

源文件:

  • 当为链表空时,直接将新开辟的空间地址交给“火车头” (SLNdoe**PPhead)
  • 不为空的时候,需要进行遍历循环操作,找到最后一个节点的指向下一个节点的指针,然后传给这个指针新开辟的地址。

 

 

 

 

 

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

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

相关文章

[每周一更]-(第67期):docker-compose 部署php的laravel项目

容器化部署laravel框架的php项目 操作步骤 参考: https://www.cnblogs.com/jingjingxyk/p/16842937.htmlhttps://developer.aliyun.com/article/708976 0、plv项目修改 composer install.env 修改后台地址 IP:端口chmod -R 777 public / chmod -R 777 storagevi…

ELK下载(Elasticsearch、Logstash、Kibana)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Simple RPC - 01 框架原理及总体架构初探

文章目录 概述RPC 框架是怎么调用远程服务的?客户端侧的逻辑服务端侧的逻辑完整流程 客户端是如何找到服务端地址的呢?核心:NamingService跨语言的RPC实现原理 RPC 框架的总体结构对外接口服务注册中心如何使用业务服务接口客户端服务端 模块…

【数据结构】:栈的实现

1 栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则 压栈…

Linux实现原理 — I/O 处理流程与优化手段

Linux I/O 接口 Linux I/O 接口可以分为以下几种类型: 文件 I/O 接口:用于对文件进行读写操作的接口,包括 open()、read()、write()、close()、lseek() 等。 网络 I/O 接口:用于网络通信的接口,包括 socket()、conne…

多目标鳟海鞘算法(Multi-objective Salp Swarm Algorithm,MSSA)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标鳟海鞘算法MSSA 多…

Go持续改进与代码审查

通过Golang提高软件质量 在快节奏的软件开发世界中,保持领先至关重要。在实现软件工程卓越的基石之一是持续改进的实践,而在这个旅程中的一个关键工具是代码审查过程。在本文中,我们将深入探讨持续改进的重要性,并探讨代码审查在…

【数据结构-字符串 三】【栈的应用】字符串解码

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

Android位置服务和应用权限

Github:https://github.com/MADMAX110/Odometer 一、使用位置服务 之前的Odometer应用是显示一个随机数,现在要使用Android的位置服务返回走过的距离。 修改getDiatance方法使其返回走过的距离,为此要用Android的位置服务。这些服务允许你得到用户的当…

当10年程序员是什么体验?存款几位数?

最近网上一个话题吸引了许多人的讨论,当10年程序员,是一种什么体验? 都说程序员的高收入和工作年限应该成正比,真的是这样吗?工作10年的程序员,工资应该是什么水平?不少网友纷纷“现身说法”..…

qt中json类

目录 QJsonValue QJsonObject QJsonArray QJsonDocument 案例: Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析,下面介绍4个常用的类。 QJsonValue 该类封装了JSON支持的数据类型。 布尔类型&#xf…

希尔贝壳受邀参加《人工智能开发平台通用能力要求 第4部分:大模型技术要求》标准第一次研讨会

随着大模型技术与经验的不断累积,该方向也逐渐从聚焦技术突破,到关注开发、部署、应用的全流程工程化落地。为完善人工智能平台标准体系建设,满足产业多样化需求,2023年9月7日,中国信通院云大所在线上召开《人工智能开…

C# Thread.Sleep(0)有什么用?

一、理论分析 回答这个要先从线程时间精度(时间片)开始说起。很多参考书说,默认情况下,时间片为15ms 左右,但是这是已经过时的知识。在老的 Windows 操作系统里,应用程序模式时时间片 15ms 左右&#xff0…

Jwt简介+工具类应用+Jwt集成spa项目

目录 一、Jwt简介 1.1 Jwt是什么 1.2 为什么使用Jwt 1.3 Jwt的工作原理 1.4 Jwt的组成 1.5 Jwt的验证过程 1.6 JWT令牌刷新思路 二、Jwt工具类 2.1 Jwt工具类是什么 2.2 Jwt工具类的使用 2.2.1 生成Jwt 2.2.2 解析Jwt 2.2.3 复制JWT并延时30分钟 2.2.4 测试JWT的有…

修复画笔工具组

修复画笔工具组 修复画笔工具组包括污点修复画笔工具、修复画笔工具、修补工具、内容感知移动工具和红眼工具,主要用于图像的修复或修补。 一、污点修复画笔工具 污点修复画笔工具可以去除图像中的污点、裂痕等不理想的部分,将其用与周围相似的图形来填充…

pc端使用微信扫码登录(思路篇)

我们在PC端网页中登录的时候有些需要微信扫码登录 例如CSDN网站登录 扫描之后 需要关注公众号 关注公众号就登录成功了 如何实现 流程图 步骤 1.pc端点击登录向业务服务器请求要登录二维码 2.业务服务器拿到用户端唯一参数或socketId(使用websocket连接&#x…

10款精选的后台管理系统

1.vue2-manage 此项目是 vue element-ui 构建的后台管理系统,是后台项目node-elm 的管理系统,所有的数据都是从服务器实时获取的真实数据,具有真实的注册、登陆、管理数据、权限验证等功能。 项目地址:https://github.com/baili…

NSDT孪生编辑器助力智慧城市

技术有能力改变城市的运作方式,提高效率,为游客和居民提供更好的体验,实现更可持续的运营和更好的决策。 当今城市面临的主要挑战是什么,成为智慧城市如何帮助克服这些挑战? 我们生活在一个日益城市化的世界&#xf…

【Java 进阶篇】JavaScript Array数组详解

当我们编写JavaScript代码时,经常需要处理一组数据。JavaScript中的数组(Array)是一种用于存储多个值的数据结构,它提供了许多方法和功能,使我们能够方便地操作这些数据。在本篇博客中,我们将详细探讨JavaS…

【Linux初阶】多线程2 | 分离线程,线程库,线程互斥,可重入VS线程安全,锁的常见概念

文章目录 ☀️一、分离线程🌻1.pthread_ self - 获取线程ID🌻2.线程分离 ☀️二、用户级线程库🌻1.pthread_t🌻2.理解用户级线程库 - pthread库🌻3.局部存储 ☀️三、线程互斥🌻1.线程间的互斥相关概念&…