FreeRTOS 笔记之③:数据结构-- 列表和表项(链表和节点)

本文介绍了C语言中的链表基础知识,包括单向链表和双向链表,并详细讲述了FreeRTOS中链表的实现,包括节点和根节点的数据结构、初始化、插入和删除操作。此外,还探讨了链表与数组的对比以及链表节点插入的实验。
摘要由CSDN通过智能技术生成

目录

1. C语言链表

1.1 单向链表

1.2 双向链表

1.3 链表的操作

1.4 链表与数组的对比

2. FreeRTOS中链表的实现

2.1 实现链表节点

2.2 实现链表根节点

2.2.1 根节点数据结构

2.2.2 链表根节点的初始化

2.2.3 将节点插入到链表的尾部

2.2.4 将节点按照升序排列插入到链表

2.2.5 将节点从链表删除

2.2.6 节点带参宏小函数

3. 链表节点插入实验


在FreeRTOS中存在着大量的基础数据结构列表和列表项的操作,要想读懂FreeRTOS的源码或者从0到1开始实现FreeRTOS,就必须弄懂列表和列表项的操作,其实也没那么难。

列表和列表项是直接从FreeRTOS源码的注释中的list 和 list item翻译过来的,其实就是对应我们C语言当中的链表和节点,在后续的讲解中,我们说的链表就是列表,节点就是列表项。

1. C语言链表

链表作为C语言中一种基础的数据结构,在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。链表就好比一个圆形的晾衣架,晾衣架上面有很多钩子,钩子首尾相连。链表也是,链表由节点组成,节点与节点之间首尾相连。

晾衣架的钩子本身不能代表很多东西,但是钩子本身却可以挂很多东西。同样,链表也类似,链表的节点本身不能存储太多东西,或者说链表的节点本来就不是用来存储大量数据的,但是节点跟晾衣架的钩子一样,可以挂很多数据。

链表分为单向链表和双向链表,单向链表很少用,使用最多的还是双向链表。

1.1 单向链表

单向链表示意图。该链表中共有n个节点,前一个节点都有一个箭头指向后一个节点,首尾相连,组成一个圈。

 节点本身必须包含一个节点指针,用于指向后一个节点,除了这个节点指针是必须有的之外,节点本身还可以携带一些私有信息,怎么携带?

节点都是一个自定义类型的数据结构,在这个数据结构里面可以有单个的数据、数组、指针数据和自定义的结构体数据类型等等信息。

struct node {
    struct node *pNext;     /* 指向链表的下一个节点 */
    char cData;             /* 单个数据 */
    unsigned char array[];  /* 数组数据 */
    unsigned long * ptr;    /* 指针数据 */
    struct usrStruct xData; /* 自定义结构体数据 */
    /* ... ...  */
};

除了struct node *next 这个节点指针之外,剩下的成员都可以理解为节点携带的数据,但是这种方法很少用。通常的做法是节点里面只包含一个用于指向下一个节点的指针。要通过链表存储的数据内嵌一个节点即可,这些要存储的数据通过这个内嵌的节点即可挂接到链表中,就好像晾衣架的钩子一样,把衣服挂接到晾衣架中。

struct node {
    struct node *pNext;     /* 指向链表的下一个节点 */
};

1.2 双向链表

双向链表与单向链表的区别就是节点中有两个节点指针,分别指向前后两个节点,其它完全一样。有关双向链表的文字描述参考单向链表小节即可。

1.3 链表的操作

链表常规的操作就是节点的插入和删除,为了顺利的插入,通常一条链表我们会人为地规定一个根节点,这个根节点称为生产者。通常根节点还会有一个节点计数器,用于统计整条链表的节点个数。

有关链表节点的删除和操作的代码讲解这里先略过,具体的可参考本章接下来的“FreeRTO中链表的实现”小节,在这个小节里面会有非常详细的讲解,这里我们先建立概念为主。

1.4 链表与数组的对比

两者的示意图

链表是通过节点把离散的数据链接成一个表,通过对节点的插入和删除操作从而实现对数据的存取。而数组是通过开辟一段连续的内存来存储数据,这是数组和链表最大的区别。

数组的每个成员对应链表的节点,成员和节点的数据类型可以是标准的C类型或者是用户自定义的结构体。

数组有起始地址和结束地址,而链表是一个圈,没有头和尾之分,但是为了方便节点的插入和删除操作会人为的规定一个根节点。 

2. FreeRTOS中链表的实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值