B-樹(shù)課程設(shè)計(jì)_第1頁(yè)
B-樹(shù)課程設(shè)計(jì)_第2頁(yè)
B-樹(shù)課程設(shè)計(jì)_第3頁(yè)
B-樹(shù)課程設(shè)計(jì)_第4頁(yè)
B-樹(shù)課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、-作者xxxx-日期xxxxB-樹(shù)課程設(shè)計(jì)【精品文檔】課程設(shè)計(jì)成果 學(xué)院: 計(jì)算機(jī)工程學(xué)院 班 級(jí): 學(xué)生姓名: 學(xué) 號(hào): 設(shè)計(jì)地點(diǎn)(單位) 設(shè)計(jì)題目: B-樹(shù) 完成日期: 年 月 日 指導(dǎo)教師評(píng)語(yǔ): 成績(jī)(五級(jí)記分制): 教師簽名: 目 錄1 需求分析11.1 系統(tǒng)目標(biāo)11.2 主體功能11.3 開(kāi)發(fā)環(huán)境12概要設(shè)計(jì)12.1 功能模塊劃分12.2 系統(tǒng)流程圖23 詳細(xì)設(shè)計(jì)33.1 數(shù)據(jù)結(jié)構(gòu)33.2 模塊設(shè)計(jì)44 測(cè)試7測(cè)試數(shù)據(jù)7測(cè)試結(jié)果75 總結(jié)10參考文獻(xiàn)11附錄 源程序代碼12【精品文檔】1 需求分析1.1 系統(tǒng)目標(biāo)完成B-樹(shù)的創(chuàng)建、查找、插入和刪除。1.2 主體功能B-Trees是一類

2、滿足特殊條件的M路查找樹(shù),它滿足如下兩個(gè)條件的M路查找樹(shù):1.所有葉節(jié)點(diǎn)的高度相同。2.除根之外的所有節(jié)點(diǎn)都是半滿的,即該節(jié)點(diǎn)包含M/2或更多的值。3.樹(shù)中每個(gè)節(jié)點(diǎn)都至多有M棵樹(shù)。4.所有的葉子節(jié)點(diǎn)都出現(xiàn)在同一層,并且不帶信息。5.所有的非終端節(jié)點(diǎn)中包含下列信息:(n,A0,K1,A1,K2,A2K3,A3.Kn,An)其中:Ki為關(guān)鍵字,且KiKi+1;Ai為指向自樹(shù)的指針,且Ai-1所指子樹(shù)中所有的節(jié)點(diǎn)的關(guān)鍵字均小于Ki,An所指子樹(shù)中所有節(jié)點(diǎn)的關(guān)鍵字均大于Kn,n為關(guān)鍵字的個(gè)數(shù)。1.設(shè)計(jì)并實(shí)現(xiàn)B-Trees數(shù)據(jù)結(jié)構(gòu),包含其上的基本操作,如節(jié)點(diǎn)的插入和刪除等。2.實(shí)現(xiàn)在B-trees樹(shù)上的

3、查找操作。3.設(shè)計(jì)良好的運(yùn)行界面,能夠?qū)崿F(xiàn)重復(fù)的操作。 1.3 開(kāi)發(fā)環(huán)境開(kāi)發(fā)系統(tǒng):Windows 系統(tǒng),處理器要求最低奔騰處理器,內(nèi)存32m,建議在i5處理器,128m內(nèi)存配置下調(diào)試。編譯集成軟件:Devc+開(kāi)發(fā)軟件。Devc+是一個(gè)強(qiáng)大的C/C+軟件開(kāi)發(fā)工具,操作簡(jiǎn)單,使用非常廣泛,稱為很多程序員的首選開(kāi)發(fā)工具。2概要設(shè)計(jì) 2.1 功能模塊劃分主函數(shù)即main()函數(shù),主要實(shí)現(xiàn)B-Trees的建立,建立一棵滿足要求的4節(jié)B-Trres樹(shù)。菜單介紹函數(shù)即meau()函數(shù),主要包括介紹各個(gè)功能的實(shí)現(xiàn)途徑,并給操作者提供個(gè)操作界面。插入元素函數(shù)即insertbtree(b)函數(shù),主要有用戶通過(guò)界面

