数据结构——lesson3单链表介绍及实现
目录
1.什么是链表?
2.链表的分类
(1)无头单向非循环链表:
(2)带头双向循环链表:
3.单链表的实现
(1)单链表的定义
(2)动态创建节点
(3)单链表打印
(4)单链表尾插
(5)单链表头插
(6)单链表尾删
(7)单链表头删
(8)单链表查找
(9)单链表在pos位置之后插入
(10)单链表在pos位置之前插入
(11)单链表删除pos位置的节点
(12)单链表销毁
4.运行结果
5.结语
1.什么是链表?
可以看出链表有两个变量,一个存放数据,另一个存放指向下一节点的指针;
此外链表还具有以下特征:
(1)链表在逻辑上连续,但在物理上不一定连续;
(2)链表的节点在现实中一般都是在堆上开辟出来的,所以使用结束后需要释放空间;
(3)从堆上申请的空间是按照一定策略分配的,所以物理空间可能连续也可能不连续。
2.链表的分类
链表按单向双向、无头带头、循环非循环可分为多种,这里我们介绍最常用的两种——无头单向非循环链表、带头双向循环链表。本篇文章将详细介绍无头单向非循环链表(简称单链表)的增删查改等的实现。
(1)无头单向非循环链表:
(2)带头双向循环链表:
3.单链表的实现
(1)单链表的定义
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;//存放数据struct SListNode* next;//存放下一个节点的指针
}SListNode;
结构体定义两个变量,一个是SLDataType类型的数据,另一个时结构体的指针用来存放下一节点指针;
(2)动态创建节点
//申请新的节点,返回指向节点的指针
SListNode* BuySListNode(SLTDateType x)
{SListNode* buynode = (SListNode*)malloc(sizeof(SListNode));buynode->data = x;buynode->next = NULL;return buynode;
}
(3)单链表打印
// 单链表打印
void SListPrint(SListNode* plist)
{//assert(plist);//没有节点,指针为空,断言,为空也可打印空指针所以不需要断言SListNode* psl = plist;//用一个临时变量接收,如果不喜欢也可以不用while (psl)//利用while循环遍历单链表{printf("%d->", psl->data);//打印单链表指向的数据psl = psl->next;//继续循环}printf("%d->NULL\n");//最后一个不要漏了
}
(4)单链表尾插
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{assert(pplist);//断言二级指针SListNode* buy = BuySListNode(x);assert(buy);//判断节点是否开辟成功SListNode* psl= *pplist;//创建一个新的变量if (psl == NULL)//如果是一个节点都没有的情况{*pplist = buy;//需要将头指针改变(原本头指针是NULL)所以需要节点指针的指针return;}while (psl->next)//如果已经有节点的情况{psl = psl->next;//通过next遍历链表找到最后的节点}psl->next = buy;//将最后节点的next改成buy节点的指针,所以需要节点的指针即可,不需要二级指针}
pplist是指向链表第一个节点指针的指针,是二级指针,所以一定不为空,要用assert断言;
(5)单链表头插
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{assert(pplist);SListNode* buy = BuySListNode(x);assert(buy);//判断节点是否开辟成功SListNode* psl = *pplist;if (*pplist == NULL)//如果一个节点都没有的情况{*pplist = buy;//需要将头指针改变(原本头指针是NULL)所以需要节点指针的指针return;}//有节点的情况buy->next = psl;//需要通过next连接新节点*pplist = buy;//通过节点的指针的指针改变节点的指针
}
要注意有两种情况一直是没有一个节点的情况即*pplist = NULL,另一种是有节点的情况;
传二级指针的作用就是为了改变指针plist,所以需要指针的指针pplist;
(6)单链表尾删
// 单链表的尾删
void SListPopBack(SListNode** pplist)
{assert(pplist);assert(*pplist);//删除节点要判断有没有节点SListNode* psl = *pplist;if (psl->next == NULL)//只有一个节点时{free(psl);//释放最后一个节点的空间*pplist = NULL;//尾指针置空return;}while (psl->next->next)//多个节点时找到倒数第二个节点{psl = psl->next;}free(psl->next);psl->next = NULL;//尾指针置空
}
单链表尾删同样要注意两种情况;使用free释放指针指向的空间;
(7)单链表头删
// 单链表头删
void SListPopFront(SListNode** pplist)
{assert(pplist);assert(*pplist);//删除节点要判断有没有节点SListNode* psl = *pplist;if (psl->next == NULL)//只有一个节点时{free(psl);*pplist = NULL;return;}//多个节点时*pplist = psl->next;//将第二个节点的指针给头指针free(psl);//释放第一个节点的空间
}
(8)单链表查找
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{assert(plist);//查找节点要判断有没有节点SListNode* psl = plist;while (psl){if (psl->data == x){return psl;//找到了返回psl}psl = psl->next;}return NULL;//没找到返回空指针
}
(9)单链表在pos位置之后插入
// 单链表在pos位置之后插入xvoid SListInsertAfter(SListNode* pos, SLTDateType x)
{assert(pos);SListNode* buy = BuySListNode(x);assert(buy);//判断节点是否开辟成功//if (pos->next == NULL)//{// pos->next = buy;//将最后节点的next改成buy节点的指针 // return;//}buy->next = pos->next;//只有一个节点和多个节点一样pos->next = buy;
}
思考分析这两行代码可不可以调换一下顺序呢?
buy->next = pos->next;//只有一个节点和多个节点一样
pos->next = buy;
答案是不能,我们看到如果交换顺序,先将buy赋值给pos->next,那么pos->next的值将会被改变,而我们需要在buy->next中保存原来的pos->next,所以不能调换顺序;
如果你想要换也可以通过创建一个临时变量来存储pos->next的方式实现.例如:
SListNode* cur = pos->next;
pos->next = buy;
buy->next = cur;
(10)单链表在pos位置之前插入
// 在pos的前面插入
void SLTInsert(SListNode** pphead, SListNode* pos, SLTDateType x)
{//assert(pphead);assert(pos);SListNode* buy = BuySListNode(x);assert(buy);//判断节点是否开辟成功SListNode* psl = *pphead;if (psl->next == NULL)//只有一个节点{buy->next = pos;*pphead = buy;return;}while (psl->next != pos)//多个节点{psl = psl->next;}buy->next = pos;psl->next = buy;
}
(11)单链表删除pos位置的节点
// 删除pos位置
void SLTErase(SListNode** pphead, SListNode* pos)
{assert(pos);SListNode* psl = *pphead;if (psl->next == NULL)//只有一个节点,类似于头删{free(pos);pos = NULL;*pphead = NULL;return;}while (psl->next != pos)//多个节点{psl = psl->next;}//此时psl->next = pos;psl->next = pos->next;将pos位置指向的下一个节点指针赋给psl->nextfree(pos);pos = NULL;}
删除pos位置也要注意有两种情况;
(12)单链表销毁
void SLTDestroy(SListNode** pphead)
{assert(pphead);SListNode* psl = *pphead;SListNode* psll = *pphead;while (psl != NULL){free(psll);psl = psl->next;psll = psl;}*pphead = NULL;
}
4.运行结果
5.结语
以上就是今天学习的内容了,单链表的实现关键在于理解它的逻辑结构,包括两个变量,一个是指向数据,另一个则指向下一节点的指针,此外,单链表实现还涉及了二级指针的内容以及动态内存函数的内容,涉及的代码知识更为广泛,但是只要抓住了关键点就会发现每个函数的中心思想都是不变的,好了以上就是今天学习的内容啦,有什么问题欢迎大家在评论区指出或者私信我哦~
相关文章:
数据结构——lesson3单链表介绍及实现
目录 1.什么是链表? 2.链表的分类 (1)无头单向非循环链表: (2)带头双向循环链表: 3.单链表的实现 (1)单链表的定义 (2)动态创建节点 &#…...
中科大计网学习记录笔记(八):FTP | EMail
前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…...
QPaint绘制自定义坐标轴组件00
最终效果 1.创建一个ui页面,修改背景颜色 鼠标右键->改变样式表->添加颜色->background-color->选择合适的颜色->ok->Apply->ok 重新运行就可以看到widget的背景颜色已经改好 2.创建一个自定义的widget窗口小部件类,class MyChart…...
MATLAB|基于改进二进制粒子群算法的含需求响应机组组合问题研究(含文献和源码)
目录 主要内容 模型研究 1.改进二进制粒子群算法(BPSO) 2.模型分析 结果一览 下载链接 主要内容 该程序复现《A Modified Binary PSO to solve the Thermal Unit Commitment Problem》,主要做的是一个考虑需求响应的机组组合…...
JDBC核心技术
第1章 JDBC概述 第2章 获取数据库连接 第3章 使用PreparedStatement实现CRUD操作 第4章 操作BLOB类型字段 第5章 批量插入 第6章 数据库事务 第7章 DAO及相关实现类 第8章 数据库连接池 第9章 Apache-DBUtils实现CRUD操作图像 小部件...
【天幕系列 02】开源力量:揭示开源软件如何成为技术演进与社会发展的引擎
文章目录 导言01 开源软件如何推动技术创新1.1 开放的创新模式1.2 快速迭代和反馈循环1.3 共享知识和资源1.4 生态系统的建设和扩展1.5 开放标准和互操作性 02 开源软件的商业模式2.1 支持和服务模式2.2 基于订阅的模式2.3 专有附加组件模式2.4 开源软件作为平台模式2.5 双重许…...
“挖矿”系列:细说Python、conda 和 pip 之间的关系
继续挖矿,挖“金矿”! 1. Python、conda 和 pip(挖“金矿”工具) Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具,它们各自有不同的作用,但相互之间存在密切的关系: Python&…...
【自然语言处理】实验3,文本情感分析
清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现(实验满分),只展示主要任务实验结果,如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题,也欢…...
2.12日学习打卡----初学RocketMQ(三)
2.12日学习打卡 目录: 2.12日学习打卡一. RocketMQ高级特性(续)消息重试延迟消息消息查询 二.RocketMQ应用实战生产端发送同步消息发送异步消息单向发送消息顺序发送消息消费顺序消息全局顺序消息延迟消息事务消息消息查询 一. RocketMQ高级特…...
<网络安全>《35 网络攻防专业课<第一课 - 网络攻防准备>》
1 主要内容 认识黑客 认识端口 常见术语与命令 网络攻击流程 VMWare虚拟环境靶机搭建 2 认识黑客 2.1 白帽、灰帽和黑帽黑客 白帽黑客是指有能力破坏电脑安全但不具恶意目的黑客。 灰帽黑客是指对于伦理和法律态度不明的黑客。 黑帽黑客经常用于区别于一般(正面…...
【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)
文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试?5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…...
蓝桥杯Java组备赛(二)
题目1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int max Integer.MIN_VALUE;int min Integer.MAX_VALUE;double sum 0;for(int i0;i<n;i) {int x sc.nextInt()…...
人力资源智能化管理项目(day10:首页开发以及上线部署)
学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 首页-基本结构和数字滚动 安装插件 npm i vue-count-to <template><div class"dashboard"><div class"container"><!-- 左侧内…...
Conda管理Python不同版本教程
Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda设置国内源(以添加清华源为例,阿里云源同样) 3.conda管理python库 4.其它 不太推荐 pyenv管理Python不同版本教程(本人另一篇博客,姊妹篇&…...
free pascal:fpwebview 组件通过 JSBridge 调用本机TTS
从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr ,编写 js_bind_speak.lpr 如下,通过 JSBridge 调用本…...
数据结构——单链表专题
目录 1. 链表的概念及结构2. 实现单链表初始化尾插头插尾删头删查找在指定位置之前插入数据在指定位置之后插入数据删除指定位之前的节点删除指定位置之后pos节点销毁链表 3. 完整代码test.cSList.h 4. 链表的分类 1. 链表的概念及结构 在顺序表中存在一定的问题: …...
Linux:开源世界的王者
在科技世界中,Linux犹如一位低调的王者,统治着开源世界的半壁江山。对于许多技术爱好者、系统管理员和开发者来说,Linux不仅仅是一个操作系统,更是一种信仰、一种哲学。 一、开源的魅力 Linux的最大魅力在于其开源性质。与封闭的…...
⭐北邮复试刷题103. 二叉树的锯齿形层序遍历 (力扣每日一题)
103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1:输入:…...
文件上传漏洞--Upload-labs--Pass07--点绕过
一、什么是点绕过 在Windows系统中,Windows特性会将文件后缀名后多余的点自动删除,在网页源码中,通常使用 deldot()函数 对点进行去除,若发现网页源代码中没有 deldot() 函数,则可能存在 点绕过漏洞。通过点绕过漏洞&…...
MySQL高级特性篇(1)-JSON数据类型的应用
MySQL是一种常用的关系型数据库管理系统,它提供了多种数据类型,其中包括JSON数据类型。JSON(JavaScript Object Notation)是一种常用的数据交换格式,它以键值对的形式组织数据,并支持嵌套和数组结构。MySQL…...
如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口
在Qt框架中,要实现一个无标题栏、半透明、置顶(悬浮)的窗口,需要一些特定的设置和技巧。废话不多说,下面我将以DrawClient软件为例,介绍一下实现这种效果的四个要点。 要点一:移除标题栏&#…...
ViT: transformer在图像领域的应用
文章目录 1. 概要2. 方法3. 实验3.1 Compare with SOTA3.2 PRE-TRAINING DATA REQUIREMENTS3.3 SCALING STUDY3.4 自监督学习 4. 总结参考 论文: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 代码:https://github.com…...
Sora 的工作原理(及其意义)
原文:How Sora Works (And What It Means) 作者: DAN SHIPPER OpenAI 的新型文本到视频模型为电影制作开启了新篇章 DALL-E 提供的插图。 让我们先明确一点,我们不会急急忙忙慌乱。我们不会预测乌托邦或预言灾难。我们要保持冷静并... 你…...
Java学习笔记2024/2/16
知识点 面向对象 题目1(完成) 定义手机类,手机有品牌(brand),价格(price)和颜色(color)三个属性,有打电话call()和sendMessage()两个功能。 请定义出手机类,类中要有空参、有参构造方法,set/get方法。 …...
XLNet做文本分类
import torch from transformers import XLNetTokenizer, XLNetForSequenceClassification from torch.utils.data import DataLoader, TensorDataset # 示例文本数据 texts ["This is a positive example.", "This is a negative example.", "Anot…...
Swift 5.9 新 @Observable 对象在 SwiftUI 使用中的陷阱与解决
概览 在 Swift 5.9 中,苹果为我们带来了全新的可观察框架 Observation,它是观察者开发模式在 Swift 中的一个全新实现。 除了自身本领过硬以外,Observation 框架和 SwiftUI 搭配起来也能相得益彰,事倍功半。不过 Observable 对象…...
分享一个学英语的网站
名字叫:公益大米网 Freerice 这个网站是以做题的形式来记忆单词,题干是一个单词,给出4个选项,需要选出其中最接近题干单词的选项。 答对可以获得10粒大米,网站的创办者负责捐赠。如图 触发某些条件&a…...
【动态规划】【C++算法】2742. 给墙壁刷油漆
作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 LeetCode2742. 给墙壁刷油漆 给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有…...
【后端高频面试题--设计模式上篇】
🚀 作者 :“码上有前” 🚀 文章简介 :后端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 往期精彩内容 【后端高频面试题–设计模式上篇】 【后端高频面试题–设计模式下篇】 【后端高频…...
P3141 [USACO16FEB] Fenced In P题解
题目 如果此题数据要小一点,那么我们可以用克鲁斯卡尔算法通过,但是这个数据太大了,空间会爆炸,时间也会爆炸。 我们发现,如果用 MST 做,那么很多边的边权都一样,我们可以整行整列地删除。 我…...
网站后台图片滚动效果怎么做/公众号免费推广平台
PCL点云交流群 应粉丝的要求,建了一个PCL点云库学习的交流QQ群,大家可以加入并交流自己学习中遇到的问题。扫码入群。 如需点云技术支持,可加QQ905733049,由专业技术人员远程协助!...
河南网站建设设计价格/软件外包公司排名
转载自https://www.cnblogs.com/shimily/articles/10702011.html 微信小程序开发文档中针对picker做了详细的解释,但根据笔者的使用,发现了一个好玩的地方。 先针对picker 普通选择器:mode selector 这个模式说下属性吧 上图是微信小程序…...
内蒙古企业网站建设/seo外链平台
最近做了个小项目,主要是来备份自己在抖音里面发的一些作品到自己的电脑本地。因为这两年陆陆续续在抖音和tiktok里面已经发了不少作品了。最近又有消息说tiktok部分业务要被卖了。所以想把自己这两年陆续发的一些作品保存到自己的电脑里面,也保证到一份…...
高新企业如何在税务网站做备案/网上营销模式
有过几次这样的经历,在和朋友聊了很久都没有聊出一点什么有价值的东西以至于都想不再聊下去了,但是还是依然聊下去,我是一个不怎么会中断聊天的人。也就是在往下继续尴聊的过程中就无意间说出有价值的一个点。 想到什么马上开干,不…...
佛山找人做网站/电商运营工资大概多少
前阵子去淘宝的暑期实习生去笔试,遇到这样一个题:要求一个数组连续下标和的最大值,数组的元素可正、可负、可为零,例如-2,5,3,-6,4,-8,6将返回8。 这题嘛&…...
wordpress 主题面板/武汉官网优化公司
[]中括号用来构建向量(Vectors)或者是矩阵(Matrices)。 如[6.9 9.64 sqrt(-1)] 就是一个有三个元素的向量。[11 12 13; 21 22 23] 是一个二乘三的矩阵。分号(;)用来结束一行。中括号的另一个作用是在函数中,分配输出参数。 {}大括号,用于cell型的数组的分…...