双向循环链表:list_head
头节点head是不使用的:
struct list_head {
struct list_head *next, *prev;
};
结构体中没有数据域,所以一般把list_head嵌入到其他结构中使用
struct file_node {
char c;
struct list_head node;
};
此时,list_head就作为它父结构体中的一个成员了,我们知道list_head的地址(指针)时,就可以通过list_entry来获得它的父结构的地址
#define list_entry(ptr, type, member) container_of(ptr,type,member)
通过结构体成员地址来求得结构体地址:ptr是所求结构体中的list_head成员指针,type是所求结构体类型,member是结构体list_head成员名
list_for_each:遍历双向链表
LIST_HEAD():生成双向链表头节点
list_add():插入操作
list_del():删除操作
list_empty():判断是否为空