4、輸入要插入的元素,首先判斷要插入的元素是否已在B-Trees中,若不在則插入之。刪除函數(shù)即deletetree(b)函數(shù),首先判斷要?jiǎng)h除的元素是否在B-Trees中若在該B-Trees中則刪除。查找函數(shù)即searchbtree(b)函數(shù),由用戶通過(guò)界面輸入一個(gè)元素,查找該元素是否在該B-Trees中,若在就輸出它在節(jié)點(diǎn)的位置。圖2.1 主函數(shù)流程圖2.2 系統(tǒng)流程圖圖2.2 主程序流程圖B-樹(shù)的主程序流程如圖所示圖2.3 主程序流程圖3 詳細(xì)設(shè)計(jì)3.1 數(shù)據(jù)結(jié)構(gòu)B-樹(shù)的數(shù)據(jù)類型:typedef struct BTNode int keynum; /結(jié)點(diǎn)中關(guān)鍵字的個(gè)數(shù),即結(jié)點(diǎn)的大小 struct

5、 BTNode *parent; /指向雙親指針int keym+1; /關(guān)鍵字向量struct BTNode *ptrm+1; /子樹(shù)指針向量BTNode 模塊設(shè)計(jì)B-樹(shù)插入新元素模塊如圖3.2所示。圖3.2 B-樹(shù)插入元素函數(shù)流程圖B-樹(shù)刪除元素模塊如圖3.3所示。圖3.3 B-樹(shù)刪除元素函數(shù)流程圖B-樹(shù)查找模塊如圖3.4所示。圖3.4 B-樹(shù)查找元素模塊流程圖B-樹(shù)查找模塊如圖3.4所示。圖 B-樹(shù)查找元素模塊流程圖4 測(cè)試圖表 4-1序號(hào)數(shù)據(jù)內(nèi)容說(shuō)明顯示截圖13查找,要查元素在B-樹(shù)中25查找,要查元素不在B-樹(shù)中332插入,插入元素不在B樹(shù)中442插入,插入元素在B-樹(shù)中561刪除,

6、刪除元素在B-樹(shù)中651刪除,刪除元素不在B-樹(shù)中界面主菜單運(yùn)行結(jié)果如圖4.1所示。圖4.1 主界面運(yùn)行查詢B-樹(shù)中元素運(yùn)行結(jié)果分兩種可能一是要查元素在B-樹(shù)中,另一種是不在。要查元素在B-樹(shù)中的運(yùn)行結(jié)果如圖4.2所示。圖4.2 查找B-樹(shù)已有元素要查不在元素在B-樹(shù)中的運(yùn)行結(jié)果如圖4.3所示。圖4.3 查找B-樹(shù)中沒(méi)有元素插入B-樹(shù)中元素運(yùn)行結(jié)果分兩種可能一是要查元素在B-樹(shù)中,另一種是不在。要插入的元素在B-樹(shù)中的運(yùn)行結(jié)果如圖4.4所示。圖4.4 插入B-樹(shù)已有元素要插入的元素不在B-樹(shù)中的運(yùn)行結(jié)果如圖4.5所示。圖4.5 插入B-樹(shù)中沒(méi)有元素插入B-樹(shù)中元素運(yùn)行結(jié)果分兩種可能一是要查元素

7、在B-樹(shù)中,另一種是不在。要?jiǎng)h除的元素在B-樹(shù)中的運(yùn)行結(jié)果如圖4.6所示。圖4.6 刪除B-樹(shù)中已有元素要?jiǎng)h除的元素不在B-樹(shù)中的運(yùn)行結(jié)果如圖4.7所示。圖4.7 刪除B-樹(shù)中沒(méi)有元素退出B-樹(shù)中元素的運(yùn)行結(jié)果如圖4.8所示。圖4.8 退出運(yùn)行主界面5 總結(jié)歷時(shí)兩周的課程設(shè)計(jì)終于結(jié)束了,對(duì)于課程設(shè)計(jì):首先,關(guān)于程序方面,我發(fā)現(xiàn)即使對(duì)設(shè)計(jì)思路有了眉目,知道了所要用到的B-樹(shù)的一些知識(shí),但是要把這些寫(xiě)成函數(shù)代碼,其實(shí)還是一件非常不容易的事情。再加上要完善設(shè)計(jì)思路,構(gòu)造整個(gè)程序框架在內(nèi),都是一件工作量非常大的工作。幸好,有很多資料可以在網(wǎng)路上搜到。所以課程設(shè)計(jì)的第一天,我們搜集了很多關(guān)于B-樹(shù)的資料

