当前位置: 首页 > news >正文

从头开始嵌入式第三十八天(数据结构 双向链表)

目录

 

双向链表

一、结构特点

二、操作优势

三、应用场景

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都可以添加成功是因为这是两个对象 看源码做分析&#xff1a;不是直接指向常量池的吗&#xff1f;…...

企业会议室预约管理系统

基于springbootvuemysql实现的企业会议室预约管理系统&#xff08;源码数据库部署视频&#xff09; ### 主要技术 SpringBoot、Vue、MySQL ### 系统角色 员工、管理员 ### 系统功能 1&#xff09;管理员&#xff1a;数据统计&#xff08;会议室使用统计-柱状图、设备状态统计…...

安全API

提到安全&#xff0c;大部分在学习和调试编程语言时并不太在意&#xff0c;真正爆发问题是在用户端。真正的安全漏洞是很可怕的&#xff0c;获取系统最高权限&#xff0c;获得敏感资讯&#xff0c;伤心不已&#xff0c;泪流满面。 字符串 C语言简洁自由的风格&#xff0c;产生…...

【论文阅读】视觉分割新SOTA: Segment Anything(SAM)

导言 随着基于对比文本—图像对的预训练&#xff08;CLIP&#xff09;方法或者模型、聊天生成预训练转换器&#xff08;ChatGPT&#xff09;、生成预训练转换器-4&#xff08;GPT-4&#xff09;等基础大模型的出现&#xff0c;通用人工智能&#xff08; AGI&#xff09;的研究…...

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类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4040 标注数量(xml文件个数)&#xff1a;4040 标注数量(txt文件个数)&#xff1a;4040 标注…...

Lua 与 C#交互

Lua 与C#交互 前提 Lua是一种嵌入式脚本语言&#xff0c;Lua的解释器是用C编写的&#xff0c;因此可以方便的与C/C进行相互调用。轻量级 Lua语言的官方版本只包括一个精简的核心和最基本的库&#xff0c;这使得Lua体积小、启动速度快&#xff0c;也适合嵌入在别的程序里。 交…...

【办公类】大组工会学习(文心一言+Python批量)

背景需求&#xff1a; 每学期要写一份工会的大组政治学习读后感&#xff08;9月-1月&#xff0c;共5次&#xff09; 学习内容 9月、10月、11月、12月、1月的学习内容文字稿 在班级里&#xff0c;我擅长电脑工作&#xff0c;所以这种写的工作都包了。 中2班三位老师一共写3篇&…...

项目管理工作流是什么?项目管理工作流管理实战技巧!

项目管理工作流是指在协作过程中通过限制任务状态的流转进行流程控制的一种方式。项目从启动到完成所经历的一系列有序、可控的步骤和流程&#xff0c;它详细描述了项目执行过程中各项任务和活动的顺序、依赖关系、责任人以及完成标准等&#xff0c;是项目成功执行的重要保障。…...

leveldb源码剖析(二)——LSM Tree

LSM Tree LSM Tree&#xff1a;Log-Structured Merge Tree&#xff0c;日志结构合并树。是一种频繁写性能很高的数据结构。 LSM Tree将写入操作与合并操作分离&#xff0c;数据首先写入磁盘中的日志文件&#xff08;WAL&#xff09;&#xff0c;随后写入内存缓存&#xff0c;…...

三十六、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 !…...

什么是期权对冲?

今天期权懂带你了解什么是期权对冲&#xff1f;期权对冲的选择取决于投资者的市场预期和风险承受能力&#xff0c;通过合理使用期权对冲策略&#xff0c;可以有效减少风险并优化投资组合的表现。 期权对冲是什么&#xff1f; 期权是一种支持双向交易的投资产品&#xff0c;期…...

什么是数据库课程设计?

文章目录 前言一、课程设计目的二、课程设计流程三、设计要点四、示例项目总结 前言 数据库课程设计是一个综合性的实践过程&#xff0c;旨在通过实际项目的设计与实现&#xff0c;加深学生对数据库理论知识的理解和应用能力。 以下是一个关于数据库课程设计的基本框架和要点&…...

走进低代码报表开发(二):高效报表设计新利器

在前面的文章中&#xff0c;我们已经详细介绍了勤研低代码开发平台的报表数据源可视化设计&#xff0c;接下来&#xff0c;让我们一起来继续了解勤研低代码平台的报表设计&#xff0c;在当今数字化快速发展的时代&#xff0c;高效便捷的开发工具对于企业和开发者来说至关重要。…...

校园水电费管理|基于java的校园水电费管理小程序系统 (源码+数据库+文档)

校园水电费管理 目录 基于java的校园水电费管理小程序系统 一、前言 二、系统设计 三、系统功能设计 小程序端 后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕…...

