原文地址:http://wuzufei.cn/linux_list.html
1 概述
通常情况下,我们使用C语言实现定义的链表节点形式如下:
struct Node {
int data;
struct Node* next;
};
常规使用一个结构体定义节点,然后在每个节点中保存前驱/后继节点的首地址,通过遍历每个节点中的next成员访问下一个节点;
而在linux 的内核实现中,链表节点定义方式如下:
struct list_head {
struct list_head *next, *prev;
}
struct data_node {
int val;
struct list_head data_list;
}
linux 使用两个结构体,data_list保存链表节点信息,data_node则是用于保存数据,然后在data_node中包含data_list;不同data_node通过data_list节点的next和prev指针关联,遍历数据的过程时遍历链表节点,然后判断每个链表节点所在数据结构体的字段信息,进行相应的CRUD。
常规实现直接将各个数据结构体串联起来,即数据节点本身就是链表的一个node;<