链表
- [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







