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 *); |
|
本文深入探讨了Linux内核中的链表、哈希链表以及红黑树数据结构的定义、操作、初始化、遍历等关键特性,提供了丰富的实例和代码片段,旨在帮助开发者深入了解这些数据结构在内核中的应用。

2万+

被折叠的 条评论
为什么被折叠?



