1. C语言链表简介
链表作为C语言中一种基础的数据结构,在操作系统里面使用的非常多。
1.1 单链表
单链表:节点本身必须包含一个节点指针,用于指向后一个节点,除了这个节点指针是必须有的之外,节点本身还可以携带一些私有信息。
struct node
{
struct node *next //指向链表的下一个节点
char datal; //单个的数据
unsigned char array[]; //数组
unsigned long *prt //指针数据
struct userstruct data2;//自定义结构体类型数据
}
struct node //节点定义
{
struct node *next;
}
struct userstruct
{
/* 在结构体中,内嵌一个节点指针,通过这个节点将数据挂接到链表 */
struct node *next;
/* 各种要存储的数据 */
}
通常一条链表我们会人为地规定一个根节点
1.2 双向链表
双向链表:节点中有两个节点指针,分别指向前后两个节点
与数组对比
2. FreeRTOS中链表的实现
2.1 实现链表节点
FreeRTOS中与链表相关的操作均在list.h和list.c这两个文件中实现
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; //节点数据类型重定义
2.2 链表节点初始化
链表节点初始化函数在list.c中实现。
2.3 定义链表根节点数据结构
链表根节点的数据结构在list.h中定义。
链表根节点的初始化在list.c中实现:
vListInitialise()。
2.3 将节点插入到链表的尾部
将节点插入到链表的尾部在list.c中实现,
函数:vListInsertEnd()。
2.4 将节点按照升序排列插入到链表
将节点按照升序排列插入到链表在list.c中实现,
函数:vListInsert()。
2.5 将节点从链表删除
将节点从链表删除在list.c中实现,
函数:uxListRemove()。
3. 实验
3.1 链表节点插入实验
新建一个根节点和三个普通节点,然后将这三个普通节点按照节点的
排序辅助值做升序排列插入到链表中。
理论情况如下: