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 链表的深度讲解相关推荐

  1. MySql进阶索引篇01——深度讲解索引的数据结构:B+树

    深度讲解索引的数据结构:B+树 1.索引介绍 1.1 为什么使用索引 1.2 索引的优缺点 2.从零开始设计索引 2.1没有索引时怎么查询数据 2.2 基于页的目录项的简单索引 2.3 InnoDB索 ...

  2. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇

    1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...

  3. python链表的创建_python数据结构之链表的实例讲解

    在程序中,经常需要将组(通常是同为某个类型的)数据元素作为整体 管理和使,需要创建这种元素组,变量记录它们,传进传出函数等. 组数据中包含的元素个数可能发变化(可以增加或删除元素). 对于这种需求,最 ...

  4. 机器学习(三)聚类深度讲解

    在理解大数据方面,聚类是一种很常用的基本方法.近日,数据科学家兼程序员 Peter Gleeson 在 freeCodeCamp 发布了一篇深度讲解文章,对一些聚类算法进行了基础介绍,并通过简单而详细 ...

  5. messagehub讲解_艾舜杰SAP Data Hub 数据服务总线技术深度讲解

    原标题:艾舜杰SAP Data Hub 数据服务总线技术深度讲解 艾舜杰SAP Data Hub 是一个多方面的数据编排解决方案, 旨在解决在不断增长的分布式数据环境中的挑战.它的关键功能包括:数据管 ...

  6. python链表值讲解_python数据结构之链表的实例讲解

    在程序中,经常需要将⼀组(通常是同为某个类型的)数据元素作为整体 管理和使⽤,需要创建这种元素组,⽤变量记录它们,传进传出函数等. ⼀组数据中包含的元素个数可能发⽣变化(可以增加或删除元素). 对于这 ...

  7. 深度讲解VIEWPORT和PX是什么

    深度讲解VIEWPORT和PX是什么 刚开始接触移动页面重构,是不是很迷惑应该按照多大的尺寸制作?320.640 还是 720? 按照640的设计稿重构完页面,是不是还需要写其他尺寸来适配不同的屏幕大 ...

  8. GoLang之Map深度讲解

    文章目录 GoLang之Map深度讲解 1.Map查找 2.哈希函数 3.Map插入.修改 4.扩容分析 GoLang之Map深度讲解 1.Map查找 //以下常量在runtime/map.go里 c ...

  9. MySQL数据库深度讲解

    文章目录 mySQL深度讲解 Oracle 和 MySQL 比较 第一章 数据库设计 彻底搞定MySQL乱码问题 常见的字符集 数据库存储引擎 mySQL命令帮助 第三章 mySQL 语言结构 SQL ...

最新文章

  1. 【dmp文件还原到oralce数据库】
  2. zookeeper笔记+源码刨析
  3. 老王学jsp之dom解析xml
  4. Win8Metro(C#)数字图像处理--2.33图像非线性变换
  5. Asp.net中的HttpModule和HttpHandler的简单用法
  6. 【最全最详细】publiccms其他常用代码片段(内容、站点)
  7. 良好的编码本能最终会让您大吃一惊
  8. linux csh错误,运行lampp时报错,错误信息如下,求解决方案
  9. yolov5数据集txt解析
  10. coolfire文章之八
  11. 电子元件知识汇总3-厂商
  12. Java旅游管理系统的设计与实现毕业设计
  13. python 登录新浪微博_Python 模拟登录新浪微博
  14. 快速上手飞桨PaddleClas图像分类库
  15. 使用SPSS进行曲线估算分析
  16. 阿里云centOS安装图形界面
  17. VMware创建共享文件夹并实现文件传输(Windows主机,Ubuntu虚拟机)
  18. 【matlab教程】18、删除变量
  19. ldirectord 介绍
  20. Java 实现简单的发红包代码

热门文章

  1. 选择排序(升序排列)
  2. 我的世界匠魂钢怎么做
  3. 推土机距离_推土机工程师指南
  4. Lyft押重注于苹果编程语言Swift
  5. 2022煤矿井下爆破考试题库模拟考试平台操作
  6. 2020最新整理:好用的免费/收费的第三方域名解析服务平台
  7. 微信小程序开发初体验
  8. 「JavaSE」-流程控制和方法
  9. 一个关于随机矩阵谱范数的不等式
  10. 一年当中几月份买车最合适?什么时候最便宜?