链表的创建要用到三个结构体
/* 节点结构体定义 */
struct xLIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */
void * pvOwner; /* 指向拥有该节点的内核对象,通常是TCB */
void * pvContainer; /* 指向该节点所在的链表 */
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */
/* mini节点结构体定义,作为双向链表的结尾
因为双向链表是首尾相连的,头即是尾,尾即是头 */
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;
首先是链表初始化结构体
void vListInitialise( List_t * const pxList ) { /* 将链表索引指针指向最后一个节点 */ pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /* 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点 */ pxList->xListEnd.xItemValue = portMAX_DELAY; /* 将最后一个节点的pxNext和pxPrevious指针均指向节点自身,表示链表为空 */ pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /* 初始化链表节点计数器的值为0,表示链表为空 */ pxList->uxNumberOfItems = ( UBaseType_t ) 0U; }
关于pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );
因为List_t 中pxIndex指针类型为(ListItem_t*) 与 xListEnd的类型(MiniListItem_t)不匹配,所以需要将xListEnd的类型强制转换为(Listltem_t*);
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );这两条语句中,pxNext与pxPrevious的类型 ( xLIST_ITEM * ) 与 xListEnd的类型(MiniListItem_t)不匹配,所以需要将xListEnd的类型强制转换为(Listltem_t*);