/*
煙台大學計算機學院
檔名稱:xiangmu.cpp
完成日期:2023年12月3日
問題描述:實現b-樹的基本操作。基於序列完成測試。
(1)建立對應的3階b-樹b,用括號法輸出b樹。
(2)從b中分別刪除關鍵字為8和1的節點,用括號法輸出刪除節點後的b樹
輸入描述:無
輸出描述:b-的建立過程和刪除節點的b-樹的括號表示法。
*/#include #include #define maxm 10 //定義b-樹的最大的階數
typedef int keytype; //keytype為關鍵字型別
typedef struct node //b-樹結點型別定義
btnode;
typedef struct //b-樹的查詢結果型別
result;
int m; //m階b-樹,為全域性變數
int max; //m階b-樹中每個結點的至多關鍵字個數,max=m-1
int min; //m階b-樹中非葉子結點的至少關鍵字個數,min=(m-1)/2
int search(btnode *p,keytype k)
result searchbtree(btnode *t,keytype k)
}r.i=i;
if (found==1) //查詢成功
else //查詢不成功,返回k的插入位置資訊
return r; //返回k的位置(或插入位置)
}void insert(btnode *&q,int i,keytype x,btnode *ap)
q->key[i+1]=x;
q->ptr[i+1]=ap;
if (ap!=null) ap->parent=q;
q->keynum++;
}void split(btnode *&q,btnode *&ap)
ap->keynum=q->keynum-s;
ap->parent=q->parent;
for (i=0; i<=q->keynum-s; i++) //修改指向雙親結點的指標
if (ap->ptr[i]!=null) ap->ptr[i]->parent = ap;
q->keynum=s-1; //q的前一半保留,修改keynum
}void newroot(btnode *&t,btnode *p,keytype x,btnode *ap)
void insertbtree(btnode *&t, keytype k, btnode *q, int i)
else neednewroot=1;}}
if (neednewroot==1) //根結點已**為結點*q和*ap
newroot(t,q,x,ap); //生成新根結點*t,q和ap為子樹指標
}}void dispbtree(btnode *t) //以括號表示法輸出b-樹
dispbtree(t->ptr[t->keynum]);
if (t->ptr[0]!=0) printf(")"); //至少有乙個子樹時輸出")"號}}
}void remove(btnode *p,int i)
//從*p結點刪除key[i]和它的孩子指標ptr[i]
p->keynum--;
}void successor(btnode *p,int i)
//查詢被刪關鍵字p->key[i](在非葉子結點中)的替代葉子結點
void moveright(btnode *p,int i)
//把乙個關鍵字移動到右兄弟中
t->ptr[1]=t->ptr[0]; //從雙親結點移動關鍵字到右兄弟中
t->keynum++;
t->key[1]=p->key[i];
t=p->ptr[i-1]; //將左兄弟中最後乙個關鍵字移動到雙親結點中
p->key[i]=t->key[t->keynum];
p->ptr[i]->ptr[0]=t->ptr[t->keynum];
t->keynum--;
}void moveleft(btnode *p,int i)
//把乙個關鍵字移動到左兄弟中
}void combine(btnode *p,int i)
//將三個結點合併到乙個結點中
for (c=i; ckeynum; c++) //刪除父結點所有的關鍵字
p->keynum--;
free(q); //釋放空右結點的空間
}void restore(btnode *p,int i)
//關鍵字刪除後,調整b-樹,找到乙個關鍵字將其插入到p->ptr[i]中
int searchnode(keytype k,btnode *p,int &i)
//在結點p中找關鍵字為k的位置i,成功時返回1,否則返回0
else //在*p結點中查詢
}int recdelete(keytype k,btnode *p)
//查詢並刪除關鍵字k
else
remove(p,i); //從*p結點中位置i處刪除關鍵字
}else
found=recdelete(k,p->ptr[i]); //沿孩子結點遞迴查詢並刪除關鍵字k
if (p->ptr[i]!=null)
if (p->ptr[i]->keynumkeynum==0)
}int main()
,k; m=3; //3階b-樹
max=m-1;
min=(m-1)/2;
printf("建立一棵%d階b-樹:\n",m);
for (j=0; j執行結果:
學習心得:
學會了b-樹的建立和刪除。
第14周 專案3
問題及描述 煙台大學計算機學院 檔名稱 aa.cpp 完成日期 2017年12月3日 問題描述 實現b 樹的基本操作。基於序列完成測試。1 建立對應的3階b 樹b,用括號法輸出b樹。2 從b中分別刪除關鍵字為8和1的節點,用括號法輸出刪除節點後的b樹 輸入描述 無 輸出描述 b 的建立過程和刪除節點...
第14周專案2 (2)
問題及 檔名稱 number.cpp 作 者 趙敏 完成日期 2014年11月29日 版 本 號 v1.0 問題描述 設score 8 陣列中儲存8名同學的c 成績,增加乙個陣列string name 8 並賦初值,表示同學們的姓名。這兩個陣列中,每名同學的姓名與成績的下標要始終保持一致 例如nam...
第5周專案1 4
all rights reserced.檔名稱 main.cpp 作者 李鑫 完成日期 2016.4.6 問題描述 使用有預設引數的建構函式,不給定實參時,預設邊長為1 注意 只需要乙個建構函式即可。include includeusing namespace std class double x,...