从头开始嵌入式第三十八天(数据结构 双向链表)
目录
双向链表
一、结构特点
二、操作优势
三、应用场景
1.创建链表
2.头插数据
3.打印数据
4.查找数据
5.删除数据
6.更改数据
7.清空数据
8.尾插数据
9.按位插入
10.获取长度
11.是否为空
双向链表
双向链表是一种链表结构。
一、结构特点
1. 每个节点包含两个指针,分别指向直接前驱节点和直接后继节点。这使得在双向链表中可以双向遍历,既可以向前也可以向后查找节点。
2. 相比单向链表,双向链表在某些操作上更加灵活,比如在删除节点时,可以快速找到前驱节点进行调整,而单向链表需要从头开始遍历才能找到前驱节点。
二、操作优势
1. 插入操作:可以快速确定插入位置的前后节点,进行指针调整,实现高效的插入操作。
2. 删除操作:由于能够直接访问前驱节点,删除操作也更加方便快捷。
三、应用场景
1. 需要频繁进行前后遍历的场景,如文本编辑器中对字符的双向移动和操作。
2. 对数据的插入和删除操作较多,且要求高效的系统中。
1.创建链表
LinkList *CreateLinkList()
{LinkList*ll = (LinkList*)malloc(sizeof(LinkList));if(NULL == ll){perror("CreateLinkList malloc");return NULL;}ll->head = NULL;ll->clen = 0;return ll;
}
2.头插数据
int InsertHeadLinkList(LinkList *list, DATATYPE *data)
{LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));if(NULL == newnode){perror("InsertHeadLinkList malloc");return 1;}memcpy(&newnode->data,data,sizeof(DATATYPE));newnode->next = NULL;newnode->prev = NULL;if(IsEmptyLinkList(list)){list->head = newnode;}else{newnode->next = list->head;list->head->prev = newnode;list->head = newnode;}list->clen++;return 0;
}
3.打印数据
int ShowLinkList(LinkList *list ,DIRECT dir)
{int i=0;int len =GetSizeLinkList(list);LinkNode* tmp = list->head;if(DIR_FORWARD == dir){for(i = 0 ;i<len;i++){printf("name:%s age:%d score:%d\n",tmp->data.name,tmp->data.age,tmp->data.score);tmp=tmp->next;}}else{while(tmp->next){tmp=tmp->next;}while(tmp){printf("name:%s age:%d score:%d\n",tmp->data.name,tmp->data.age,tmp->data.score);tmp=tmp->prev;}}return 0;
}
4.查找数据
LinkNode *FindLinkList(LinkList *list, char *name)
{int len = GetSizeLinkList(list);int i = 0 ;LinkNode*tmp = list->head;for(i = 0 ;i<len;i++){if(0==strcmp(tmp->data.name,name)){return tmp;}tmp=tmp->next;}return NULL;
}
5.删除数据
int DeleteLinkList(LinkList *list, char *name)
{LinkNode*tmp = FindLinkList(list,name);if(NULL == tmp){return 1;}if(tmp->next){tmp->next->prev=tmp->prev;}if(tmp->prev){tmp->prev->next = tmp->next;}else{list->head = tmp->next;}free(tmp);list->clen--;return 0;
}
6.更改数据
int ModifyLinkList(LinkList *list, char *name, DATATYPE *data)
{LinkNode* tmp = FindLinkList(list,name);if(NULL == tmp){return 1;}memcpy(&tmp->data,data,sizeof(DATATYPE));return 0;
}
7.清空数据
int DestroyLinkList(LinkList *list)
{LinkNode* tmp = list->head;while(tmp){list->head= list->head->next;free(tmp);tmp = list->head;}free(list);return 0;
}
8.尾插数据
int InsertTailLinkList(LinkList *list, DATATYPE *data)
{if(IsEmptyLinkList(list)){return InsertHeadLinkList(list,data);}else{LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));if(NULL == newnode){perror("inster tail malloc");return 1;}// newnode initmemcpy(&newnode->data,data,sizeof(DATATYPE));newnode->next = NULL;newnode->prev=NULL;LinkNode*tmp = list->head;while(tmp->next){tmp = tmp->next;}newnode->prev = tmp;tmp->next = newnode;}list->clen++;return 0;
}
9.按位插入
int InsertPosLinkList(LinkList *list, DATATYPE *data, int pos) {int len = GetSizeLinkList(list);if (pos < 0 || pos > len) {return 1;}if (0 == pos) {return InsertHeadLinkList(list, data);} else if (len == pos) {return InsertTailLinkList(list, data);} else {LinkNode *tmp = list->head;int i = 0;for (i = 0; i < pos - 1; i++) {tmp = tmp->next;}LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode));if (NULL == newnode) {perror("insert pos malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;newnode->prev = NULL;newnode->prev = tmp;newnode->next = tmp->next;tmp->next->prev = newnode;tmp->next = newnode;}list->clen++;return 0;
}
10.获取长度
int GetSizeLinkList(LinkList*list)
{return list->clen;
}
11.是否为空
int IsEmptyLinkList(LinkList*list)
{return 0 == list->clen;
}
相关文章:
从头开始嵌入式第三十八天(数据结构 双向链表)
目录 双向链表 一、结构特点 二、操作优势 三、应用场景 1.创建链表 2.头插数据 3.打印数据 4.查找数据 5.删除数据 6.更改数据 7.清空数据 8.尾插数据 9.按位插入 10.获取长度 11.是否为空 双向链表 双向链表是一种链表结构。 一、结构特点 1. 每个节点包含两个…...
chapter14-集合——(List-HashSet)——day18
目录 519-HashSet全面说明 520-数组链表模拟 521-HashSet扩容机制 重要 522-HashSet源码解读1 526-HashSet最佳实践 527-hashSet思考题 519-HashSet全面说明 题一、 两个tom都可以添加成功是因为这是两个对象 看源码做分析:不是直接指向常量池的吗?…...
企业会议室预约管理系统
基于springbootvuemysql实现的企业会议室预约管理系统(源码数据库部署视频) ### 主要技术 SpringBoot、Vue、MySQL ### 系统角色 员工、管理员 ### 系统功能 1)管理员:数据统计(会议室使用统计-柱状图、设备状态统计…...
安全API
提到安全,大部分在学习和调试编程语言时并不太在意,真正爆发问题是在用户端。真正的安全漏洞是很可怕的,获取系统最高权限,获得敏感资讯,伤心不已,泪流满面。 字符串 C语言简洁自由的风格,产生…...
【论文阅读】视觉分割新SOTA: Segment Anything(SAM)
导言 随着基于对比文本—图像对的预训练(CLIP)方法或者模型、聊天生成预训练转换器(ChatGPT)、生成预训练转换器-4(GPT-4)等基础大模型的出现,通用人工智能( AGI)的研究…...
redis之list核心命令演示与细节探索
redis之list核心命令演示与细节探索 BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout summary: Pop an element from a list, push it to another list and return it; or block until one is available since: 6.2.0 BLPOP key [key …] timeout summary: Remove …...
[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4040 标注数量(xml文件个数):4040 标注数量(txt文件个数):4040 标注…...
Lua 与 C#交互
Lua 与C#交互 前提 Lua是一种嵌入式脚本语言,Lua的解释器是用C编写的,因此可以方便的与C/C进行相互调用。轻量级 Lua语言的官方版本只包括一个精简的核心和最基本的库,这使得Lua体积小、启动速度快,也适合嵌入在别的程序里。 交…...
【办公类】大组工会学习(文心一言+Python批量)
背景需求: 每学期要写一份工会的大组政治学习读后感(9月-1月,共5次) 学习内容 9月、10月、11月、12月、1月的学习内容文字稿 在班级里,我擅长电脑工作,所以这种写的工作都包了。 中2班三位老师一共写3篇&…...
项目管理工作流是什么?项目管理工作流管理实战技巧!
项目管理工作流是指在协作过程中通过限制任务状态的流转进行流程控制的一种方式。项目从启动到完成所经历的一系列有序、可控的步骤和流程,它详细描述了项目执行过程中各项任务和活动的顺序、依赖关系、责任人以及完成标准等,是项目成功执行的重要保障。…...
leveldb源码剖析(二)——LSM Tree
LSM Tree LSM Tree:Log-Structured Merge Tree,日志结构合并树。是一种频繁写性能很高的数据结构。 LSM Tree将写入操作与合并操作分离,数据首先写入磁盘中的日志文件(WAL),随后写入内存缓存,…...
三十六、Gin注册功能-检查账号是否存在
一、初始化 1、在cms.go中添加数据库连接方法 func connDB(app *CmsApp) {mysqlDB, err : gorm.Open(mysql.Open("root:rootroottcp(localhost:3306)/?charsetutf8mb4&parseTimeTrue&locLocal"))if err ! nil {panic(err)}db, err : mysqlDB.DB()if err !…...
什么是期权对冲?
今天期权懂带你了解什么是期权对冲?期权对冲的选择取决于投资者的市场预期和风险承受能力,通过合理使用期权对冲策略,可以有效减少风险并优化投资组合的表现。 期权对冲是什么? 期权是一种支持双向交易的投资产品,期…...
什么是数据库课程设计?
文章目录 前言一、课程设计目的二、课程设计流程三、设计要点四、示例项目总结 前言 数据库课程设计是一个综合性的实践过程,旨在通过实际项目的设计与实现,加深学生对数据库理论知识的理解和应用能力。 以下是一个关于数据库课程设计的基本框架和要点&…...
走进低代码报表开发(二):高效报表设计新利器
在前面的文章中,我们已经详细介绍了勤研低代码开发平台的报表数据源可视化设计,接下来,让我们一起来继续了解勤研低代码平台的报表设计,在当今数字化快速发展的时代,高效便捷的开发工具对于企业和开发者来说至关重要。…...
校园水电费管理|基于java的校园水电费管理小程序系统 (源码+数据库+文档)
校园水电费管理 目录 基于java的校园水电费管理小程序系统 一、前言 二、系统设计 三、系统功能设计 小程序端 后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕…...
java设计模式 桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们都可以独立地变化。桥接模式通过将继承改为组合,实现了在不修改现有类的情况下,动态地切换和扩展抽象类与其具体实现…...
如何利用大数据技术来识别和预防网络赌博行为?
1.构建赌博账户识别模型:通过大数据分析和机器学习技术,建立智能风险防控体系,对账户进行全生命周期管理,精准打击和切断不法分子的资金链条 。 2.分析资金流动:利用大数据技术监测和分析异常资金流动,识别…...
N-152基于java贪吃蛇游戏5
开发工具eclipse,jdk1.8 文档截图: N-152基于java贪吃蛇游戏5...
从线段中搜寻提取闭合轮廓(三)
1.前言 做底层和数据的调试问题也是个麻烦事,如果没有方便的可视化工具辅助,那将令人感到痛苦,借助可视化的工具可以让我们高效、省心,进而心情舒畅,重要的是可以提高调试效率。 当然可视化工具也分不同层次的…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
