B树C++代码之查找程序

前言:
因为最近需要写个数据结构完成作业,选了个B树。首先需要写个头文件将数据结构中的B树内容知识装在这个头文件上,主程序才能用这个数据结构。然后就看了书,写了一点点这个代码。后续还有插入、删除等等的操作。

B树C++代码之查找程序:

// An highlighted block
#include <stdlib.h>
using namespace std;
#define m 3 
#define ElemType char;

//定义一个B树的一个节点,节点里包含这些东西 
typedef struct BNode{
	BNode *parent;         //父指针 
	int keynum;            //有多少个数据 
	ElemType data[m+1];       // 真正的数据域,但data【0】始终不用 
	BNode *ptr[m+1];    // 连接他们孩子的指针 
}*Btree;

//定义一个查找结果的结构体 
typedef struct result{
	BNode* p;      //代表该树的哪个结点 
	int i ;         //代表该结点的第几个部分(数据或指针块) 
	int tag;        //代表查找的结果,tag=1也就是该树有你要查找的数据 
};


//定义一个函数“search” ,该函数返回的是p结点(也就是树中的某个结点)的第i个数据块,或叫指针。留后面使用 
int search(Btree p,ElemType key ){
	int i = 0;                                    // 先定义出来的i,共后面for 使用 
	if (key<p->data[1]){return 0 ;}                       // 关键字对比第一个数据,小了就返回i=0  
	if (key>=p->data[p->keynum]){return p->keynum;}       //关键字对比该结点的最后一个数据,大了就返回keynum 
	for (i=0;i<p->keynum;i++){                            // 若上面连个if 都没有,就说明要查找的数据在中间。通过挪动i ,在i 和 i+1 中对比,直到找到key 在 i i+1区间的 
		if (key>p ->data[i]&&key<=p->data[i+1]){
			return i;
		}
	}
}        //这个函数返回的是i的型,因为ptr【i】可以指向下一个结点,继续检测你要查找的数据 

// 真正的查找函数 Search,返回的是刚才定义过的result结构体 
result Search(Btree T ,ElemType key){
	Btree p=T,q =NULL;                               //首先定义p 和q 中间指针变量 
	bool found = false;                              //定义一个查找的bool 
	int i = 0;                                        //初始i 
	result r;                                        //生成结构体 r 
	while (p&&!found)                                //循环查找 
	{
		i= search(p,key);                               //调用search ,返回i (第i个结点) 
		if (i>0&&key == p->data[i]){found =true;}        // 对比 
		else{
			q=p;p=p->ptr[i];                             //没在p结点找到,找子结点 
		}
		if(found){r.p=p;r.i=i;r.tag=1;}       //查找成功 
		else{r.p=q;r.i=i;r.tag=0;}         //查找没成功(但是,这是插入位置) 
	}
	return r;	
}

;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B树是一种多路平衡查找树,它的特点是每个节点可以存储多个关键字和指向子节点的链表,使得B树能够在一次磁盘访问中读取多个关键字,提高了查询效率。C语言是一种广泛使用的编程语言,非常适合编写系统底层的程序。 以下是B树中C程序代码: ```c #include<stdio.h> #include<stdlib.h> #define MAX 4 struct BTreeNode { int val[MAX + 1], count; struct BTreeNode *link[MAX + 1]; }; struct BTreeNode *root; void insert(int); void display(struct BTreeNode *); int main() { int val, opt, i; struct BTreeNode *ptr; root = NULL; do { printf("\n\nEnter your option:\n"); printf("1.Insert a value\n2.Display the tree\n3.Quit\n"); scanf("%d", &opt); switch(opt) { case 1: printf("\nEnter the value: "); scanf("%d", &val); insert(val); break; case 2: display(root); break; case 3: printf("\nQuit\n"); break; default:printf("\nInvalid option\n"); break; } } while(opt != 3); } void insert(int val) { int flag, i; struct BTreeNode *p, *q; int key; if(root == NULL) { root = (struct BTreeNode *)malloc(sizeof(struct BTreeNode)); root->val[1] = val; root->count = 1; root->link[0] = NULL; root->link[1] = NULL; return; } p = root; flag = 0; while(p != NULL && flag == 0) { if(p->count < MAX) { i = p->count; while(i >= 1 && val < p->val[i]) { p->val[i + 1] = p->val[i]; p->link[i + 1] = p->link[i]; i--; } p->val[i + 1] = val; p->link[i + 1] = q; p->count++; flag = 1; } else { key = p->val[MAX]; q = (struct BTreeNode *)malloc(sizeof(struct BTreeNode)); q->count = 0; for(i=0; i<=MAX; i++) q->link[i] = NULL; if(p->link[MAX] == NULL) { p->link[MAX] = q; q->val[++q->count] = val; q->link[q->count] = NULL; } else insert(val); val = key; p->count--; } p = p->link[i]; } } void display(struct BTreeNode *ptr) { int i; if(ptr != NULL) { for(i=0; i<ptr->count; i++) { printf("%d ", ptr->val[i+1]); display(ptr->link[i]); } display(ptr->link[i]); } } ``` 该代码实现了B树的插入和展示功能。在主函数中,通过输入不同的选项来选择对应的功能,这些功能通过调用insert和display函数实现。 insert函数中分别考虑了节点数小于MAX和节点数等于MAX的两种情况。节点数小于MAX时直接插入,节点数等于MAX时需要将节点分裂成两个节点,并将新节点插入其中一个。 display函数通过递归地遍历B树来展示所有节点的值。具体实现时先遍历当前节点的所有子节点,输出它们的值,最后遍历当前节点的最后一个子节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值