B树的增删改查

这篇博客深入探讨了B树的数据结构,详细介绍了如何在保持B树结构不变的前提下进行节点的增加、删除、修改和查找操作。通过节点分裂确保了数据的有序性,并且提到了插入顺序对构建不同B树的影响。此外,还涵盖了B树的遍历和打印方法。
摘要由CSDN通过智能技术生成
#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 &#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值