|____2.1 FreeRTOS 深度解析--链表

链表

  • [1. 单 / 双向链表](#1. 单 / 双向链表)
  • [2. 双向链表(初始化 节点 vListinitialiseItem())](#2. 双向链表(初始化 节点 vListinitialiseItem()))
  • [3. 双向链表(初始化 根节点 vListInitialise())](#3. 双向链表(初始化 根节点 vListInitialise()))
  • [4. 双向链表(节点尾插法 vListinsertEnd() )](#4. 双向链表(节点尾插法 vListinsertEnd() ))
  • [5. 双向链表(节点升序排列 vListInsert() )](#5. 双向链表(节点升序排列 vListInsert() ))
  • [6. 双向链表(将节点从链表删除 uxListRemove() )](#6. 双向链表(将节点从链表删除 uxListRemove() ))
  • [7. 双向链表(插入实验)](#7. 双向链表(插入实验))
  • [8. 双向链表(带点带参宏小函数)](#8. 双向链表(带点带参宏小函数))

1. 单 / 双向链表

单向链表: 前一个节点都有一个箭头指向后一个节点,首尾相连,组成一个圈。

节点必须包含一个节点指针,用于指向后一个节点,除了这个节点指针是必须有的之外,节点还可以携带一些私有信息(如单个的数据、数组、指针数据和自定义的结构体数据类型等)。

双向链表: 双向链表与单向链表的区别就是节点中有两个节点指针,分别指向前后两个节点,其它完全一样。

2. 双向链表(初始化 节点 vListinitialiseItem())

链表节点ListItem_t 总共有 5 个成员,但是初始化的时候只需将 pvContainer 初始化为空即可,表示该节点还没有插入到任何链表。

 

3. 双向链表(初始化 根节点 vListInitialise())

(1):链表节点计数器,用于表示该链表下有多少个节点,根节点除外

(2):链表节点索引指针,用于遍历节点

(3):链表最后一个节点(链表是首尾相连的,是一个圈,首就是尾,尾就是首)

4. 双向链表(节点尾插法 vListinsertEnd() )

5. 双向链表(节点升序排列 vListInsert() )

(1):获取节点的排序辅助值

(2):根据节点的排序辅助值,找到节点要插入的位置,按照升序排列

(3):按照升序排列,将节点插入到链表

6. 双向链表(将节点从链表删除 uxListRemove() )

7. 双向链表(插入实验)

(1):定义链表根节点,有根了,节点才能在此基础上生长

(2):定义 3 个普通节点

(3):链表根节点初始化

(4):节点初始化

(5):将节点按照他们的排序辅助值做升序排列插入到链表

8. 双向链表(带点带参宏小函数)

c 复制代码
#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner )		 ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) )	// 初始化节点的拥有者
#define listGET_LIST_ITEM_OWNER( pxListItem )				( ( pxListItem )->pvOwner )										// 获取节点拥有者
#define listSET_LIST_ITEM_VALUE( pxListItem, xValue )				( ( pxListItem )->xItemValue = ( xValue ) )					// 初始化节点排序辅助值
#define listGET_LIST_ITEM_VALUE( pxListItem )							( ( pxListItem )->xItemValue )										// 获取节点排序辅助值
#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList )			( ( ( pxList )->xListEnd ).pxNext->xItemValue )			// 获取链表根节点的节点计数器的值
#define listGET_HEAD_ENTRY( pxList )										( ( ( pxList )->xListEnd ).pxNext )								// 获取链表的入口节点
#define listGET_NEXT( pxListItem )												( ( pxListItem )->pxNext )											// 获取节点的下一个节点
#define listGET_END_MARKER( pxList )										( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) )	// 获取链表的最后一个节点
#define listLIST_IS_EMPTY( pxList )												( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) )	// 判断链表是否为空
#define listCURRENT_LIST_LENGTH( pxList )								( ( pxList )->uxNumberOfItems )								// 获取链表的节点数
// 获取链表第一个节点的 OWNER,即 TCB
#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) 		{ List_t * const pxConstList = ( pxList ); \	
																									( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \	// 节点索引指向链表第一个节点
																									if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \
																									{ ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;  } \
																									( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; }					// 获取节点的 OWNER,即 TCB
相关推荐
沫璃染墨4 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
树下困觉眯8 小时前
View绘制流程学习--获取WindowManager的三种方式
android·系统架构·view design
沫璃染墨1 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
艺杯羹1 天前
Anthropic突袭发布Claude Code Mods!用TypeScript编写智能体中间件:告别AI误删与失控
人工智能·typescript·系统架构
沫璃染墨2 天前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
诚心呈意共享外卖配送系统2 天前
共享骑手与聚合配送的区别及系统架构设计:运力池与订单聚合如何落地
架构·系统架构·创业创新
风123456789~2 天前
【架构设计】第17章 通信系统架构设计 2/2
系统架构
诚心呈意共享外卖配送系统3 天前
众包配送调度系统选什么?聊聊派单、抢单、合单与结算的技术设计
架构·系统架构·创业创新
abigalexy3 天前
图解AI应用架构设计
人工智能·ai·架构·系统架构·aigc
沫璃染墨3 天前
《从零入门Linux系统篇(五十三):线程篇·六——线程互斥详解:从并发问题到mutex互斥锁》
linux·运维·服务器·开发语言·后端·架构·系统架构