⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 changes.h

📁 一个B-树实现与编辑
💻 H
字号:
void change(BTree &q,BTree &f,int i,int t);    
    //函数原型声明,删除关键字,并改变其它关键字相应位置


void change1(BTree &q,BTree &f,BTree &pr,int i,int t)

{      //非终端叶子结点中,被删结点q关键字数目小于S,
	    //其右兄弟pr关键字数目不小于S的删除算法,
	//将pr结点中的最小关键字上移至双亲f结点中,而将f中小于
	//且紧靠该上移关键字的关键字下移至被删关键字所有的结点中.
	int x,j;
	Record *r;
	x=pr->key[1];
	r=pr->recptr[1];
	j=Search(f,x);
	for(int l=i;l<q->keynum;l++)    //调整q的关键字及其记录
	
	{
		q->key[l]=q->key[l+1];
		q->recptr[l]=q->recptr[l+1];
	}
	for(int l=t;l<q->keynum;l++)    //调整q的子树
	{
		q->ptr[l]=q->ptr[l+1];
		
	}
	q->key[q->keynum]=f->key[j];         //插入
	q->recptr[q->keynum]=f->recptr[j];
	q->ptr[q->keynum]=pr->ptr[0];
	if(pr->ptr[0]!=NULL)
	pr->ptr[0]->parent=q;
	f->key[j]=x;
	f->recptr[j]=r;

	for(int l=1;l<pr->keynum;l++)               //调整右兄弟结点
	{
		pr->key[l]=pr->key[l+1];
		pr->recptr[l]=pr->recptr[l+1];
	}
	for(int l=0;l<pr->keynum;l++)
	{
		pr->ptr[l]=pr->ptr[l+1];
	    
	}
	pr->ptr[pr->keynum]=NULL;
	pr->key[pr->keynum]=0;
	pr->recptr[pr->keynum]=NULL;
	pr->keynum-=1;

}


void change2(BTree q,BTree f,BTree pl,int i,int t)
{ //非终端叶子结点中,被删结点q关键字数目小于S,
	    //其左兄弟pl关键字数目不小于S的删除算法,
	//将pl结点中的最大关键字上移至双亲f结点中,而将f中大于
	//且紧靠该上移关键字的关键字下移至被删关键字所有的结点中.
	int x,  j;
	Record *r;
	x=pl->key[pl->keynum];
	r=pl->recptr[pl->keynum];
	j=Search(f,x);
	for(int l=i;l>1;l--)       //调整q关键字及其记录
	{
		q->key[l]=q->key[l-1];
		q->recptr[l]=q->recptr[l-1];
	}
	for(int l=t;t>0;t--)             //调整q的子树
		q->ptr[l]=q->ptr[l-1];
	q->key[1]=f->key[j+1];            //插入
	q->recptr[1]=f->recptr[j+1];
	q->ptr[0]=pl->ptr[pl->keynum];
	if(pl->ptr[pl->keynum]!=NULL)
		pl->ptr[pl->keynum]->parent=q;
	f->key[j+1]=x;
	f->recptr[j+1]=r;
	pl->key[pl->keynum]=0;               //调整左兄弟结点
	pl->recptr[pl->keynum]=NULL;
	pl->ptr[pl->keynum]=NULL;
	
	pl->keynum-=1;
}

