资源简介
实现了严蔚敏版《数据结构》上的B-树,通过千万随机数测试。
代码片段和文件信息
#include
#include
using namespace std;
#include
#include
#include
#include
#define m 3//2-3树
#define KeyType int//关键字类型
#define Record char//记录
#define INFINITY INT_MAX//初始化用
typedef struct BTNode{
int keynum;//结点中关键字个数
struct BTNode *parent;//指向双亲结点
KeyType key[m+1];//关键字向量0号单元未用
struct BTNode *ptr[m+1];//子树指针向量,0号单元用于辅助使用
Record *recptr[m+1];//记录指针向量,0号单元未用
}BTNode*BTree;
typedef struct{
BTNode *pt;//指向找到的结点
int i;//在结点中的关键字序号
int tag;//1:查找成功 0:查找失败
}Result;//B-树的查找结果类型
//-------------------------函数部分----------------------------------//
void InitialBTree(BTree &T){
//开辟新结点,并对结点进行初始化
int i;
T=(BTree)malloc(sizeof(BTNode));
if(!T)exit(0);
T->parent=NULL;
T->keynum=0;
for(i=0;i<=m;i++)
{
T->ptr[i]=NULL;
T->key[i]=INFINITY;//初始化关键字为无穷大
T->recptr[i]=NULL;
}
}
int Search(BTree pKeyType K){
//在p->key[1...keynum]中查找,使i满足key[i]<=k<=key[i+1]
int i;
if(p->key[1]==INFINITY)
{
return 1;//新结点
}
if(K<=p->key[1])
{
return 1;//查找值小于等于结点中最小关键字
}
for(i=1;ikeynum;i++)
{
if(p->key[i]<=K&&p->key[i+1]>=K)
return i+1;//返回要查找的位置
}
return i+1;//找不到满足条件的关键字,返回要插入的地方
}
Result SearchBTree(BTree TKeyType K)
{
if(!T)
{
cout << “Empty Tree“ << endl;
getch();
}
Result res;//用于接收返回结果
BTree pcheck=T;//pcheck指向待查结点,从根开始找
BTree ppa=pcheck->parent;//ppa指向pcheck的双亲
int found=false;//初始化
int position=0;
while(pcheck&&!found)//找到了或者到叶子了退出循环
{
position=Search(pcheckK);//找到K值的位置,若没有则为K要插入的位置
if(pcheck->key[position]==K)found=true;//找到待查关键字
else
{
ppa=pcheck;//ppa指向pcheck的双亲
pcheck=pcheck->ptr[position];//在孩子中找
}
}
if(found)//查找成功
{
res.pt=pcheck;//返回结点
res.i=position;//返回找到的位置
res.tag=1;//指示查找成功
return res;
}
else
{
res.pt=ppa;//子结点为空,返回双亲
res.i=position;//返回要插入的位置
res.tag=0;//指示查找失败
return res;//查找不成功,返回k的插入位置信息
}
}//SearchBTree
void Insert(BTree &qint iKeyType xBTree ap)
{//在q结点中i处插入关键字X,通过插入建立B树
int j;
if(q->key[i]!=INFINITY)
{
for(j=3;j>i;j--)//为新关键字的插入留出空间
{
q->key[j]=q->key[j-1];
q->ptr[j]=q->ptr[j-1];
q->recptr[j]=q->recptr[j-1];
}
}
q->key[i]=x;//将x信息插入key[i]
q->ptr[i]=ap;//q->ptr[i]接上ap结点
q->keynum++;//keynum记录值增加
}
void Move(BTree &paBTree &apBTree &qchar status)//分裂结点时对应不同状态的移动函数
{
switch(status)
{
case ‘1‘://父结点关键字为1个时,左孩子分裂
if(pa->ptr[2])
{
pa->recptr[3]=pa->recptr[
相关资源
- 职工管理系统数据结构)
- 校园导游咨询系统 数据结构
- 编写算法删除单链表L中所有值为e的数
- C++数据结构分段线性插值
- 数据结构课程设计汉诺威塔
- C语言栈和队列代码实现
- 严蔚敏建立词索引表
- 无向图 破圈法求最小生成树
- 日历管理系统.cpp
- 数据结构编程题目及答案
- 单项选择标准化考试系统 C语言版
- 数据结构课程设计应用索引文件和查
- 数据结构严蔚敏C语言第二版习题答案
- 数据结构的二叉树用C语言实现的代码
- 文章编辑数据结构课程设计c语言编写
- 数据结构上机题
- 数据结构C语言 一元多项式的加减法
- 数据结构 走迷宫大作业 c语言完整代
- 马踏棋盘的源程序,C语言编写,数据
- 数据结构c语言版上机题代码汇总
- 数据结构C语言之哈夫曼编码
- 数据结构表达式求值,c语言版,能计
- 银行管理系统——数据结构C
- c语言银行管理系统
- 严蔚敏.吴伟民等《数据结构(c语言版
- C++数据结构与算法(第4版) 完整版
- 数据结构栈、队列、二叉树、顺序查
- 数据结构实验和作业严蔚敏C)
- 胡学刚版 数据结构 实验3代码 合工大
- 数据结构题集答案(C语言版)严蔚敏
评论
共有 条评论