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

📄 bptree.h

📁 our homework big project
💻 H
📖 第 1 页 / 共 3 页
字号:
	if(Isroot(m_nodeposition)==1)								//根结点情况
	{
		if(Isleaf(m_nodeposition)==1)							//叶节点
		{
			if(m_nodeposition->no>1)							//多个数据
			{
				for(;i<m_nodeposition->no-1;i++)
				{
					m_nodeposition->key[i]=m_nodeposition->key[i+1];
					m_nodeposition->p_leaf_next[i]=m_nodeposition->p_leaf_next[i+1];
				}
				m_nodeposition->key[i]=NULL;
				m_nodeposition->p_leaf_next[i]=NULL;
				m_nodeposition->no--;
				m_total--;
			}
			else												//只有一个数据,直接删除
			{
				m_total=0;
				m_nodeposition->no=0;
				m_nodeposition->key[0]=NULL;
				m_nodeposition->p_leaf_next[0]=NULL;
			}
		}
		else													//非叶节点
		{
			if(m_nodeposition->no>2)							//多个数据
			{
				for(;i<m_nodeposition->no-1;i++)
				{
					m_nodeposition->key[i]=m_nodeposition->key[i+1];
					m_nodeposition->p_node_next[i]=m_nodeposition->p_node_next[i+1];
				}
				m_nodeposition->key[i]=NULL;
				m_nodeposition->p_node_next[i]=NULL;
				m_nodeposition->no--;
			}
			else												//只剩两个数据时
			{
				m_noderoot=m_noderoot->p_node_next[0];
				delete m_noderoot->p_fathernode;
				m_noderoot->p_fathernode=NULL;
			}
		}
	}
	else														//非根结点
	{
		if(Isleaf(m_nodeposition)==1)							//叶节点
		{
			for(;i<m_nodeposition->no-1;i++)
			{
				m_nodeposition->key[i]=m_nodeposition->key[i+1];
				m_nodeposition->p_leaf_next[i]=m_nodeposition->p_leaf_next[i+1];
			}
			m_nodeposition->key[i]=NULL;
			m_nodeposition->p_leaf_next[i]=NULL;
			m_total--;
		}
		else													//非叶节点
		{
			for(;i<m_nodeposition->no-1;i++)
			{
				m_nodeposition->key[i]=m_nodeposition->key[i+1];
				m_nodeposition->p_node_next[i]=m_nodeposition->p_node_next[i+1];
			}
			m_nodeposition->key[i]=NULL;
			m_nodeposition->p_node_next[i]=NULL;
		}
		m_nodeposition->no--;
		node* tp=m_nodeposition->p_fathernode;
		for(;Isroot(tp)==0;)
		{
			for(int j=0;j<tp->no;j++)
			{
				if(compare(k,tp->key[j])==0)
					tp->key[j]=t;
			}
			tp=tp->p_fathernode;
		}
		for(int j=0;j<tp->no;j++)
		{
			if(compare(k,tp->key[j])==0)
				tp->key[j]=t;
		}
	
		if(m_nodeposition->no<N/2)									//需要调整的
		{
			Merge();
		}
	}

}			

//---------------合并节点----------------

