2.1链表
链表作为 C 语言中一种基础的数据结构,在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。链表就好比一个圆形的晾衣架,晾衣架上面有很多钩子,钩子首尾相连。链表也是,链表由节点组成,节点与节点之间首尾相连。
晾衣架的钩子本身不能代表很多东西,但是钩子本身却可以挂很多东西。同样,链表也类似,链表的节点本身不能存储太多东西,或者说链表的节点本来就不是用来存储大量 数据的,但是节点跟晾衣架的钩子一样,可以挂很多数据。链表有单向链表和双向链表。
2.2单向链表
节点本身必须包含一个节点指针,用于指向后一个节点,除了这个节点指针是必须有的之外,节点都是一个自定义类型的数据结构,在这个数据结构里面可以有单个的数据、数组、指针数据和自定义的结构体数据类型等等信息。
节点结构体:
struct node {
struct node *next; /* 链表下一个节点*/
char data1; /*单个数据*/
unsigned char array[];/*数据*/
unsigned long *prt; /*指针数据*/
struct userstruct data2;/*自定义结构体类型数据*/
}
通常的做法是节点里面只包含一个用于指向下一个节点的指针。要通过链表存储的数据内嵌一个节点即可,这些要存储的数据通过这个内嵌 的节点即可挂接到链表中,就好像晾衣架的钩子一样,把衣服挂接到晾衣架中.
2.3链表与数组的区别(重点)
链表是通过节点把离散的数据链接成一个表,通过对节点的插入和删除操作从而实现 对数据的存取。
数组是通过开辟一段连续的内存来存储数据,这是数组和链表最大的区别。
数组的每个成员对应链表的节点,成员和节点的数据类型可以是标准的 C 类型或者是 用户自定义的结构体。数组有起始地址和结束地址,而链表是一个圈,没有头和尾之分, 但是为了方便节点的插入和删除操作会人为的规定一个根节点(生产者)。
2.4FreeRTOS中链表的定义
FreeRTOS 中与链表相关的操作均在 list.h 和 list.c 这两个文件中实现。在list中包括了:
1.定义链表根节点数据结构
2.链表根节点初始化
3.将节点插入到链表的尾部
4.将节点排序
5.将节点从链表删除
2.5链表节点插入例子(帮助理解
#include "list.h"
/*定义根节点*/
struct xLIST List_Test;
/*定义节点*/
struct xLIST_ITEM List_ITEM1;
struct xLIST_ITEM List_ITEM2;
struct xLIST_ITEM List_ITEM3;
int main(void)
{
/* 链表根节点初始化 */
vListInitialise( &List_Test );
/* 节点1初始化 */
vListInitialiseItem( &List_Item1 );
List_Item1.xItemValue = 1;
/* 节点2初始化 */
vListInitialiseItem( &List_Item2 );
List_Item2.xItemValue = 2;
/* 节点3初始化 */
vListInitialiseItem( &List_Item3 );
List_Item3.xItemValue = 3;
/* 将节点插入链表,按照升序排列 */
vListInsert( &List_Test, &List_Item1 );
vListInsert( &List_Test, &List_Item2 );
vListInsert( &List_Test, &List_Item3 );
for (;;)
{
/* 啥事不干 */
}
}