#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define DEGREE 3
typedef int KEY_VALUE;
typedef struct _btree_node
{
KEY_VALUE *keys;
struct _btree_node **childrens;
int num;
int leaf;
} btree_node;
typedef struct _btree {
btree_node *root;
int t;
} btree;
以上是b树的声明,以下的增删改查一切都以不破坏b树的结构的前提下操作。
btree_node *btree_create_node(int t, int leaf) { t = 阶数 / 2
btree_node *node = (btree_node*)calloc(1, sizeof(btree_node)); //申请1个btree_node 大小的空间
if (node == NULL) assert(0);
node->leaf = leaf;
node->keys = (KEY_VALUE*)calloc(1, (2*t-1)*sizeof(KEY_VALUE));
node->childrens = (btree_node**)calloc(1, (2*t) * sizeof(btree_node));
node->num = 0;
return node;
}
void btree_destroy_node(btree_node *node) {
assert(node);
free(node->childrens);
free(node->keys);
free(node);
}
void btree_create(btree *T, int t) {
T->t = t;
btree_node *x = btree_create_node(t, 1);
T->root = x;
}
以上是创建一个b树的结点以及b树的创建
//结点key值满了的时候才进行分裂
/*
分裂的步骤
创建一个新的结点 把要被分裂的结点赋值给新节点
把多余的结点传给父节点
添加父节点的孩子结点
并且改变父节点的孩子结点
*/
void btree_split_child(btree *T, btree_node *x, int i) { //这应该是哪个结点的第几个孩子进行分裂
int t = T->t;
btree_node *y = x->childrens[i];
btree_node *z = btree_create_node(t, y->leaf);
z->num = t - 1;
int j = 0;
//把被分裂的结点传给新的结点
for (j = 0;j < t-1;j ++) {
z->keys[j] = y->keys[j+t];
}
//如果被分裂的结点不是叶子结点 孩子结点也要赋值给他
if (y->leaf == 0) {
for (j = 0;j < t;j ++) {
z->childrens[j] = y->childrens[j+t];
}
}
// 把z结点插入到父结点身上 孩子结点和key都发生变化
y->num = t - 1;
for (j &#