java设计模式 桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在将抽象部分与其实现部分分离&#xff0c;使它们都可以独立地变化。桥接模式通过将继承改为组合&#xff0c;实现了在不修改现有类的情况下&#xff0c;动态地切换和扩展抽象类与其具体实现…...

如何利用大数据技术来识别和预防网络赌博行为?

1.构建赌博账户识别模型&#xff1a;通过大数据分析和机器学习技术&#xff0c;建立智能风险防控体系&#xff0c;对账户进行全生命周期管理&#xff0c;精准打击和切断不法分子的资金链条 。 2.分析资金流动&#xff1a;利用大数据技术监测和分析异常资金流动&#xff0c;识别…...

N-152基于java贪吃蛇游戏5

开发工具eclipse,jdk1.8 文档截图&#xff1a; N-152基于java贪吃蛇游戏5...

从线段中搜寻提取闭合轮廓(三)

1.前言 做底层和数据的调试问题也是个麻烦事&#xff0c;如果没有方便的可视化工具辅助&#xff0c;那将令人感到痛苦&#xff0c;借助可视化的工具可以让我们高效、省心&#xff0c;进而心情舒畅&#xff0c;重要的是可以提高调试效率。 当然可视化工具也分不同层次的…...

探索现代媒体播放器的终极指南:免费专业播放解决方案

探索现代媒体播放器的终极指南&#xff1a;免费专业播放解决方案 【免费下载链接】mpv.net &#x1f39e; mpv.net is a media player for Windows with a modern GUI. 项目地址: https://gitcode.com/gh_mirrors/mp/mpv.net 还在为Windows平台找不到一款既强大又易用的…...

小红书无水印下载工具XHS-Downloader:3分钟掌握高效内容保存技巧

小红书无水印下载工具XHS-Downloader&#xff1a;3分钟掌握高效内容保存技巧 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用…...

从STM32到RISC-V:如何快速将你的4P OLED驱动移植到CH32V307上

从STM32到RISC-V&#xff1a;如何快速将你的4P OLED驱动移植到CH32V307上 对于习惯了STM32标准库开发的工程师来说&#xff0c;第一次接触RISC-V架构的CH32V307系列时&#xff0c;最迫切的需求往往是如何快速复用现有的硬件驱动代码。本文将聚焦4P OLED屏幕的驱动移植&#xff…...

爬虫进阶:如何用ProxyPool代理池+随机UA绕过掌上高考的反爬?保姆级避坑指南

数据采集实战&#xff1a;构建高隐蔽性教育信息采集系统的关键技术解析 教育数据采集领域近年来呈现出明显的技术对抗态势&#xff0c;平台方不断升级防御机制&#xff0c;而数据采集方则需要持续优化技术手段。本文将系统性地介绍构建高隐蔽性教育信息采集系统的完整技术方案&…...

FanControl:Windows平台终极风扇控制解决方案

FanControl&#xff1a;Windows平台终极风扇控制解决方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanCont…...

2026年写作类国际竞赛测评:从技术视角分析高含金量赛事与留学背景提升策略

导读&#xff1a;本文基于 2026 年最新赛事数据&#xff0c;从学术认可度、升学加成、参赛门槛、时间成本、获奖概率五个技术维度&#xff0c;对全球主流写作类国际竞赛进行量化测评。通过构建多维度评分模型&#xff0c;为留学申请者提供科学的竞赛选择与背景提升方案。 目录 …...

Flutter代码混淆实战:五大常见问题与解决方案详解

1. 项目概述&#xff1a;为什么Flutter代码混淆是“必修课”而非“选修课”最近在跟几个独立开发者和中小团队聊Flutter应用上架后的安全状况&#xff0c;发现一个挺普遍的现象&#xff1a;很多人对Flutter的代码混淆要么是“听说过但没做过”&#xff0c;要么是“做了但问题一…...

第11代酷睿工业主板PICO-TGU4:边缘AI与机器视觉的紧凑型解决方案

1. 项目概述&#xff1a;当紧凑型工业主板遇上第11代酷睿在工业自动化、边缘计算和智能零售这些领域里&#xff0c;我们常常面临一个经典的矛盾&#xff1a;一方面&#xff0c;应用场景对计算性能的要求越来越高&#xff0c;无论是机器视觉的实时图像处理&#xff0c;还是AI推理…...

Fast-GitHub:智能网络优化架构解析与分布式加速方案

Fast-GitHub&#xff1a;智能网络优化架构解析与分布式加速方案 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 在国内开发者面临G…...

从“能上传”到“可信可用”:如何用 Python 设计一个安全、可靠、可扩展的文件上传服务?

从“能上传”到“可信可用”&#xff1a;如何用 Python 设计一个安全、可靠、可扩展的文件上传服务&#xff1f; 文件上传服务看似简单&#xff1a;用户点一下按钮&#xff0c;文件传到服务器&#xff0c;返回一个 URL。可真正进入生产环境后&#xff0c;你会发现它不是一个“保…...