📄 p353.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 + -