template<class T>
void Node<T>::Merge()
{	
	node* brother=m_nodeposition->brother;
	int i;

	
	if(brother->no<=N/2+1)											//两节点可以合并的说
	{
		if(m_nodeposition->p_next!=NULL)							//不是最右边的节点
		{
			node* t=m_nodeposition;

			//合并

			for(i=m_nodeposition->no;i<m_nodeposition->no+brother->no;i++)
			{
				m_nodeposition->key[i]=brother->key[i-m_nodeposition->no];
				if(Isleaf(m_nodeposition)==1)						//叶节点的赋值
					m_nodeposition->p_leaf_next[i]=brother->p_leaf_next[i-m_nodeposition->no];
				else												//非叶节点的赋值
				{
					m_nodeposition->p_node_next[i]=brother->p_node_next[i-m_nodeposition->no];
					brother->p_node_next[i-m_nodeposition->no]->p_fathernode=m_nodeposition;
				}
			}

			//处理合并后节点的其他数值

			m_nodeposition->no+=brother->no;

			if(brother->p_next!=NULL)
			{
				if(brother->p_next->p_next!=NULL)m_nodeposition->brother=brother->brother;
				else
				{
					m_nodeposition->brother=brother->brother;
					brother->brother->brother=m_nodeposition;
				}
			}
			else
				m_nodeposition->brother=m_nodeposition->p_fathernode->p_node_next[m_nodeposition->p_fathernode->no-3];

			m_nodeposition->p_next=brother->p_next;

			//重置上级节点中的数值

			node* tp=m_nodeposition->p_fathernode;
			for(;Isroot(tp)==0;)
			{
				if(Isleaf(tp)==0)
				{
					for(int j=0;j<tp->no;j++)
					{
						if(compare(m_nodeposition->key[m_nodeposition->no-brother->no-1],tp->key[j])==0)
							tp->key[j]=m_nodeposition->key[m_nodeposition->no-1];
					}
				}
				tp=tp->p_fathernode;
			}
			for(int j=0;j<tp->no;j++)
			{
				if(compare(m_nodeposition->key[m_nodeposition->no-brother->no-1],tp->key[j])==0)
						tp->key[j]=m_nodeposition->key[m_nodeposition->no-1];
			}	
			
			m_nodeposition=brother->p_fathernode;
			del(brother->key[brother->no-1],t->key[t->no-1]);		//删除被删节点在父节点中的值
			delete brother;
			brother=NULL;
		}
		else														//最右边的节点
		{
			T ko=m_nodeposition->key[m_nodeposition->no-1];
			node* t=m_nodeposition;

			//合并

			for(i=brother->no;i<brother->no+m_nodeposition->no;i++)
			{
				brother->key[i]=m_nodeposition->key[i-brother->no];
				if(Isleaf(m_nodeposition)==1)
					brother->p_leaf_next[i]=m_nodeposition->p_leaf_next[i-brother->no];
				else
				{
					brother->p_node_next[i]=m_nodeposition->p_node_next[i-brother->no];
					m_nodeposition->p_node_next[i-brother->no]->p_fathernode=brother;
				}
			}
			
			//合并后其他数据处理

			brother->no+=m_nodeposition->no;
			brother->p_next=NULL;
			brother->brother=brother->p_fathernode->p_node_next[brother->p_fathernode->no-3];

			//替换上级节点中的数据

			node* tp=brother->p_fathernode;
			for(;Isroot(tp)==0;)
			{
				if(Isleaf(tp)==0)
				{
					for(int j=0;j<tp->no;j++)
					{
						if(compare(brother->key[brother->no-m_nodeposition->no-1],tp->key[j])==0)
							tp->key[j]=brother->key[brother->no-1];
					}
				}
				tp=tp->p_fathernode;
			}
			for(int j=0;j<tp->no;j++)
			{
				if(compare(brother->key[brother->no-m_nodeposition->no-1],tp->key[j])==0)
						tp->key[j]=brother->key[brother->no-1];
			}

			m_nodeposition=m_nodeposition->p_fathernode;
			del(ko,brother->key[brother->no-1]);							//删除被删节点在父节点中的值
			delete t;
			t=NULL;
		}
	}
	else																	//两节点不可以合并的说
	{
		if(m_nodeposition->p_next!=NULL)									//不是最右边的节点
		{
			//调整两个节点的数据个数

			int w=m_nodeposition->no;
			m_nodeposition->key[w]=brother->key[0];
			if(Isleaf(m_nodeposition)==1)
				m_nodeposition->p_leaf_next[w]=brother->p_leaf_next[0];
			else
			{
				m_nodeposition->p_node_next[w]=brother->p_node_next[0];
				m_nodeposition->p_node_next[w]->p_fathernode=m_nodeposition;
			}

			m_nodeposition->no++;
			brother->no--;	

			//数据前移

			for( i=0;i<brother->no;i++)
			{
				brother->key[i]=brother->key[i+1];
				if(Isleaf(m_nodeposition)==1)
					brother->p_leaf_next[i]=brother->p_leaf_next[i+1];
				else
					brother->p_node_next[i]=brother->p_node_next[i+1];
			}

			//数据转移后空位付零

			if(Isleaf(m_nodeposition)==1)
				brother->p_leaf_next[i]=NULL;
			else
				brother->p_node_next[i]=NULL;
			brother->key[i]=NULL;
			
			//替换上级节点的值

			node* tp=m_nodeposition->p_fathernode;
			for(;Isroot(tp)==0;)
			{
				if(Isleaf(tp)==0)
				{
					for(int j=0;j<tp->no;j++)
					{
						if(compare(m_nodeposition->key[m_nodeposition->no-2],tp->key[j])==0)
							tp->key[j]=m_nodeposition->key[m_nodeposition->no-1];
					}
				}
				tp=tp->p_fathernode;
			}
			for(int j=0;j<tp->no;j++)
			{
				if(compare(m_nodeposition->key[m_nodeposition->no-2],tp->key[j])==0)
						tp->key[j]=m_nodeposition->key[m_nodeposition->no-1];
			}	
			
		}
		else																		//最右边的节点
		{
			//调整数据个数
			
			for(i=m_nodeposition->no;i>0;i--)										//数据后移
			{
				m_nodeposition->key[i]=m_nodeposition->key[i-1];
				if(Isleaf(m_nodeposition)==1)
					m_nodeposition->p_leaf_next[i]=m_nodeposition->p_leaf_next[i-1];
				else
					m_nodeposition->p_node_next[i]=m_nodeposition->p_node_next[i-1];
			}
			if(Isleaf(m_nodeposition)==1)
				m_nodeposition->p_leaf_next[0]=brother->p_leaf_next[brother->no-1];
			else
			{
				m_nodeposition->p_node_next[0]=brother->p_node_next[brother->no-1];
				m_nodeposition->p_node_next[0]->p_fathernode=m_nodeposition;
			}
			m_nodeposition->key[0]=brother->key[brother->no-1];

			brother->no--;
			m_nodeposition->no++;

			//数据转移后空位付零

			if(Isleaf(m_nodeposition)==1)
				brother->p_leaf_next[brother->no]=NULL;
			else
				brother->p_node_next[brother->no]=NULL;
			brother->key[brother->no]=NULL;
			
			//重置上级结点的值

			node* tp=brother->p_fathernode;
			for(;Isroot(tp)==0;)
			{
				if(Isleaf(tp)==0)
				{
					for(int j=0;j<tp->no;j++)
					{
						if(compare(m_nodeposition->key[0],tp->key[j])==0)
							tp->key[j]=brother->key[brother->no-1];
					}
				}
				tp=tp->p_fathernode;
			}
			for(int j=0;j<tp->no;j++)
			{
				if(compare(m_nodeposition->key[0],tp->key[j])==0)
					tp->key[j]=brother->key[brother->no-1];
			}
		}
	}
}


