一、使用内核红黑树文件rbtree
1.1 内核红黑树文件
rbtree.h:/usr/src/kernels/2.6.32-279.el6.x86_64/include/linux/rbtree.h
rbtree.c:/usr/src/kernels/2.6.32-279.el6.x86_64/lib/rbtree.c
1.2 修改rbtree.h
修改包含头文件,增加3个宏定义:
//删除以下两行代码
//#include
//#include
//增加下面3个宏定义
/* 2.6.32-279.el6.x86_64/include/linux/stddef.h */
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
/* 2.6.32-279.el6.x86_64/include/linux/stddef.h */
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
/* 2.6.32-279.el6.x86_64/include/linux/kernel.h */
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
1.3 修改rbtree.c
修改包含头文件的代码:
//删除以下两行代码
//#include
//#include
//增加包含头文件的代码
#include "rbtree.h"
删除所有的EXPORT_SYMBOL宏:
//EXPORT_SYMBOL(rb_insert_color);
//EXPORT_SYMBOL(rb_erase);
//EXPORT_SYMBOL(rb_first);
//EXPORT_SYMBOL(rb_last);
//EXPORT_SYMBOL(rb_next);
//EXPORT_SYMBOL(rb_prev);
//EXPORT_SYMBOL(rb_replace_node);
二、代码
2.1 test.c
#include
#include
#include "rbtree.h"
struct rbt_data
{
struct rb_node data_node;
int num;
};
struct rbt_data* rbt_search(struct rb_root *root, int num)
{
struct rb_node *node = root->rb_node;
while(node)
{
struct rbt_data *data = container_of(node, struct rbt_data, data_node);
if (num < data->num)
node = node->rb_left;
else if (num > data->num)
node = node->rb_right;
else
return data;
}
return NULL;
}
int rbt_insert(struct rb_root *root, struct rbt_data *data)
{
struct rb_node **tmp = &(root->rb_node);
struct rb_node *parent = NULL;
while (*tmp)
{
struct rbt_data *cur = container_of(*tmp, struct rbt_data, data_node);
parent = *tmp;
if(data->num < cur->num)
tmp = &((*tmp)->rb_left);
else if(data->num > cur->num)
tmp = &((*tmp)->rb_right);
else
return -1;
}
rb_link_node(&(data->data_node), parent, tmp);
rb_insert_color(&(data->data_node), root);
return 0;
}
void rbt_delete(struct rb_root *root, int num)
{
struct rbt_data *data = rbt_search(root, num);
if (!data)
{
fprintf(stderr, "Not fount %d.\n", num);
return;
}
rb_erase(&(data->data_node), root);
free(data);
}
void print_rbtree(struct rb_root *root)
{
struct rb_node *node;
for(node = rb_first(root); node; node = rb_next(node))
printf("%d ", rb_entry(node, struct rbt_data, data_node)->num);
printf("\n");
}
int main(int argc, char*argv[])
{
struct rb_root root = RB_ROOT;
struct rbt_data *data;
int i;
printf("please enter 5 integers:\n");
for(i=0; i<5; i++)
{
data = malloc(sizeof(struct rbt_data));
if(!data)
{
perror("fail to malloc.");
}
scanf("%d", &data->num);
int ret = rbt_insert(&root, data);
if (ret < 0)
{
fprintf(stderr, "the %d already exists.\n", data->num);
i--;
free(data);
}
}
printf("\nthe first output:\n");
print_rbtree(&root);
int num;
printf("\nplease enter the num to delete:\n");
scanf("%d", &num);
rbt_delete(&root, num);
printf("\nthe second output:\n");
print_rbtree(&root);
return 0;
}
三、编译执行
3.1 编译
gcc test.c rbtree.c -o test
3.2 执行结果
参考资料:
红黑树(经典讲解):http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html
详解Linux内核红黑树算法的实现:http://blog.csdn.net/npy_lp/article/details/7420689
红黑树:http://blog.csdn.net/eric491179912/article/details/6179908
AVL树的旋转:http://blog.csdn.net/gabriel1026/article/details/6311339
二叉查找树中节点的删除:http://blog.csdn.net/sb1ue/article/details/8922326
#pragma pack(n)和__attribute__((aligned(m)))的区别:http://blog.163.com/tyw_andy/blog/static/11679021200910635047652/