Linux内核常用数据结构

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);

移除listhead

list_move_tail(new, head);

移除listhead

 

合并节点

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 *);

 







  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值