8、,包括幾種不同思路的程序代碼,以及程序流程。然后我們的工作就變成:盡量看懂并整理這些代碼,然后再其基礎(chǔ)上篩選需要的功能,按照自己的意愿來(lái)修改與完善。在操作界面的人性化上,我倒盡可能的做得很完善,無(wú)論從美觀角度還是方便清楚操作,都實(shí)行了非常人性化的方式。因?yàn)橥ǔG宄绦虻娜耍涝趺床僮饕约霸撦斎胧裁?,而不清楚的人卻有很大可能在細(xì)節(jié)方面輸入錯(cuò)誤導(dǎo)致程序運(yùn)行失敗,或是根本不知道應(yīng)該怎么輸入。所以,盡可能的人性化的設(shè)計(jì)是非常有必要的,讓不懂程序的人也可以正確的操作運(yùn)行。在調(diào)試程序的過(guò)程中,遇到了許多常識(shí)性的問(wèn)題,通過(guò)不斷的調(diào)試、改進(jìn),最終使程序能夠運(yùn)行,并且得到正確的運(yùn)行結(jié)果。在這個(gè)過(guò)程中,能夠不斷

9、地發(fā)現(xiàn)問(wèn)題,并且自己獨(dú)立的去解決多遇到的問(wèn)題,這是課程設(shè)計(jì)過(guò)程中所不可缺少的精神。 最后,做再次一下總結(jié)。程序方面仍有為解決的問(wèn)題,希望即便課設(shè)之后也可以努力將問(wèn)題解決掉。然后B-樹(shù)的算法中,有些知道怎么做卻很難清楚回答出來(lái)的問(wèn)題,希望可以再好好的查找一下相關(guān)資料,將知識(shí)系統(tǒng)化、理論化、規(guī)范化。參考文獻(xiàn)1顧澤元,劉文強(qiáng)編.數(shù)據(jù)結(jié)構(gòu).北京:北京航空航天大學(xué)出版社,2011年. 2李素若,陳萬(wàn)華,游明坤編.數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言描述),中國(guó)水利水電出版社,2014年.3李素若,陳萬(wàn)華,游明坤編.數(shù)據(jù)結(jié)構(gòu)習(xí)題解答及上機(jī)指導(dǎo),中國(guó)水利水電出版社,2014年.4譚浩強(qiáng)編.C語(yǔ)言設(shè)計(jì).清華大學(xué)出版社,2011年

10、. 附錄 源程序代碼#include #include #include #define m 4 /B-樹(shù)的階,設(shè)定為4 #define max 32767 typedef struct BTNode int keynum; /結(jié)點(diǎn)中關(guān)鍵字的個(gè)數(shù),即結(jié)點(diǎn)的大小 struct BTNode *parent; /指向雙親指針int keym+1; /關(guān)鍵字向量struct BTNode *ptrm+1; /子樹(shù)指針向量BTNode,*BTree; /定義B-樹(shù)的節(jié)點(diǎn)結(jié)構(gòu)int data20=3,24,45,27,53,90,50,61,70,100,12,37,85,105,108,113,121

