FreeRTOS 链表的深度讲解
list.h里定义
/*节点结构体定义*/
struct xLIST_ITEM
{TickType_t xItemValue; //辅助值,用于帮助节点做顺序排列 struct xLIST_ITEM * pxNext; struct xLIST_ITEM * pxPrevious; void * pvOwner; void * pvContainer;
};
typedef struct xLIST_ITEM ListItem_t; /*迷你节点结构体定义,作为双链表的结尾*/
struct xMINI_LIST_ITEM
{TickType_t xItemValue; //辅助值,用于节点升序 struct xLIST_ITEM * pxNext; //指向链表下一节点 struct xLIST_ITEM * pxPrevious; //指向链表前一节点
};
typedef struct xMINI_LIST_ITEM MiniListItem_t; /*链表*/
typedef struct xLIST
{UBaseType_t uxNumberOfItems; //链表节点计数器 ListItem_t * pxIndex; //链表节点索引指针 MiniListItem_t xListEnd; //链表最后一个节点
} List_t;
1、双链表插入尾部
原理:
入上图,就是将链表断开,然后重连的过程。
结合代码如下:
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) {
ListItem_t * const pxIndex = pxList->pxIndex;
pxNewListItem->pxNext = pxIndex; ①
pxNewListItem->pxPrevious = pxIndex->pxPrevious; ②
pxIndex->pxPrevious->pxNext = pxNewListItem; ③
pxIndex->pxPrevious = pxNewListItem; ④ /* 记住该节点所在的链表 */ pxNewListItem->pvContainer = ( void * ) pxList; ⑤ /* 链表节点计数器++ */ ( pxList->uxNumberOfItems )++; ⑥ }
2、按照节点升序排列到链表
代码如下:
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
{ListItem_t *pxIterator;/* 获取节点升序排列辅助值 */const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;/* 寻找插入节点的位置 */if( xValueOfInsertion == portMAX_DELAY ){pxIterator = pxList->xListEnd.pxPrevious;}else{for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd );pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ){/* 不做任何事,只为寻找到节点位置。 */ }}
//pxIterator 为插入的前一个pxNewListItem->pxNext = pxIterator->pxNext;pxNewListItem->pxPrevious = pxIterator;pxNewListItem->pxNext->pxPrevious = pxNewListItem;pxIterator->pxNext = pxNewListItem;/* 纪录节点所在的列表*/pxNewListItem->pvContainer = ( void * ) pxList;/* 链表节点计数器++ */( pxList->uxNumberOfItems )++;
}
解释:为什么用一个for循环就找到了节点位置呢??看一个图片就一目了然了
大家可以看上图,特别注意,xLIST链表中MiniListItem_t;原子里面解释,这是最后的一个节点。大家注意了,这个节点的next是指向第一个节点,pxprevous指向,最后一个节点。利用for 循环,从第一个开始遍历,直到遇到一个节点值比插入值大,然后跳出,此时就获取到了需要插入的节点位置pxIterator 。pxIterator 为插入的前一个。
寻找到位置后,接下来就是插入节点,与上面双链表插入尾部一模一样。断开,重连的一个过程。
如果上面的理解了,其他的我们一笔带过吧,都非常的简单了
3.链表的删除
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
{/*获取节点所在链表*/List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;/*步骤1*/pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;/*步骤2*/pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;/* Make sure the index is left pointing to a valid item. */if( pxList->pxIndex == pxItemToRemove ){pxList->pxIndex = pxItemToRemove->pxPrevious;}/* 初始化所在的链表为空,表示节点没有插入到链表 */pxItemToRemove->pvContainer = NULL;/* 链表节点计数值-- */( pxList->uxNumberOfItems )--;/*返回链表节点数 */return pxList->uxNumberOfItems;
}
如下图:
FreeRTOS 链表的深度讲解相关推荐
- MySql进阶索引篇01——深度讲解索引的数据结构:B+树
深度讲解索引的数据结构:B+树 1.索引介绍 1.1 为什么使用索引 1.2 索引的优缺点 2.从零开始设计索引 2.1没有索引时怎么查询数据 2.2 基于页的目录项的简单索引 2.3 InnoDB索 ...
- envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...
- python链表的创建_python数据结构之链表的实例讲解
在程序中,经常需要将组(通常是同为某个类型的)数据元素作为整体 管理和使,需要创建这种元素组,变量记录它们,传进传出函数等. 组数据中包含的元素个数可能发变化(可以增加或删除元素). 对于这种需求,最 ...
- 机器学习(三)聚类深度讲解
在理解大数据方面,聚类是一种很常用的基本方法.近日,数据科学家兼程序员 Peter Gleeson 在 freeCodeCamp 发布了一篇深度讲解文章,对一些聚类算法进行了基础介绍,并通过简单而详细 ...
- messagehub讲解_艾舜杰SAP Data Hub 数据服务总线技术深度讲解
原标题:艾舜杰SAP Data Hub 数据服务总线技术深度讲解 艾舜杰SAP Data Hub 是一个多方面的数据编排解决方案, 旨在解决在不断增长的分布式数据环境中的挑战.它的关键功能包括:数据管 ...
- python链表值讲解_python数据结构之链表的实例讲解
在程序中,经常需要将⼀组(通常是同为某个类型的)数据元素作为整体 管理和使⽤,需要创建这种元素组,⽤变量记录它们,传进传出函数等. ⼀组数据中包含的元素个数可能发⽣变化(可以增加或删除元素). 对于这 ...
- 深度讲解VIEWPORT和PX是什么
深度讲解VIEWPORT和PX是什么 刚开始接触移动页面重构,是不是很迷惑应该按照多大的尺寸制作?320.640 还是 720? 按照640的设计稿重构完页面,是不是还需要写其他尺寸来适配不同的屏幕大 ...
- GoLang之Map深度讲解
文章目录 GoLang之Map深度讲解 1.Map查找 2.哈希函数 3.Map插入.修改 4.扩容分析 GoLang之Map深度讲解 1.Map查找 //以下常量在runtime/map.go里 c ...
- MySQL数据库深度讲解
文章目录 mySQL深度讲解 Oracle 和 MySQL 比较 第一章 数据库设计 彻底搞定MySQL乱码问题 常见的字符集 数据库存储引擎 mySQL命令帮助 第三章 mySQL 语言结构 SQL ...
最新文章
- 【dmp文件还原到oralce数据库】
- zookeeper笔记+源码刨析
- 老王学jsp之dom解析xml
- Win8Metro(C#)数字图像处理--2.33图像非线性变换
- Asp.net中的HttpModule和HttpHandler的简单用法
- 【最全最详细】publiccms其他常用代码片段(内容、站点)
- 良好的编码本能最终会让您大吃一惊
- linux csh错误,运行lampp时报错,错误信息如下,求解决方案
- yolov5数据集txt解析
- coolfire文章之八
- 电子元件知识汇总3-厂商
- Java旅游管理系统的设计与实现毕业设计
- python 登录新浪微博_Python 模拟登录新浪微博
- 快速上手飞桨PaddleClas图像分类库
- 使用SPSS进行曲线估算分析
- 阿里云centOS安装图形界面
- VMware创建共享文件夹并实现文件传输(Windows主机,Ubuntu虚拟机)
- 【matlab教程】18、删除变量
- ldirectord 介绍
- Java 实现简单的发红包代码