声明及感谢: 跟随正点原子资料学习, 在此作为学习的记录和总结
环境 keil , stm32f103
首先定义列表,以及列表项;
List_t TestList; // 列表
ListItem_t ListItem1; // 列表项1
ListItem_t ListItem2; // 列表项2
ListItem_t ListItem3; // 列表项3
第一步: 初始化列表和列表项
// 初始化列表和列表项
vListInitialise(&TestList);
vListInitialiseItem(&ListItem1);
vListInitialiseItem(&ListItem2);
vListInitialiseItem(&ListItem3);
第二步:给列表项值赋值
ListItem1.xItemValue=40;
ListItem2.xItemValue=60;
ListItem3.xItemValue=50;
第三步: 插入列表项
插入的第一种方法
vListInsert(&TestList,&ListItem1);
vListInsert(&TestList,&ListItem2);
vListInsert(&TestList,&ListItem3);
到此,TestList列表会有三个列表项
其中使用vListInsert插入列表项的顺序和插入的先后无关,而与列表项的值有关,
因为 ListItem2.xItemValue 的值大于 ListItem3.xItemValue 的值,所以就算代码中ListItem2先插入,但是ListItem3在ListItem2的前面
插入的第二种方法
vListInsertEnd(&TestList,&ListItem2);
vListInsertEnd 此函数为尾插入方式,但是和字面上的尾插入还有很大的不同vListInsertEnd 插入列表项的位置
和列表中的pxIndex成员变量有关,
一开始pxIndex 指向的时列表的列表头,也就是说指向的是TestList本身,所以在默认情况下vListInsertEnd插入会插入到
TestList的前面,有因为这个是环形链表,就相当于插入到末尾位置。
但是如果改变的pxIndex指向的位置,就会插入新的pxIndex指向位置的前面。
类似。
vListInsert(&TestList,&ListItem1);
// 在此后面改变了pxIndex指向位置
TestList.pxIndex=TestList.pxIndex->pxNext; // 相当于pxIndex 指向了ListItem1
// 此时进行尾插入,
vListInsertEnd(&TestList,&ListItem2);
那么就相当于在TestList 和 ListItem1 中间插入
那么整个链表就是TestList 先指向 ListItem2 , 然后ListItem2 指向 ListItem1
链表的删除
uxListRemove(&ListItem2);
直接调用uxListRemove 的API函数即可
为什么删除不需要传入,是哪个列表的参数呢?
因为
列表项中的有一个参数成员pvContainer 记录了当前列表项时属于哪个列表的,所以不需要传入哪个列表参数。