11、,124,138,135; BTree T,R,R1; int rag; BTree searchtree(int k) /查找建樹(shù)時(shí)要插入元素的位置 int j; BTree p1,q1; p1=T; while(p1) for(j=1;jkeyjk) break; q1=p1;p1=p1-ptrj-1; rag=j-1; return q1; void search(BTree p2,int a) int j; for(j=1;jkeyja) break; rag=j-1; void zimeau() /介紹菜單 printf(ttn); printf(tt菜單簡(jiǎn)介n); printf(t

12、tn); printf(tt1.查詢結(jié)點(diǎn)信息n); printf(tt2.插入新的結(jié)點(diǎn)n); printf(tt3.刪除結(jié)點(diǎn)n); printf(tt4.退出n); printf(ttn); int searchbtree(int k) /查詢要查元素在樹(shù)中,若樹(shù)中有該元素則打印否則打印說(shuō)明無(wú) int i,found=0; BTree p; p=T; while(!found)&(p-ptr0!=NULL) for(i=1;im;i+) if(kkeyi) break; if(p-keyi=k) found=1; else p=p-ptri-1; if(p-ptr0=NULL) for(i=1

13、;im;i+) if(kkeyi) break; if(p-keyi=k) found=1; if(found=0) printf(tt此元素不在該B-樹(shù)中n); else printf(tt此元素元素在該B-樹(shù)中n); printf(tt該元素是B-樹(shù)中結(jié)點(diǎn)的第%d元素n,i); return found; void insertbtree(int x) /插入元素函數(shù) int j,finished,s; BTree q,p; finished=0; q=searchtree(x); /查找要插入元素在B-樹(shù)中的位置while(!finished) if(q-keynum=0) /當(dāng)要插入的

14、元素所在結(jié)點(diǎn)是根節(jié)點(diǎn),且為新申請(qǐng)的根結(jié)點(diǎn) q-ptr0=p;q-ptr1=R;q-key1=x; q-keynum+;p-parent=q;R-parent=q; else if(q-keynum!=0)&(q-ptr0!=NULL)/當(dāng)要插入的元素所在結(jié)點(diǎn)是中間的結(jié)點(diǎn)x for(j=3;jrag;j-) q-keyj+1=q-keyj;q-ptrj+1=q-ptrj; q-ptrj+1=R;R-parent=q;q-keyj+1=x;q-keynum+; else /當(dāng)插入的元素所在結(jié)點(diǎn)是最下層的結(jié)點(diǎn)時(shí) for(j=3;jrag;j-) q-keyj+1=q-keyj; q-keyj+1=x

