?? 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 + -