PS:从这篇文章开始,才是我写这个系列的初衷。因为这个部分本人在学习时看了很多视频才勉强搞懂这部分。不得不吐槽一句,这里B站上的课讲得好难······
所谓列表与列表项,对应的就是数据结构的链表与节点。虽然本系列文章是以野火为基础,但是这部分野火讲得实在有些抽象,为此本人特意去看了数据结构的链表。在这个过程中我在B站上找到了一个up,他的比喻让我觉得非常恰当,而且原理讲得也不错。
不看也没关系,我会再简单针对FreeRTOS描述一下链表。
如果看不懂,,可以看我的这篇文章:链表是什么-CSDN博客
链表由几个节点相连而成,节点由节点指针和携带的数据组成,节点指针指向下一个节点。
在FreeRTOS中,所有的的链表是首尾相接的,即首节点即尾结点。链表首尾相连的,成一个环形,仿佛圆形的晾衣架。链表上的每个节点就像衣架上面的钩子,钩子本身没什么东西,但是可以挂很多不一样的东西,比如衣服、袜子、毛巾之类的。正如节点一样,节点指针将节点连接起来,并携带不同类型的数据挂载在链表上,数据类型可以为int、float、char等。
因此,在单链表中每个节点必须包含一个节点指针,用来指向下一个节点。节点作为一个数据结构体,在里面可以有各种数据类型的信息,但这样的方式很少用。
我们一般使节点只包括一个节点指针,然后将这些节点内嵌到要挂载存储的数据中。
struct node //定义节点结构体
{
struct node *next; //节点指针,指向下一个节点
}
struct userlist //数据
{
struct node *next; //内嵌的指针
·
· //数据
·
}
大概流程如下:
链表常规的操作就是节点的插入和删除,为了顺利的插入,通常一条链表我们会人为地规定一个根节点,通常根节点还会有一个节点计数器,用于统计整条链表的节点个数。
在实际应用中,我们用的更多的是双向链表。双向链表与单向链表的区别就是节点中有两个节点指针,分别指向前后两个节点,其它完全一样。
至此,链表的简单介绍完毕,下一篇开始代码上的实现。
PS:野火讲的衣架那个比喻让我这个数据结构忘光了的人很难听懂,但是我稍微补了一下知识后发现其实这个例子十分的恰当。所以大家还是去学一下链表在听野火的课比较好······
还有这两个图是我拿野火的,等我有时间了就自己画个换掉。下部分代码好难TAT······
第二个图是我连下一篇一起画出来的,算是我对链表的最终理解吧。
单链表的没啥营养,就不画了,偷个懒,嘻嘻。