参考:野火仿真教程
插入一个数逻辑图
1.初始化链表
/* 链表根节点初始化 */
void vListInitialise( List_t * const pxList )
{
/* 将链表索引指针指向最后一个节点 */
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );//pxIndex会变成0x2000000C
/* 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点 */
pxList->xListEnd.xItemValue = portMAX_DELAY;
/* 将最后一个节点的pxNext和pxPrevious指针均指向节点自身,表示链表为空 */
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );//0x2000000C
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );//0x2000000C
/* 初始化链表节点计数器的值为0,表示链表为空 */
pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
}
2.插入链表尾部
/* 将节点插入到链表的尾部 */
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
{
ListItem_t * const pxIndex = pxList->pxIndex;//都会为0x2000000C 会重新生成一个类型为ListItem_t的pxIndex
/*这里需要注意的是pxIndex和 pxList->pxIndex和xListEnd的地址都是一样的都是0x2000000C,改变也随之改变*/
pxNewListItem->pxNext = pxIndex;//0x2000000C
pxNewListItem->pxPrevious = pxIndex->pxPrevious;//0x2000000C
pxIndex->pxPrevious->pxNext = pxNewListItem;//0x20000004
pxIndex->pxPrevious = pxNewListItem;//0x20000004
/* 记住该节点所在的链表 */
pxNewListItem->pvContainer = ( void * ) pxList;
/* 链表节点计数器++ */
( pxList->uxNumberOfItems )++;
}
这边主要是形成了一个闭环
3.插入链表中间
/* 将节点按照升序排列插入到链表 */
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 )
{
/* 没有事情可做,不断迭代只为了找到节点要插入的位置 */
}
}
pxNewListItem->pxNext = pxIterator->pxNext;
pxNewListItem->pxNext->pxPrevious = pxNewListItem;
pxNewListItem->pxPrevious = pxIterator;
pxIterator->pxNext = pxNewListItem;
/* 记住该节点所在的链表 */
pxNewListItem->pvContainer = ( void * ) pxList;
/* 链表节点计数器++ */
( pxList->uxNumberOfItems )++;
}
在这里插入图片描述