赞
踩
include/linux/list.h
中代码1 list结构体定义 include/linux/types.h
struct list_head {
struct list_head *next, *prev;
};
代码2 将list嵌入到自己的数据中
struct our_struct {
int our_data;
struct list_head node;
};
list_entry()
从list_head
对应到我们自定义的结构
list_entry
通过container_of
实现list 常用接口
初始化
LIST_HEAD_INIT()
/ LIST_HEAD()
INIT_LIST_HEAD()
修改list
list_add(new, add)
list_del(entry)
list_replace(old, new)
list_move(list, head)
list_splice()
list_cut_position(list, head, entry)
将head从entry的位置删除分开,并将前一部分链入到list中测试
list_empty()
list_empty_careful()
测试list是否为空并且没有正在被修改,通常用于lockless的情况;注意,删除一端必须要重新初始化(list_del_init()
),而不是重新加入List遍历
list_for_each_entry()
list_for_each_entry_reverse()
list_for_each_entry_continue(pos, head, member)
从指定的位置起开始遍历list_for_each_entry_continue_reverse()
list_for_each_entry_safe()
用于在遍历的时候本身可能被删除的情况。注意,只限于本身被删除,如果是后续节点被删除必须重新开始遍历代码3 list示例
#include <linux/module.h> #include <linux/kthread.h> #include <linux/delay.h> #include <linux/slab.h> // 用于内存分配 #include <linux/list.h> MODULE_AUTHOR("OneGhost"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("The module is only used for test"); #define MAX_LIST 10 struct our_data { int i; struct list_head list; }; static void list_test(void) { int i; struct our_data *node, *next; LIST_HEAD(lhead); for (i = 0; i < MAX_LIST; i++) { struct our_data *data; data = kmalloc(sizeof(*data), GFP_KERNEL); if (!data) { goto clean; } data->i = i; list_add(&data->list, &lhead); } list_for_each_entry(node, &lhead, list) printk("list entry: %d.\n", node->i); clean: list_for_each_entry_safe(node, next, &lhead, list) kfree(node); } static __init int minit(void) { printk("call %s.\n", __FUNCTION__); list_test(); return 0; } static __exit void mexit(void) { printk("call %s.\n", __FUNCTION__); } module_init(minit) module_exit(mexit)
运行结果
[17528.366481] call minit.
[17528.366490] list entry: 9.
[17528.366497] list entry: 8.
[17528.366503] list entry: 7.
[17528.366510] list entry: 6.
[17528.366516] list entry: 5.
[17528.366522] list entry: 4.
[17528.366529] list entry: 3.
[17528.366536] list entry: 2.
[17528.366542] list entry: 1.
[17528.366549] list entry: 0.
[17532.834926] call mexit.
struct hlist_head
,而中间节点用struct hlist_node
:代码4 hlist结构
struct hlist_head {
struct hlist_node *first;
};
struct hlist_node {
struct hlist_node *next, **pprev;
};
hlist_entry()
HLIST_HEAD_INIT
HLIST_HEAD()
INIT_HLIST_HEAD()
INIT_HLIST_NODE()
hlist_add_head()
hlist_add_before(n, new)
hlist_add_after(n, new)
hlist_del()
hlist_move_list()
hlist_empty()
hlist_unhashed()
测试中间节点是否在hlist中hlist_for_each_entry()
hlist_for_each_entry_safe()
一边遍历一边删除当前节点例子5
#include <linux/module.h> #include <linux/kthread.h> #include <linux/delay.h> #include <linux/slab.h> // 用于内存分配 #include <linux/list.h> MODULE_AUTHOR("OneGhost"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("The module is only used for test"); #define MAX_LIST 10 struct our_data { int i; struct hlist_node list; }; static void list_test(void) { int i; struct our_data *node; struct hlist_node *next; HLIST_HEAD(lhead); for (i = 0; i < MAX_LIST; i++) { struct our_data *data; data = kmalloc(sizeof(*data), GFP_KERNEL); if (!data) { goto clean; } data->i = i; hlist_add_head(&data->list, &lhead); } hlist_for_each_entry(node, &lhead, list) printk("list entry: %d.\n", node->i); clean: hlist_for_each_entry_safe(node, next, &lhead, list) kfree(node); } static __init int minit(void) { printk("call %s.\n", __FUNCTION__); list_test(); return 0; } static __exit void mexit(void) { printk("call %s.\n", __FUNCTION__); } module_init(minit) module_exit(mexit)
#include <linux/rculist.h>
INIT_LIST_HEAD_RCU();
hlist_first_rcu
来初始化hlist_headlist_for_each_entry_rcu()
hlist_for_each_entry_rcu()
list_add_rcu()
list_add_tail_rcu()
list_del_rcu()
list_replace_rcu()
list_splice_init_rcu()
hlist_del_rcu()
hlist_replace_rcu()
hlist_add_head_rcu()
include/linux/rbtree.h
中struct rb_node
,其内嵌在我们自定义的结构体(与list类似),使用rb_entry()
来从rb_node
转换到自定义结构struct rb_root
struct rb_root mytree = RB_ROOT;
rb_list_node(node, parent, rb_link)
将新节点插入到tree,最后调用rb_insert_color(node, root)
来配色rb_erase(victim, root)
rb_replace_node(old, new, tree)
rb_fist(tree)
rb_last(tree)
rb_next(tree)
rb_prev(tree)
代码6 红黑树的搜索
struct mytype *my_search(struct rb_root *root, char *string) {
struct rb_node *node = root->rb_node;
while (node) {
struct mytype *data = container_of(node, struct mytype, node);
int result;
result = strcmp(string, data->keystring);
if (result < 0)
node = node->rb_left;
else if (result > 0)
node = node->rb_right;
else
return data;
}
return NULL;
}
代码7 插入红黑树
int my_insert(struct rb_root *root, struct mytype *data) { struct rb_node **new = &(root->rb_node), *parent = NULL; while (*new) { struct mytype *this = container_of(*new, struct mytype, node); int result = strcmp(data->keystring, this->keystring); parent = *new; if (result < 0) new = &((*new)->rb_left); else if (result > 0) new = &((*new)->rb_right); else return FALSE; } rb_link_node(&data->node, parent, new); rb_insert_color(&data->node, root); return TRUE; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。