1 链表
Linux内核链表数据结构
#include <linux/list.h> struct list_head { struct list_head *next; struct list_head *prev; }; |
常见数据结构定义方式: struct fox { unsigned long tail_length; unsigned long weight; /*将数据结构插入到链表*/ struct fox *next; struct fox *prev; }; 内核定义一个链表: struct fox { struct list_head list; /*将链表节点插入到数据结构*/ unsigned long tail_length; unsigned long weight; }*red_fox; |
操作 | 函数 | 说明 |
初始化链表 | INIT_LIST_HEAD(&red_fox->list); | 运行时初始化 |
.list = LIST_HEAD_INIT(red_fox.list); | 编译时初始化 | |
添加节点 | list_add(struct list_head *new, struct list_head *head); | head后插入 |
list_add_tail(new, head); | head前插入 | |
删除节点 | list_del(struct list_head *entry); | 删除 |
list_del_init(struct list_head *entry); | 删除并初始化 | |
移除节点 | list_move(struct list_head *list, struct list_head *head); | 移除list插head后 |
list_move_tail(new, head); | 移除list插head前 | |
合并节点 | list_splice(struct list_head *list, struct list_head *head); 把list指向的链表插入到指定链表head的后面 | head后插入list作为头节点的链表,且list不初始化 |
list_splice_init(list, head); | 初始化list | |
list_splice_tail(list,head); | head前插入list | |
list_splice_tail_init(list, head); | 初始化list | |
链表判空 | list_empty(struct list_head *head) { return head == head->next;} | 空返回1,不空返0 |
遍历链表 | list_for_each_entry(pos, head, member) | 沿next遍历 |
list_for_each_entry_reverse(pos, head, member) | 沿prev遍历 | |
list_for_each_entry_safe(pos, next, head, member) | 遍历,且pos可删 | |
list_for_each_entry_safe_reverse(pos,next,head,member) | 遍历,且pos可删 |
2 哈希链表
/*哈希链表结构*/ #include <linux/list.h> struct hlist_head //哈希链表头 { struct hlist_node *first; }; struct hlist_node //哈希链表节点 { struct hlist_node *next, **pprev; }; |
操作 | 函数 | 说明 |
初始化 | INIT_HLIST_HEAD (ptr) | 初始化哈希链表头 |
INIT_HLIST_NODE (struct hlist_node *h) | 初始化哈希链节点 | |
添加节点 | hlist_add_head(struct hlist_node *n, struct hlist_head *h) | h后插入 |
hlist_add_before(struct hlist_node *n, hlist_node *next) hlist_add_after(struct hlist_node *n,hlist_node *next) | 节点next前插入n 节点next后插入n | |
删除节点 | hlist_del(struct hlist_node *n) | 删除 |
hlist_del_init(struct hlist_node *n) | 删除并初始化 | |
哈希链表 判空 | hlist_empty(const struct hlist_head *h) { return !h->first; } | 空返回1,不空返0 |
遍历哈希 链表 | hlist_for_each(pos, head) | 沿next遍历 |
hlist_for_each_safe(pos, n, head) | next遍历,pos可删 | |
hlist_for_each_entry(tpos, pos, head, member) | 遍历 | |
hlist_for_each_entry_safe(tpos, pos, n, head, member) | 遍历,且pos可删 |
3 红黑树
二叉搜索树(简称BST)或者是一个空树,或者是一个节点有序的二叉树,且具有下列性质:
1根的左分支节点值都小于根节点值
2根的右分支节点值都大于根节点值
3所有的子树也都是二叉搜索树
平衡二叉(搜索)树是一个所有叶子节点深度差不超过1的二叉搜索树。
自平衡二叉搜索树是指其操作都试图维持平衡的二叉搜索树。
红黑树是一种自平衡的二叉搜索树。Linux主要的平衡二叉搜索树数据结构就是红黑树。红黑树具有特殊的着色属性,或红色或黑色。红黑树因遵循下面的6个属性,所以能维持半平衡结构:
1.所有的节点要么着红色,要么着黑色
2.叶子节点都是黑色(叶子是NIL节点)
3.叶子节点不包含数据
4.所有非叶子节点都有两个子节点
5.如果一个节点是红色,则它的子节点都是黑色
6.在一个节点到其叶子节点的路径中,如果总是包含同样数目的黑色节点,则该路径相比其他路径是最短的。
红黑树数据结构:
#include <linux/rbtree.h> struct rb_node { unsigned long rb_parent_color; #define RB_RED 0 #define RB_BLACK 1 struct rb_node *rb_right; struct rb_node *rb_left; } __attribute__((aligned(sizeof(long)))); /* The alignment might seem pointless, but allegedly CRIS needs it */
struct rb_root { struct rb_node *rb_node; }; |
操作 | 函数 | 说明 |
初始化 | struct rb_root myroot = RB_ROOT; | 建立树根 |
插入节点 | void rb_insert_color(struct rb_node *, struct rb_root *); |
|
删除节点 | void rb_erase(struct rb_node *, struct rb_root *); |
|
查找节点 | #define rb_entry(ptr, type, member) container_of(ptr, type, member) |
|
遍历节点 | struct rb_node *rb_next(struct rb_node *); |
|
struct rb_node *rb_prev(struct rb_node *); |
| |
struct rb_node *rb_first(struct rb_root *); |
| |
struct rb_node *rb_last(struct rb_root *); |
|