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

📄 p353.cpp

📁 第一次上传
💻 CPP
字号:
#include "p350.cpp"
		template <class Type> int Btree<Type>::Insert ( const Type & x ) {
		//将关键码x插入到一个驻留在磁盘上的m阶B-树中。
			if (!root)
			{
				root=new Mnode<Type>;
				insertkey ( root, 1, x, NULL );				//K, ap插入到j位置, 且p->n加1
			    PutNode (root);  return 1;				    //输出结点到磁盘, 返回调用程序				
			}
		   Triple<Type> loc = Search (x);				//在树中搜索x的插入位置
		   if ( !loc.tag ) return 0;						//x已经存在于树中, 不再插入
		   Mnode<Type> *p = loc.r,  *q;				//r是关键码x要插入的结点地址
		   Mnode<Type> *ap = NULL,  *t;				//ap是插入关键码x的右邻指针
		   Type K = x;  int j = loc.i;					//(K,ap)形成插入二元组
		   while (1) {
			 if ( p->n < m-1) {						//结点中关键码个数未超出,还可容下新关键码
			   insertkey ( p, j+1, K, ap );				//K, ap插入到j位置, 且p->n加1
			   PutNode (p);  return 1;				//输出结点到磁盘, 返回调用程序
			 }
			 int s = (m+1)/2;						//准备分裂结点, s是(m/2(位置
			 insertkey ( p, j+1, K, ap );					//先插入, 结点中p->n达到m
			 q = new Mnode<Type>;					//建立新结点q
			 move ( p, q, s, m );						//将 p的key[s+1..m]和ptr[s..m]移到q的key[1..s-1]
											//和ptr[0..s-1],  p->n改为s-1, q->n改为s-1
			 K = p->key[s];  ap = q;		//(K,ap)形成向上插入二元组
			 if ( p->parent != NULL ) {				//从下向上进行调整: 原来的p不为根
			   t = p->parent;  GetNode (t);				//从磁盘上读取p的双亲结点
			   j = 0;  t->key[(t->n)+1] = MAXKEY;			//在双亲结点内顺序搜索插入位置, 设监视哨
			   while ( t->key[j+1] < K ) j++;			//搜索, 找到 >K的关键码停
			   ap->parent = p->parent;				//新结点的双亲指针赋值
	 		   PutNode (p);  PutNode (ap);				//输出结点到磁盘
			   p = t;							//p上升到父结点, 向上调整
			 }
			 else {								//原来的p是根, 则要产生新的根
			   root = new Mnode<Type>;
			   root->n = 1;  root->parent = NULL;		//创建新根
			   root->key[1] = K;  root->ptr[0] = p;  root->ptr[1] = ap;
			   ap->parent = p->parent = root;
			   PutNode (p);  PutNode (ap);  PutNode (root);	//输出结点到磁盘
			   return 1;
			 }
		   }
		}
		

⌨️ 快捷键说明

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