kbtree.h: generic search tree based on B-tree.
第一部分: 在算法开始前, 定义一些数据结构:
定义树的最大深度.
0035 #define KB_MAX_DEPTH 64 定义树的最大深度是64
这是树的一个结点的定义, 这里面使用的是C语言的bit fields
在这里, 就是四个字节,分别is_internal是占一个bit, n占了31个bit
0037 typedef struct { 0038 int32_t is_internal:1, n:31; 0039 } kbnode_t;
第二部分: 所暴露的函数, 与初始化
0364 #define KBTREE_INIT(name, key_t, __cmp) 0365 __KB_TREE_T(name) 0366 __KB_INIT(name, key_t) 0367 __KB_GET_AUX1(name, key_t, __cmp) 0368 __KB_GET(name, key_t) 0369 __KB_INTERVAL(name, key_t) 0370 __KB_PUT(name, key_t, __cmp) 0371 __KB_DEL(name, key_t) 0372 __KB_ITR(name, key_t)
2.1 定义代表树的结构
第一个__KB_TREE_T(name)所定义的是一个结构体, 用于代表这个树
0053 #define __KB_TREE_T(name) 0054 typedef struct { 0055 kbnode_t *root; 0056 int off_key, off_ptr, ilen, elen; 0057 int n, t; 0058 int n_keys, n_nodes; 0059 } kbtree_##name##_t;
2.2 定义初始化树的函数
0061 #define __KB_INIT(name, key_t) 0062 kbtree_##name##_t *kb_init_##name(int size)
具体的函数实现在 3.1 中说明这个函数说什么
第三部分: 具体的函数的实现
3.1 初始化函数kb_init_##name(s) 的函数的代码如下:
0062 kbtree_##name##_t *kb_init_##name(int size) 0063 { 0064 kbtree_##name##_t *b; \ 定义一个名字为b的树的代表 0065 b = (kbtree_##name##_t*)calloc(1, sizeof(kbtree_##name##_t)); \ 给b分配相关的内存 0066 b->t = ((size - 4 - sizeof(void*)) / (sizeof(void*) + sizeof(key_t)) + 1) >> 1; \ key_t 是自己定义的一个键值的类型. 0067 if (b->t < 2) { 0068 free(b); return 0; 0069 } 0070 b->n = 2 * b->t - 1; 0071 b->off_ptr = 4 + b->n * sizeof(key_t); 0072 b->ilen = (4 + sizeof(void*) + b->n * (sizeof(void*) + sizeof(key_t)) + 3) >> 2 << 2; 0073 b->elen = (b->off_ptr + 3) >> 2 << 2; 0074 b->root = (kbnode_t*)calloc(1, b->ilen); \ 分配一个root结点 0075 ++b->n_nodes; \ 结点数加1 0076 return b; 0077 }
时间: 2024-10-05 05:21:14