【数据结构:线性表】单链表

news/2024/4/25 16:06:12/文章来源:https://blog.csdn.net/JX_BC/article/details/130269333

在学习了顺序表,我们可能会对其有一些思考:

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

那么有没有一些更好的结构来解决这些问题呢?这篇博客就给大家讲一讲单链表这个重要的数据结构。


⚡链表的概念及结构

链表的概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

链表的结构: 链式结构在逻辑上是连续的,但在物理上不一定连续。


⚡单链表各接口实现

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

动态申请一个结点:

SLTNode* BuySLNode(SLTDatatype x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){printf("malloc fail\n");return 0;}newnode->data = x;newnode->next = NULL;return newnode;
}

单链表的打印:

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

单链表头插:

void SLPushFront(SLTNode** pphead, SLTDatatype x)
{/*SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){printf("malloc fail\n");return;}newnode->data = x;newnode->next = NULL;*/SLTNode* newnode = BuySLNode(x);newnode->next = *pphead;*pphead = newnode;
}

单链表尾插:

void SLPushBack(SLTNode** pphead, SLTDatatype x)
{SLTNode* newnode = BuySLNode(x);if (*pphead == NULL){*pphead = newnode;}else{SLTNode* tail = *pphead;while (tail->next){tail = tail->next;}tail->next = newnode;}
}

单链表头删:

void SLPopFront(SLTNode** pphead)
{assert(*pphead);/*if ((*pphead)->next == NULL){*pphead = NULL;}else{SLTNode* tail = *pphead;*pphead = tail->next;}*/SLTNode* tail = *pphead;*pphead = tail->next;
}

单链表尾删:

void SLPopBack(SLTNode** pphead)
{assert(*pphead);//单链表只有一个结点if ((*pphead)->next == NULL){*pphead = NULL;}//结点数大于1else{SLTNode* tail = *pphead;while (tail->next->next){tail = tail->next;}tail->next = NULL;}
}

 单链表查找:

SLNode* SLFind(SLNode* pphead, SLNDatatype x)
{SLNode* tail = pphead;while (tail != NULL){if (tail->data == x){return tail;}tail = tail->next;}return NULL;
}

单链表pos位置处插入结点:

void SLInsert(SLNode** pphead, SLNode* pos, SLNDatatype x)
{assert(pphead);assert(pos);if (*pphead == pos){SLPushFront(pphead, x);}else{SLNode* tail = *pphead;while (tail->next != pos){tail = tail->next;}SLNode* newnode = BuySLNode(x);tail->next = newnode;newnode->next = pos;}
}

单链表pos位置之后插入结点:

void SLInsertAfter(SLNode* pos, SLNDatatype x)
{assert(pos);SLNode* newnode = BuySLNode(x);newnode->next = pos->next;pos->next = newnode;
}

在单链表删除pos处的结点:

void SLErase(SLNode** pphead, SLNode* pos)
{assert(pphead);assert(*pphead);assert(pos);if (*pphead == pos){SLPopFront(pphead);}else{SLNode* cur = *pphead;while (cur->next != pos){cur = cur->next;}cur->next = pos->next;free(pos);}
}

在单链表删除pos之后的结点:

void SLEraseAfter(SLNode* pos)
{assert(pos);assert(pos -> next);pos->next = pos->next->next;free(pos->next);
}

感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的数据结构。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif

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

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

相关文章

【校招VIP】面试了一个抽奖的项目,我终于搞明白了,是8股文终于开始作恶了

最近因为招实习生,进行了很多次面试。 但面试的结果不尽人意。 就感觉今年的面试跟以前差距太大了。 直到经过这个同学的面试,我终于明白了是什么原因。 这个同学是南京一所211的研究生,他的项目经历是做了一个抽奖的微服务管理平台。 也…

10、Mysql常见面试题

