单链表详解(如何实现单链表)

ab26cc04595f467d978356fbb6c6fd0a.gif

文章目录

前言

  • 一、单链表是什么?
  • 二、单链表的实现
  • 总结

顺序表的缺点

1.中间/头部的插入删除,时间复杂度为O (N)
2.realloc 扩容(特别是异地扩,需要申请新空间,拷贝数据,释放旧空间)会有不小的消耗。
3.增容一般是呈2倍的增长,势必会有一定的空间浪费。 例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间

针对顺序表的缺点,设计了链表


一、单链表是什么?

ae4dc5612f4840b997c5d7fe639174d1.png

链表是数据结构之一,其中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,就是访问比较耗费时间。

1.2结构

typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;}SLTNode;

这就是单链表的经典结构

其实一个链表还分逻辑模型和物理模型

逻辑模型

facb5ff9a1f74c09881685afa590cfea.png

物理模型

92872284be4e41a9bc2905ba7741dc99.png

二.单链表的实现(接口函数的实现)

2.1打印

打印只有一个细节就是cur = cur->next,cur是一个结构体指针,可以通过->去访问成员,他的意思就是往下去遍历。

void SListPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur != NULL){printf("%d->", cur->data);cur = cur->next;}
}

2.2检查扩容

和之前的顺序表的思路是一样的,单链表也是需要检查扩容的,如果满了就要扩,如果少了就要增。

SLTNode* BuyListNode(SLTDateType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));newnode->data = x;newnode->next = NULL;if (newnode == NULL){printf("malloc fail\n");exit(-1);}return newnode;
}

2.3尾插

a810a3fba58a46e2b266443f495b0cd2.png

利用两个指针,先检查扩容,如果是空的就增容,然后先找到尾,然后在把新开辟的内存链接起来就可以了。

void SListPushBack(SLTNode** pphead, SLTDateType x)
{SLTNode* newnode = BuyListNode(x);if (*pphead == NULL){*pphead = newnode;}else{//找到尾节点SLTNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}
}

2.4头插

6d9f0d68e1224f2b951b22a46f7cbd2f.png

注意要不要传2级指针,只有判断是否使用phead

void SListPushFront(SLTNode** pphead, SLTDateType x)
{SLTNode* newnode = BuyListNode(x);newnode->next = *pphead;*pphead = newnode;}

2.5尾删

尾删有两个方法,两个指针和单指针

两个指针法

将最后一组元素释放,在将最后一个元素置空,但是一个节点要单独考虑

void SListPopBack(SLTNode** pphead)
{assert(*pphead != NULL);if ((*pphead)->next = NULL){free(*pphead);*pphead = NULL;}else{SLTNode* prev = NULL;SLTNode* tail = *pphead;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;}
}

单指针法

void SListPopBack(SLTNode** pphead)
{SLTNode*tail=*pphead;	assert(*pphead != NULL);if ((*pphead)->next = NULL){free(*pphead);*pphead = NULL;}while(tail->next->next!=NULL){tail=tail->next;
}free(tail->next);tail->next=NULL;
}

2.6头删

保存下一节点next,删除头节,点将头节点赋值为next。

void SListPopFront(SLTNode** pphead)
{assert(*pphead != NULL);SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}

2.7查找

SLTNode* SListFind(SLTNode* phead, SLTDateType x)
{SLTNode* cur = phead;while (cur != NULL){if (cur->data == x){return cur;}else{cur = cur->next;}}return NULL;
}

2.8在pos位置之前去插入一个节点

5a565a46e4484286b8b3bb9c313c2270.png

先要找到他的位置,找到pos之前的位置

void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{SLTNode* newnode = BuyListNode(x);if (*pphead == pos){newnode->next = *pphead;*pphead = newnode;}else//找到pos之前的位置{SLTNode* posprev = *pphead;while (posprev->next != pos){posprev = posprev->next;}posprev->next = newnode;newnode->next = pos;}
}

2.8在pos位置之后去插入一个节点

void SListInsertAfter(SListNode* pos, SListData x)
{assert(pos);SListNode* newnode = BuyListNode(x);SListNode* next = pos->next;pos->next = newnode;pos->next->next = next;
}

2.9在pos位置去删去一个结点(头要特殊处理)

void SListInsert(SListNode** pphead, SListNode* pos, SListData x)
{assert(pphead);assert(pos);if (pos == *pphead) {*pphead=pos->next;free(pos);}else{SListNode* pre = *pphead;//找到前一个while (pre->next != pos)	{pre = pre->next;}pre->next = pos->next;//前一个指向后一个free(pos);}
}

3.0销毁,还原

void SListDestory(SLTNode**pphead)
{SLTNode*cur=*pphead;while(cur!=NULL)
{SLTNode*next=cur->next;free(cur);cur=next;
}*pphead=NULL;
}

 

 


总结

单链表的缺点就是不可以随机访问,而顺序表却可以做到,说明单链表也有缺陷,那什么结构可以让我们更好?只有继续的学习才会知道。

 

 

 

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

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

相关文章

多场成像,快速提高机器视觉检测能力--51camera

多阵列CMOS传感器与芯片级涂层二向色滤光片相结合,可在单次扫描中同时捕获明场、暗场和背光图像。 多场成像是一种新的成像技术,它可以在不同的光照条件下同时捕获多幅图像。再加上时间延迟积分(TDI),这种新兴的成像技术可以克服许多限制的传…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及台区资源聚合功率的中低压配电系统低碳优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

java-数据结构—树

目录 树的组成 节点 度 根节点 其他组成部分 二叉树 普通二叉树 二叉查找树 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 总结 平衡二叉树 平衡二叉树的旋转机制 左旋 右旋 需要旋转的四种情况 左左 左右 右右 右左 总结 红黑树 树的组成 节点…

【图(2)】:图的广度优先遍历和深度优先遍历

目录 图的遍历 一、图的广度优先遍历(bfs) 二、图的深度优先遍历 图的遍历 给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶点仅被遍历一次。"遍历"即对结点进行某种…

C++初阶:模板

目录 一.泛型编程 二.函数模板 2.1.函数模板的概念 2.2.函数模板的格式 2.3.函数模板的原理 2.4.函数模板的实例化 隐式实例化 显示实例化 2.5.模板参数的匹配原则 三.类模板 3.1.类模板的格式 3.2.类模板的实例化 3.3.在类模板外部定义成员函数 四.非类型模板参…

【保姆级】Protobuf详解及入门指南

目录 Protobuf概述 什么是Protobuf 为什么要使用Protobuf Protobuf实战 环境配置 创建文件 解析/封装数据 附录 AQin.proto 完整代码 Protobuf概述 什么是Protobuf Protobuf(Protocol Buffers)协议😉 Protobuf 是一种由 Google 开…

CrossOver2024实现Mac/Linux上快速运行Win软件和游戏

作为软件产品专家,我对各类软件都有较为深入的了解,下面介绍CrossOver2024这款软件的功能特点。 CrossOver2024是一款功能强大的类虚拟机软件,它的设计目标是在Mac和Linux系统上实现Windows软件和游戏的快速运行。这款软件不仅具有出色的兼容…

Windows下安装Kafka3

本文讲述Windows(win10)下安装Kafka3的方法。基本流程跟《CentOS下安装Kafka3》一样,也是一样需要先安装Java环境,再部署部署Kafka。 首先在官网 Apache Kafka 下载Kafka二进制压缩包。无论是在CentOS还是在Windows下都是下载该压缩包,里面已…

微信小程序实现上下手势滑动切换

效果图 思路 实现一个微信小程序的复合滚动页面&#xff0c;主要通过Swiper组件实现垂直方向的轮播功能&#xff0c;每个轮播项内部使用Scroll-View组件来展示可垂直滚动的长内容&#xff0c;如图片和文本。 代码 <!-- wxml --> <view class"swiper-container…

Vue 中的 key:列表渲染的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

vue+elementUI用户修改密码的前端验证

用户登录后修改密码&#xff0c;密码需要一定的验证规则。旧密码后端验证是否正确&#xff1b;前端验证新密码的规范性&#xff0c;新密码规范为&#xff1a;6-16位&#xff0c;至少含数字/字母/特殊字符中的两种&#xff1b;确认密码只需要验证与新密码是否一致&#xff1b; 弹…

Linux进程概念(1)

一、冯诺依曼体系结构 学过计组的同学应该都很熟悉这个结构&#xff0c;可以说这是计算机的基础了&#xff1a; 其实我们日常就经常使用到该结构中的各个部分&#xff1a; 输入单元&#xff1a;包括键盘, 鼠标&#xff0c;扫描仪等。 输出单元&#xff1a;显示器&#xff0c;…

粒子群算法优化RBF神经网络气体浓度预测

目录 完整代码和数据下载链接:粒子群算法优化RBF神经网络气体浓度预测,pso-rbf气体浓度预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88937920 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,粒子群算法优化R…

后勤管理系统|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的后勤管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 员工注册、员工登录 个人中心 公寓信息 员工功能模块 员工积分管理 管理员登录 ​编辑管理员功能模块 个人信息 ​编辑员工管理 公寓户型管理 ​编辑公寓信息管理 系统结构设计 数据库设计 luwen参考 概述 源码获取 文末获取源…

Docker基础教程 - 12 常用容器部署-Nginx

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 12 常用容器部署-Nginx 下面介绍一下常用容器的部署。可以先简单了解下&#xff0c;用到再来详细查看。 在 Docker 中部署 Nginx&#xff0c;并通过挂载方式将 Nginx 的配置文件和站点目录挂…

开发指南006-后端配置文件

后端配置文件分为两层&#xff0c;一是部署目录中的内容如下&#xff1a; 这里最重要的是端口号&#xff0c;同一个目录下可以是一个jar包多个配置文件&#xff0c;启动批处理中&#xff0c;按一个配置文件启动一个程序的方式启动多个服务。例如上面目录里的启动批处理文件可以…

Asp .Net Web Forms 系列:配置图片防盗链的几种方法

通过 URL Rewrite Module 组件 URL Rewrite Module 是一个用于在 ASP.NET Web Forms 或其他基于 IIS 的 Web 应用程序中重写 URL 的强大工具。这个模块允许你将复杂的、不易于记忆或不利于搜索引擎优化的 URL 转换为更简洁、更友好的格式。通过 URL 重写&#xff0c;你可以提高…

【存储】ZYNQ+NVMe小型化全国产存储解决方案

文章目录 1、背景2、基础理论3、设计方案3.1、FPGA设计方案3.1.1、NVMe控制器实现3.1.2、NVMe控制器实现 3.2 驱动软件设计方案3.2.1 读写NVMe磁盘软件驱动3.2.2 NVMe磁盘驱动设计3.2.3 标准EXT4文件系统设计 3.3 上位机控制软件设计方案 4、测试结果4.1 硬件测试平台说明4.2 测…

同步通信与异步通信

同步通信&#xff1a;发送方发出数据后&#xff0c;等接收方发回响应以后才发下一个数据包的通讯方式。 异步通信&#xff1a;发送方发出数据后&#xff0c;不等接收方发回响应&#xff0c;接着发送下个数据包的通讯方式。 像IIC 、SPI这类是同步通信(凡是带有时钟信号的基本上…

解码人工智能的幽默:理解其背后的误解与挑战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…