B+树C语言实现

本文档详细介绍了如何用C语言实现B+树的数据结构,包括已验证正确的编译和测试过程,特别关注了插入操作的实现,删除操作与之类似。
摘要由CSDN通过智能技术生成

B+树C语言版本,编译通过,测试正确

插入部分实现,其中删除和插入类似

#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#include<string.h>

#define M 2 //The minimum degree of this B+ tree
#define KeyNumMax 2*M-1//Maximum Key Number
#define KeyNumMin M-1//Minimum Key Number


//
typedef int KeyType;
typedef struct Node* Position;
typedef struct rNode* Search_Insert_Position_Result;
typedef struct List_Node* Path_List;
//data struct
typedef struct Node{
	bool IsLeaf;
	int KeyNum;
	KeyType Key[KeyNumMax];
	Position PtrChild[KeyNumMax];
	Position Next_Leaf_Node;
}Node;
typedef struct rNode{
	Position Insert_Position;
	int Key_Position;
}rNode;
typedef struct List_Node{
	Path_List Pre_List_Node;
	Path_List Next_List_Node;
	Position Path_List_Tree_Node;
	int The_Ith_Child_of_Parent;
}List_Node;

//global variable
Position ROOT;
Path_List Path_List_Header;
Path_List Path_List_Tail;
//Make Node
Position Make_New_Node()
{
	Position New_Node=(Position)malloc(sizeof(Node));
	New_Node->IsLeaf=false;
	New_Node->KeyNum=0;
	New_Node->Next_Leaf_Node=NULL;
	return New_Node;
}

//Search the Leaf Node to Insert
Search_Insert_Position_Result BPT_Search(Position Current_Node,KeyType Key,int Index)
{
	int i=0;
	Path_List Path_List_Node=(Path_List)malloc(sizeof(List_Node));
	
	Path_List_Node->Path_List_Tree_Node=Current_Node;
	
	Path_List_Tail->Pre_List_Node->Next_List_Node=Path_List_Node;
	Path_List_Node->Pre_List_Node=Path_List_Tail->Pre_List_Node;
	Path_List_Node->Next_List_Node=Path_List_Tail;
	Path_List_Tail->Pre_List_Node=Path_List_Node;
	Path_List_Node->The_Ith_Child_of_Parent=Index;
	//printf("%d\n",Path_List_Tail->Pre_List_Node->Path_List_Tree_Node->KeyNum);
	//if(Path_List_Tail->Pre_List_Node->Pre_List_Node==Path_List_Header)
	//	puts("here");
	
	Search_Insert_Position_Result Insert_Node_Position=(Search_Insert_Position_Result)malloc(sizeof(rNode));
	if(Current_Node->IsLeaf==true)
	{
		while(Key>Current_Node->Key[i]&&i<Current_Node->KeyNum)
			i++;
		Insert_Node_Position->Insert_Position=Current_Node;
		Insert_Node_Position->Key_Position=i;
		return Insert_Node_Position;	
	}
	else
	{
		while(i<Current_Node->KeyNum&&Key>Current_Node->Key[i])
		{
			i++;
		}
		if(i==Current_Node->KeyNum)
			i--;
		Search_Insert_Position_Result Insert_Position_1=BPT_Search(Current_Node->PtrChild[i],Key,i);
		return Insert_Position_1;
	}
}

//function of Node Splict,case 1:leaf node;   case 2:internal node;
Position BplusTree_Node_Split(Position Current_Node)
{
	int i=0;
	Position New_Node=Make_New_Node();
	New_Node->IsLeaf=Current_Node->IsLeaf;
	if(Current_Node->IsLeaf==true){
		New_Node->Next_Leaf_Node=Current_Node->Next_Leaf_Node;
		Current_Node->Next_Leaf_Node=New_Node;
		for(i=0;i<M-1;i++)
			New_Node->Key[i]=Current_Node->Key[i+M];
		Current_Nod
  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值