//----------------------显示用----------------

/*
template<class T>
void Node<T>::Show()
{
	node* p=m_noderoot;
	if(p!=NULL)
	{
		
		for(;Isleaf(p)==0;)
			p=p->p_node_next[0];
		int j=0;
		m_nodehead=p->p_fathernode;
		for(;;)
		{
			j=0;
			if(p!=NULL)
			{
				while(p->p_next!=NULL)
				{
					for(int i=0;i<p->no;i++)
					{
						cout<<p->key[i];
						cout<<"    ";
						j++;
					}
					p=p->p_next;
					cout<<"\n"<<"\n";
				}
				for(int i=0;i<p->no;i++)
				{
					cout<<p->key[i];
					cout<<"    ";
					j++;
				}
				cout<<"\n"<<"\n";
				cout<<j<<"\n";
				p=m_nodehead;
				cout<<"-------------------------------------"<<"\n";
			}
			if(p!=NULL)
			{
				if(p->p_fathernode!=NULL)
					m_nodehead=p->p_fathernode;
				else
					break;
			}
			if(p==NULL)break;
		}
	
	
		for(int i=0;i<p->no;i++)
		{
			cout<<p->key[i];
			cout<<"    ";
			j++;
		}
		cout<<"\n"<<"\n";
		
	}
	else
		cout<<"no data is exist";
}*/


template<class T>
void Node<T>::Index(string & indexName)				//建立索引文件
{
	
	ofstream finout(indexName.c_str(),ios::out|ios::binary);
	
	int total=0;
	size_t place=sizeof(int);
	for(m_nodehead=m_noderoot;m_nodehead->flag==0;m_nodehead=m_nodehead->p_node_next[0])
		;
	tnode indxnode;
	node* next=m_nodehead;
	finout.seekp(sizeof(int));
	for(;next!=NULL;)
	{
		indxnode.no=next->no;
		for(int i=0;i<N;i++)
		{
			indxnode.p_leaf_next[i]=next->p_leaf_next[i];
			indxnode.key[i]=next->key[i];
		}
		finout.write((char *)&indxnode,sizeof(indxnode))<<flush;
		next=next->p_next;
		total++;
	}
	finout.seekp(0);
	finout.write((char *)&total,sizeof(int))<<flush;

	finout.close();

}

	

template<class T>
void Node<T>::Buildtree(string & indexName)			//从索引文件中导出建立b+树
{
	ifstream fin;
	fin.open(indexName.c_str(),ios::in|ios::binary);
	int total;
	int i;
	tnode indxnode;
	size_t place=0;
	fin.read((char *)&total,sizeof(int));
	if(total!=0)
	{
					
		for(i=0;i<total;i++)
		{
			fin.read((char *)&indxnode,sizeof(tnode));
			for(int j=0;j<indxnode.no;j++)
				Insert_node(indxnode.key[j],indxnode.p_leaf_next[j]);
		}
	}
}
		

#endif

⌨️ 快捷键说明

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