FreeRtos进阶——通用链表的实现方式

通用链表实现方式(一)

c 复制代码
struct node_t {
	struct node_t *next;
};

struct person {
    struct node_t node;
    char *name;
    int age;
};

struct dog {
    struct node_t node;
    char *name;
    int age;
    char *class;
};

在此链表中,node结构体被放在了最前面,因此当我们用node结构体存储不同类型(dog或者person)结构体信息时,node 结构体位置就是dog或者person结构体的位置。在想要使用dog或者person时,只需要使用强制类型转换的方法即可。

通用链表实现方式(二)

使用操作系统:Linux,RT-Thread

c 复制代码
struct person {
    char *name;
    int age;
    struct node_t node;
    char *address;
};

struct dog {
    char *name;
    int age;
    char *class;
    struct node_t node;    
};

在此链表中,node结构体的位置在最后面,因此我们需要根据person或者dog结构体的大小反推出他们的指针起始位置。

具体代码如下:

cpp 复制代码
p = (struct person *)((char *)pre - (unsigned int)&((struct person *)0)->node);
n = (struct person *)((char *)next - (unsigned int)&((struct person *)0)->node);

pre指针转换为char*后加减操作是以字节为单位了,否则是以sizeof(struct node_t)为单位来进行加减计算。

unsigned int类型的强制转换是因为要减去对应的字节数。

通用链表实现方式(三)

使用操作系统:FreeRtos

cpp 复制代码
struct node_t {
    void *container;
	struct node_t *next;
};

与前面俩种方法类似,如果直接在contianer存储person或者dog的结构体地址,那么就不需要再去计算或者反推对应结构体的地址了。

相关推荐
小马学嵌入式~7 小时前
数据结构:队列 二叉树
c语言·开发语言·数据结构·算法
省四收割者9 小时前
Go语言入门(10)-数组
数据结构·经验分享·笔记·vscode·算法·golang
烟花的学习笔记10 小时前
【科普向-第三篇】汽车电子MCU操作系统详解:CP AUTOSAR与FreeRTOS
操作系统·freertos·autosar·嵌入式开发·汽车电子·cp autosar
月盈缺11 小时前
学习嵌入式的第二十四天——数据结构——队列和树
数据结构·学习
Elieal12 小时前
Java 链表完全指南:从基础到力扣简单题实战
java·leetcode·链表
Y40900115 小时前
Java算法之排序
java·数据结构·笔记·算法
艾莉丝努力练剑17 小时前
【C语言16天强化训练】从基础入门到进阶:Day 6
c语言·数据结构·学习·算法
快去睡觉~18 小时前
力扣1005:k次取反后最大化的数组和
数据结构·算法·leetcode
想不明白的过度思考者18 小时前
初识数据结构——Map和Set:哈希表与二叉搜索树的魔法对决
数据结构·散列表
天意生信云18 小时前
生信分析自学攻略 | R语言数据筛选和修改
数据结构·经验分享·r语言