Mysql常见面试题 文章目录 Mysql常见面试题一 Mysql索引001 Mysql如何实现的索引机制?002 InnoDB索引与MyISAM索引实现的区别是什么?003 一个表中如果没有创建索引,那么还会创建B树吗? 004 说一下B树索引实现原理(数据…

2023移动云大会 | “六大”服务承诺 全力做优“心级服务”

4月25日,以“云擎未来 智信天下”为主题的2023移动云大会在苏州金鸡湖国际会议中心举办,众多政府领导、院士专家、知名企业客户与合作伙伴高层等数千名嘉宾齐聚一堂。 大会期间,移动云深入践行“为国建云”的使命,推出“六大”服…

电感知识大全

目录 一、电感的种类 1、共模电感 2、差模电感 3、工字电感 功率电感 4、磁珠 5、变压器 6、R棒电感、棒形电感、差模电感 二、电感符号 三、电感特性 前面在学习电容的时候,为了让大家更形象,更通俗的去理解这个元器件,都是拿水缸去…

【Vue 移动端开发】适配百分之99的屏幕方案

之前提起移动端适配,都是一些视口的概念,包括物理像素和逻辑像素,理想视口,dpr等等等。利用 media query 和 rem 是最常见的移动端适配方案。如下代码: const deviceWidth document.documentElement.clientWidth || …

为什么很多程序员不反感加班?行内人:老板给钱是真的给啊

为什么很多程序员不反感加班?行内人:说给钱老板真的给! 一提到程序员,大部分人第一反应是加班多、996、脱发,这几乎成了外界对程序员刻板印象的标配。不少知名的互联网大厂也是加班之风盛行,譬如著名的华为…

论文阅读:Heterogeneous Graph Contrastive Learning for Recommendation(WSDM ’23)

论文链接 Motivation: 在推荐系统中,图神经网络在建模图结构数据上已经变成一个强有力的工具。但是现实生活的推荐语义通常涉及异质关系(像用户的社交关系,物品知识关系的依赖),这些都包含丰富的语义信息…

17、Logos使用摘要

本篇将讲述如何将WX的设置界面添加两个自定义的UI行: 包含是否启用某功能的开关,以及手速设置.并且如何定位到修改的代码.采用的是砸过壳的包. 成品也就是增加了两个UI及开关联动效果、 界面分析 如果我们要破解别人的App, 首先从界面UI入手,定位UI 1、使用class-dump导出全部…

直升机空气动力学基础---002 桨叶的主要参数

源于 1.桨叶的平面形状和主要参数 由于其设计制造比较简单,早期直升机大多采用矩形桨叶,缺点是在高速气流中,无法抑制桨尖涡,会消耗向下的诱导速度,降低旋翼的拉力。现代多采用梯形桨叶。 桨尖后掠能够降低桨尖涡 …

Flowable打印调用原生API查询接口的SQL日志

一.简介 建议在 Spring Boot 的 application.properties 中添加如下配置,开启 flowable 日志: logging.level.org.flowabledebug这个配置表示开启 flowable 的日志,开启日志的好处是可以看到底层的 SQL语句。 二.查询部署信息 例如查询流…

使用 chat_flutter 进行聊天记录展示

前言 最近需要实现一个聊天记录的页面展示,在网上发现没有适合自己的,于是自己就造了一个,总体感觉还不赖。 下面奉上地址、效果图和教程。 效果图 地址 github: https://github.com/xiaorui-23/chat_fluttergitee: https://gitee.com/xi…

selenium_交互 (谷歌浏览器驱动下载 xpath插件安装)

安装selenium (1)查看谷歌浏览器版本 谷歌浏览器右上角 ‐‐> 帮助 ‐‐> 关于 查看 浏览器版本: (2)操作谷歌浏览器驱动下载地址 http : // chromedriver . storage . googleapis . com / index . html 找到…

YOLOv5网络模型的结构原理讲解(全)

目录 前言1. 基本概念2. 输入端2.1 Mosaic 图像增强2.2 自适应锚框计算2.3 自适应图片缩放 3. Backbone层3.1 Focus结构3.2 CSP结构 3. Neck网络3.1 SPP结构3.2 PAN结构 4. 输出端4.1 Bounding box损失函数4.2 NMS非极大值抑制 前言 YOLOv5有几种不同的架构,各网络…

Qt信号槽原理

Qt之信号槽原理 一.概述 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这…

Openswan安装和简单配置

Openswan安装和简单配置 安装环境: 操作系统:Ubuntu20.0.4TLS 用户权限:root下载Openswan: wget https://github.com/xelerance/Openswan/archive/refs/tags/v3.0.0.zip安装Openswan: 解压Openswan:(PS&#xff1a…

银行数字化转型导师坚鹏:商业银行数字化风控(2天)

商业银行数字化风控 课程背景: 数字化背景下,很多银行存在以下问题: 不清楚商业银行数字化风控发展现状? 不清楚对公业务数字化风控工作如何开展? 不知道零售业务数字化风控工作如何开展? 课程特色…

海光信息业绩高歌猛进,但其作为国产CPU龙头的“地基”并不牢固

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在“芯片寒冬”的大背景下,2022年全球头部芯片半导体公司纷纷下调业绩预期,英特尔、英伟达、美光等无一幸免。但是随着AIGC异军突起,仿佛寒冬中的一股暖流,催生着半导体市场行…

C. Trailing Loves (or L‘oeufs?)(求某个质因子在n的阶乘中的个数 + 思维)

Problem - C - Codeforces Aki喜欢数字,尤其是那些带有尾随零的数字。例如,数字9200有两个尾随零。Aki认为数字拥有的尾随零越多,它就越漂亮。 然而,Aki认为,一个数字拥有的尾随零的数量并不是固定的,而是…

idea中导入spring源码;在spring源码中添加注释

标题:idea中导入spring源码;在spring源码中添加注释 我是跟着他操作的,下文是一些补充说明: 这个也可以借鉴 gradle下载链接【使用网盘下载】,不过有的没有, gradel下载链接:这个比较全 1.Spring源码编译环境 spr…

Karl Guttag:现有Micro LED/LCoS+光波导AR眼镜对比解析

轻量化是未来AR眼镜的发展趋势,为了缩减尺寸,AR眼镜厂商尝试了多种方案,长期来看Micro LED光机在小型化上更有优势,但现阶段LCoS光机的图像表现更好。在CES 2023期间,DigiLens、Lumus、Vuzix、OPPO、Avegant也展出了不…