15、;q-keynum+; finished=0; if(q-keynumkeys;q-keys=max;q-keynum=s-1; R=(BTNode*)malloc(sizeof(BTNode); /新申請(qǐng)一個(gè)結(jié)點(diǎn)來(lái)存放分裂的另一部分?jǐn)?shù)據(jù)R-key1=q-keys+1; for(j=2;jkeyj=max;R-ptrj=NULL; R-ptr0=q-ptrs;R-ptr1=q-ptrs+1; R-keynum=1;q-keys+1=max;p=q;q=q-parent; if(!q) R1=(BTNode*)malloc(sizeof(BTNode); /新申請(qǐng)一個(gè)節(jié)點(diǎn)作為根節(jié)點(diǎn)T=q=R1;

16、 q-keynum=0;q-parent=NULL; for(j=1;jkeyj=max; for(j=0;jptrj=NULL; else search(q,x); /在一個(gè)結(jié)點(diǎn)中查找要插入元素的位置 void deletetree1(BTree q,int j) /當(dāng)要?jiǎng)h除的節(jié)點(diǎn)是終端結(jié)點(diǎn),j是要?jiǎng)h除元素是節(jié)點(diǎn)的地幾個(gè)元素 int i,h; BTree p,q0,q1; p=q-parent; for(h=0;hptrh=q) break; if(h=0) q1=p-ptrh+1; else q0=p-ptrh-1;q1=p-ptrh+1; if(q-keynum=m/2) /當(dāng)節(jié)點(diǎn)的數(shù)目

17、不小于m/2 for(i=j;ikeyi=q-keyi+1; else if(q-keynumkeynum=2|q1-keynum=2) /當(dāng)結(jié)點(diǎn)的數(shù)目少于m/2但其左兄弟或右兄弟的結(jié)點(diǎn)數(shù)目大于時(shí) if(q1-keynum=m/2) /右兄弟時(shí) q-keyj=p-keyh;p-keyh=q1-key0; for(i=0;ikeyi=q1-keyi+1; q1-keynum-; else /左兄弟時(shí) q-keyj=p-keyh;p-keyh=q0-keyq0-keynum; q0-keyq0-keynum=q0-keyq0-keynum+1;q0-keynum-; else /當(dāng)結(jié)點(diǎn)的數(shù)目少于m

18、/2且其左兄弟和右兄弟的結(jié)點(diǎn)數(shù)目小于時(shí) if(h=0) /當(dāng)該節(jié)點(diǎn)只有有兄弟時(shí) q-key1=p-key1;q-key2=q1-key1;q-keynum=2;free(q1); for(i=1;ikeyi=p-keyi+1;p-keyi=p-keyi+1; p-keynum-; else /當(dāng)該節(jié)點(diǎn)有左兄弟時(shí) q-key1=p-keyh;q-key2=q0-key1;q-keynum=2;free(q0); for(i=1;ikeyi=p-keyi+1; p-ptri=p-ptri+1; p-keynum-; void deletetree2(BTree q,int j) /要插入節(jié)點(diǎn)是非終

19、端結(jié)點(diǎn) BTree p; p=q; while(q-ptr0)/找終端結(jié)點(diǎn)q=q-ptrj; if(q-ptr0!=NULL) q=q-ptr0; q=q-parent;p-keyj=q-key1; deletetree1(q,1); void deletetree(int k) int i,found=0; BTree p; p=T; while(!found)&(p-ptr0!=NULL) /找到要插入節(jié)點(diǎn)的位置 for(i=1;im;i+) if(kkeyi) break; if(p-keyi=k) found=1; else p=p-ptri-1; if(p-ptr0=NULL) fo

20、r(i=1;im;i+) if(kkeyi) /找到要插入節(jié)點(diǎn)的位置break; if(p-ptr0=NULL) deletetree1(p,i); /當(dāng)要?jiǎng)h除元素是終端結(jié)點(diǎn)else deletetree2(p,i); /當(dāng)插入節(jié)點(diǎn)不是終端結(jié)點(diǎn) int searchbtree1(int k) /查詢要?jiǎng)h除元素是否在樹(shù)中int i,found=0; BTree p; p=T; while(!found)&(p-ptr0!=NULL) for(i=1;im;i+) if(kkeyi) break; if(p-keyi=k)found=1; else p=p-ptri-1; if(p-ptr0=NU

21、LL) for(i=1;im;i+) if(kkeyi) break; if(p-keyi=k) found=1; /返回值,1代表該元素在B-樹(shù)中可以刪除否則無(wú)法刪除return found; int rumeau() /提供給讀者自己的選擇 int c; printf(tttt請(qǐng)輸入您的選擇:); scanf(%d,&c); return c; void meau() /菜單選項(xiàng)函數(shù) int a,b,rate; printf(tt%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %cn,3,3,3,3,3,3,3,

22、3,3,3,3,3,3,3,3,3,3,3,3,3,3,3); do zimeau(); printf(tt%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %cn,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3); a=rumeau(); /子菜單switch(a) case 1:system(cls); printf(tt請(qǐng)輸入要查找的元素:); scanf(%d,&b); rate=searchbtree(b); /在B-樹(shù)中查找元素函數(shù)break; case 2:syst

23、em(cls); printf(tt請(qǐng)輸入要插入的元素:); scanf(%d,&b); rate=searchbtree(b); /查詢要插入的元素是否在該B-樹(shù)中if(rate=0) printf(tt該元素不在此B-樹(shù)中,故可插入之); insertbtree(b); /插入新元素函數(shù) else printf(tt該元素已在B-樹(shù)中,不需要再插入n); break; case 3:system(cls); printf(tt請(qǐng)輸入要?jiǎng)h除的元素:); scanf(%d,&b); rate=searchbtree1(b); if(rate=0) printf(tt由于該元素不在此B-樹(shù)中,故

24、無(wú)法刪除n); else printf(tt該元素在此B-樹(shù)中,可刪除n); deletetree(b); /刪除B-樹(shù)中的元素調(diào)用函數(shù) break; while(a!=4); void main() int x,i,finished,s,j; BTree q,p; system(color 1B); /背景顏色顯示函數(shù)T=(BTNode*)malloc(sizeof(BTNode);T-keynum=0; for(i=0;ikeyi+1=datai;T-keynum+; T-key4=max; for(i=0;iptri=NULL; T-parent=NULL; for(i=3;ikeynum=0

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論