void change3(BTree &q,BTree &f,BTree &pr,int i,int t,int l)
{
	//被删关键字所在结点p和其相邻的兄弟结点中的关键字数目均等于s-1且p有右兄弟pr的删除.
	//先调整q,再将f->key[l+1]合并q到中,再将q合并到pr中
	int j;
	BTree p;
					
	if(q->ptr[q->keynum]!=NULL)  //调整q的子树
	{
		for( j=t;j<q->keynum;j++)
			q->ptr[j]=q->ptr[j+1];
		q->ptr[q->keynum]=NULL;
	}
	for(j=i;j<q->keynum;j++)     //调整q的关键字及记录
	{
		q->key[j]=q->key[j+1];
		q->recptr[j]=q->recptr[j+1];
	}
	q->key[q->keynum]=f->key[l+1];        //将f->key[l+1]合并q到中
	q->recptr[q->keynum]=f->recptr[l+1];
	
	for(j=pr->keynum;j>=1;j--)     //调整pr
	
	{
		pr->key[q->keynum+j]=pr->key[j];
		pr->recptr[q->keynum+j]=pr->recptr[j];
	}


		
	for(j=pr->keynum;j>=0;j--)
		pr->ptr[q->keynum+j]=pr->ptr[j];
	
	
		
	for(j=q->keynum;j>=1;j--)      //将q合并到pr中
	{
		pr->key[j]=q->key[j];
		pr->recptr[j]=q->recptr[j];
		pr->ptr[j-1]=q->ptr[j-1];
		if(q->ptr[j-1]!=NULL)q->ptr[j-1]->parent=pr;
	}
	
	

	
	pr->keynum+=q->keynum;      //改变pr关键字数目
	//f->ptr[l]=NULL;free(q);
	i=l+1;
	if(f->keynum==s-1)      //判断下一步操作    
	{
		if(f->parent!=NULL)

		change(f,f->parent,i,i-1);
	else
		
	{
		p=T;T=pr;T->parent=NULL;free(p);
	}
	}
	else
	{
		for(j=i;j<f->keynum;j++)
		{
			f->key[j]=f->key[j+1];
			f->recptr[j]=f->recptr[j+1];
		}
		f->key[f->keynum]=0;
		f->recptr[f->keynum]=NULL;
		
		for(j=i-1;j<f->keynum;j++)
			f->ptr[j]=f->ptr[j+1];
		f->ptr[f->keynum]=NULL;
		f->keynum-=1;
	}free(q);
		

}





void change4(BTree q,BTree &f,BTree pl,int i,int t,int l)
{//被删关键字所在结点p和其相邻的兄弟结点中的关键字数目均等于s-1且p有右兄弟pl的删除.
	//先调整q,再将k(l)合并q到中,再将q合并到pl中
	int j;
	BTree p;
	if(q->ptr[0]!=NULL)          //调整q的子树
	{
		for(j=t;j>0;j--)
			q->ptr[j]=q->ptr[j-1];
		q->ptr[0]=NULL;
	}
	for(j=i;j>1;j--)             //调整q的关键字及记录
	{
		q->key[j]=q->key[j-1];
		
		q->recptr[j]=q->recptr[j-1];
	}
	q->key[1]=f->key[l];          //将f->k[l]合并q到中
	q->recptr[1]=f->recptr[l];
	for(j=1;j<=q->keynum;j++)        //将q合并到pl中
	{
		pl->key[pl->keynum+j]=q->key[j];
		pl->recptr[pl->keynum+j]=q->recptr[j];
		pl->ptr[pl->keynum+j]=q->ptr[j];
		if(q->ptr[j]!=NULL)q->ptr[j]->parent=pl;
	}
	    
	pl->keynum+=q->keynum;       //改变pl关键字数目
	
	//f->ptr[l]=NULL;free(q);
	i=l;

	if(f->keynum==s-1)           //判断下一步操作  
	{
		if(f->parent!=NULL)
			change(f,f->parent,i,i);
		else
		{p=T;T=pl;T->parent=NULL;free(p);}
	}
	else
		if(f->keynum>=s)
	{
		for(j=i;j<f->keynum;j++)
		{
			f->key[j]=f->key[j+1];
			f->recptr[j]=f->recptr[j+1];
			f->ptr[j]=f->ptr[j+1];
		}
		f->key[f->keynum]=0;
		f->recptr[f->keynum]=NULL;
		f->ptr[f->keynum]=NULL;
		f->keynum-=1;
		
	}free(q);
	//f->ptr[l]=NULL;free(q);
	     

	
}


void change(BTree &q,BTree &f,int i,int t)
{//删除关键字,并改变其它关键字相应位置
	int l;
	BTree pl=NULL,pr=NULL;
	
	l=Search(f,q->key[1]);      //找出左右兄弟
		if(l>0)
		pl=f->ptr[l-1];
		if(l<f->keynum)
		pr=f->ptr[l+1];
		if(pr!=NULL&&pr->keynum>=s)    
		{
			
			change1(q,f,pr,i,t);//右兄弟存在,且其关键字数目不小于s
		}

			else
				if(pl!=NULL&&pl->keynum>=s) 
				{                                
					
				    change2(q,f,pl,i,t);//左兄弟存在,且其关键字数目不小于s,
				}//右兄弟不存在或其关键字数目小于s
			else
				if(pr!=NULL)
				{
					

					change3(q,f,pr,i,t,l);//左右兄弟关键字数目均小于s且右兄弟存在
					
						
				}
				else
				{
					change4(q,f,pl,i,t,l);//左右兄弟关键字数目均小于s且右兄弟不存在
					
						
				}
	
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -