

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p><b> 第一部分 引言1</b></p><p> 1.1課程設(shè)計(jì)的目標(biāo)1</p><p> 1.2課程設(shè)計(jì)的基本要求1</p><p> 第二部分 系統(tǒng)功能和原始數(shù)據(jù)1</p><p><b
2、> 2.1原始數(shù)據(jù)1</b></p><p><b> 2.2系統(tǒng)功能1</b></p><p> 第三部分 程序總體設(shè)計(jì)2</p><p><b> 3.1數(shù)據(jù)結(jié)構(gòu)2</b></p><p> 3.2模塊劃分和層次結(jié)構(gòu)3</p><p>
3、; 3.3函數(shù)原型清單3</p><p> 3.4程序總體框架4</p><p><b> 3.5程序組織6</b></p><p> 第四部分 功能模塊函數(shù)設(shè)計(jì)和調(diào)試7</p><p> 第五部分 程序清單22</p><p> 第六部分 課程設(shè)計(jì)總結(jié)39</p&g
4、t;<p> 第七部分 參考資料39</p><p><b> 第一部分:引言</b></p><p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)的主要目的是培養(yǎng)學(xué)生綜合運(yùn)用數(shù)據(jù)結(jié)構(gòu)程序設(shè)計(jì)課程所學(xué)到的知識(shí),編寫(xiě)C程序解決實(shí)際問(wèn)題的能力,以及嚴(yán)謹(jǐn)?shù)墓ぷ鲬B(tài)度和良好的程序設(shè)計(jì)習(xí)慣。通過(guò)課程設(shè)計(jì)的訓(xùn)練,學(xué)生應(yīng)該能夠了解程序設(shè)計(jì)的基本開(kāi)發(fā)過(guò)程,掌握編寫(xiě)、調(diào)試和測(cè)試C語(yǔ)言程序的基
5、本技巧,充分理解結(jié)構(gòu)化程序設(shè)計(jì)的基本方法。</p><p> 數(shù)據(jù)結(jié)構(gòu)程序設(shè)計(jì)的主要任務(wù)是要求學(xué)生遵循軟件開(kāi)發(fā)過(guò)程的基本規(guī)范,運(yùn)用結(jié)構(gòu)化程序設(shè)計(jì)的方法,按照課程設(shè)計(jì)的題目要求,分析、設(shè)計(jì)、編寫(xiě)、調(diào)試和測(cè)試數(shù)據(jù)結(jié)構(gòu)程序及編寫(xiě)設(shè)計(jì)報(bào)告。</p><p> 第二部分:系統(tǒng)功能和原始數(shù)據(jù)</p><p><b> 原始數(shù)據(jù)</b></p&g
6、t;<p> 入庫(kù)書(shū)號(hào):35,16,18,70,5,50,22,60,13,17,12,45,25,42,15,90,30,7然后清除:45,90,50,22,42</p><p><b> ?。?)系統(tǒng)功能</b></p><p> 1.圖書(shū)信息錄入功能;</p><p> 2.圖書(shū)信息瀏覽功能;</p>&
7、lt;p> 3.按書(shū)名查詢(xún)圖書(shū)信息;</p><p> 4.圖書(shū)信息添加、刪除功能;</p><p> 備注:圖書(shū)信息包括:書(shū)的編號(hào)、書(shū)名、作者名、剩余量、總庫(kù)存量、借書(shū)者信息等。</p><p> 第三部分:程序總體設(shè)計(jì)</p><p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p>
8、;<b> B-樹(shù),順序表。</b></p><p> #define m 5 //B-樹(shù)的階</p><p> #define M 20//借相同書(shū)的最大人數(shù)</p><p> /*************借閱者信息(用單鏈表方式存儲(chǔ))***********/</p><p> struct data
9、 //記錄借書(shū)和還書(shū)日期的結(jié)構(gòu)體類(lèi)型</p><p><b> { </b></p><p> int year; //記錄年</p><p> int month; //記錄月</p><p> int
10、day; //記錄日</p><p><b> };</b></p><p> typedef struct Re{</p><p> char number[20];//借閱者編號(hào)</p><p> struct data bro;
11、 //記錄讀者的借書(shū)日期</p><p> struct data back; //記錄讀者的還書(shū)日期</p><p><b> }Reader;</b></p><p> /*************書(shū)的結(jié)構(gòu)體***********/</p><p> typedef struct Bo
12、ok{</p><p> unsigned int key;//書(shū)的編號(hào)</p><p> char bname[20];//書(shū)的名稱(chēng)</p><p> char writter[20];//作者姓名</p><p> unsigned int left;//剩余量</p><p>
13、; unsigned int total;//總庫(kù)存量</p><p> Reader reader[M];//借書(shū)者記錄</p><p> }Books;</p><p> /*************B-樹(shù)的存儲(chǔ)結(jié)構(gòu)***********/</p><p> typedef struct BTNode{
14、</p><p> int keynum;//結(jié)點(diǎn)關(guān)鍵子的個(gè)數(shù) </p><p> struct BTNode *parent;//指向父結(jié)點(diǎn)的指針</p><p> Books key[m+1];//一個(gè)結(jié)點(diǎn)中最多存放的書(shū)的個(gè)數(shù)</p><p> struct BTNode *ptr[m+1];//指向孩子
15、結(jié)點(diǎn)的指針</p><p> }BTNode,*BTree;</p><p> /*************查找結(jié)果的存儲(chǔ)結(jié)構(gòu)體***********/</p><p> typedef struct{</p><p> BTNode *pt; </p><p><b> int i; </
16、b></p><p><b> int tag; </b></p><p><b> }Result;</b></p><p><b> 模塊劃分和層次結(jié)構(gòu)</b></p><p><b> 函數(shù)原型清單</b></p><
17、;p> /*************歡迎界面*************/</p><p> void print();//界面 </p><p> char menu();//菜單界面</p><p> /*************輸入書(shū)的信息*************/</p><p> void InBookMess(Bo
18、oks &book);//輸入書(shū)號(hào)、書(shū)名等</p><p> /*************查找關(guān)鍵字在結(jié)點(diǎn)的位置*************/</p><p> int Search(BTree p, Books K);//一個(gè)結(jié)點(diǎn)中查找元素,返回結(jié)點(diǎn)的位置 </p><p> Result SearchBTree(BTree T, Books K);/
19、/查找K書(shū)在樹(shù)的位置并返回結(jié)果結(jié)構(gòu)體 </p><p> void ShowBookMess(Books book);//顯示一本書(shū)的具體信息</p><p> /*************插入關(guān)鍵字*************/</p><p> void NewRoot(BTree &T, BTree p, Books x, BTree ap);//
20、 生成一個(gè)樹(shù)新的結(jié)點(diǎn)</p><p> void split(BTree &q, int s, BTree &ap);//分離節(jié)點(diǎn)</p><p> void Insert(BTree &q, int i, Books x, BTree ap);//一個(gè)節(jié)點(diǎn)上的插入 </p><p> int InsertBTree(BTree &am
21、p;T, Books K);//將書(shū)插到B-樹(shù)上</p><p> /*************B-樹(shù)凹入輸出*************/ </p><p> void mball(BTree bth,int num);//凹入輸出</p><p> /*************刪除關(guān)鍵字*************/</p><p>
22、 void MoveLeft(BTree &q,int i);//將一個(gè)關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到左兄弟中 ,q為要?jiǎng)h關(guān)鍵字結(jié)點(diǎn)的雙親結(jié)點(diǎn) </p><p> void MoveRight(BTree &q,int i);//將一個(gè)關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到右兄弟中 ,q為要?jiǎng)h關(guān)鍵字結(jié)點(diǎn)的雙親結(jié)點(diǎn) </p><p> void Merge(BTree &q,int i);/
23、/合并結(jié)點(diǎn),q為被刪關(guān)鍵字結(jié)點(diǎn)的雙親結(jié)點(diǎn) </p><p> void DeleteBTree(BTree &T);//刪除一個(gè)關(guān)鍵字</p><p> /*************顯示書(shū)庫(kù)*************/</p><p> void display(BTree T);//顯示一棵樹(shù)的所有書(shū)的書(shū)名</p><p>
24、 /*************輸入書(shū)的關(guān)鍵字***********/ </p><p> void InBookKey(Books &book);//輸入查找書(shū)的關(guān)鍵字 </p><p> /*************借還書(shū)*************/</p><p> void borrow(BTree root);//借書(shū) </p>
25、<p> void payback(BTree root);//還書(shū)</p><p><b> 程序總體框架</b></p><p> int main()</p><p><b> {</b></p><p> Result rs; </p><p>&
26、lt;b> Books k; </b></p><p> char t;//輸入y或者n </p><p><b> while(1)</b></p><p><b> {</b></p><p><b> char c;</b></p>
27、<p><b> print();</b></p><p> c=menu(); //顯示菜單</p><p> switch(c) //按菜單函數(shù)返回值調(diào)用各相應(yīng)函數(shù)</p><p><b> {</b>&l
28、t;/p><p><b> case '1':</b></p><p> system("cls");</p><p> printf("\t------------------ 錄入書(shū)信息----------------\n");</p><p> InBoo
29、kMess(k); //輸入添加書(shū)的內(nèi)容 </p><p> InsertBTree(root,k);//將書(shū)插入在B-樹(shù)中 </p><p> printf("\t------------------ 錄入結(jié)束------------------ \n");</p><p> printf("\nThe Btree is:\n&
30、quot;);</p><p> mball(root,0);//凹入輸出 </p><p><b> break;</b></p><p> case '2': </p><p> system("cls");</p><p> DeleteBTre
31、e(root);//刪除B-樹(shù)中的一本書(shū)</p><p> printf("\nThe Btree is:\n");</p><p> mball(root,0);</p><p><b> break;</b></p><p> case '3':</p>
32、;<p> system("cls");</p><p> printf("\t------------------------------ 全部的書(shū)----------------------------\n\n");</p><p> display(root);// 顯示整棵樹(shù)的書(shū)的信息 </p><p&
33、gt; printf("\t------------------------------ 顯示完畢-----------------------------\n");</p><p><b> break;</b></p><p><b> case '4':</b></p><p&g
34、t; system("cls");</p><p> printf("\t------------------ 凹入表示法顯示----------------\n");</p><p> printf("\nThe Btree is:\n");</p><p> mball(root,0);<
35、/p><p><b> break; </b></p><p> case '5': </p><p> system("cls");</p><p> printf("\t------------------ 查找書(shū)信息----------------\n")
36、;</p><p> InBookKey(k);//輸入要查找書(shū)的關(guān)鍵字 </p><p> printf("\n");</p><p> rs = SearchBTree(root,k);</p><p> if(rs.tag == 1){</p><p> ShowBookMess(
37、rs.pt->key[rs.i]);//顯示一本書(shū)的具體信息 </p><p><b> }</b></p><p><b> else{</b></p><p> printf("\t你要查找的書(shū)號(hào)%d 不存在!\n\n",k.key);</p><p><
38、b> }</b></p><p> printf("\n\t------------------ 查找結(jié)束----------------\n");</p><p><b> break;</b></p><p> case '6': </p><p> s
39、ystem("cls");</p><p> printf("\t------------------ 借閱-----------------\n");</p><p> borrow(root);</p><p><b> break;</b></p><p>&l
40、t;b> case '7':</b></p><p> system("cls");</p><p> printf("\t----------------- 還書(shū)-----------------\n\n");</p><p> payback(root);</p>
41、<p><b> break;</b></p><p><b> case '8':</b></p><p> printf("\n\t你想退出嗎?(y/n)");</p><p> t=getch();</p><p> if(t==&
42、#39;y'||t=='Y') exit(0);</p><p><b> break;</b></p><p> default :break;</p><p><b> }</b></p><p> printf("\n\t 按任意鍵返回主菜單....
43、");</p><p><b> getch();</b></p><p> system("cls");</p><p><b> }</b></p><p><b> }</b></p><p><b>
44、; ?。?)程序組織</b></p><p> 第四部分:功能模塊函數(shù)設(shè)計(jì)和調(diào)試</p><p> /*************菜單界面***********/</p><p> void print()</p><p><b> {</b></p><p> printf(
45、"\n ╔══════════════╗ ");</p><p> printf("\n ║ 歡迎進(jìn)入圖書(shū)管理系統(tǒng) ║");</p><p> printf("\n
46、╚══════════════╝ ");</p><p><b> }</b></p><p> char menu()//顯示菜單函數(shù),返回接收的字符</p><p> { printf("\n");</p><p> printf("\
47、n 1.新書(shū)入庫(kù) \n 2.刪除舊書(shū) \n 3.顯示書(shū)庫(kù) \n 4.凹入顯示 \n 5.查找圖書(shū) \n
48、 6.讀者借書(shū) \n 7.讀者還書(shū) \n 8.退出系統(tǒng) \n");</p><p> printf(" \n");</p><p> printf("\n");</p>
49、<p> printf("\t\t\t>>>>>>>>>請(qǐng)選擇<<<<<<<<<<\n");</p><p> printf("\n");printf("\n");</p><p> printf(
50、"\t\t");</p><p> fflush(stdin);//清除緩存</p><p> return getchar(); //接受菜單命令</p><p><b> } </b></p><p> //************
51、*新書(shū)入庫(kù)***********//</p><p> /*************輸入添加書(shū)的內(nèi)容***********/</p><p> void InBookMess(Books &book){</p><p> char s[5];</p><p> printf("\t請(qǐng)輸入書(shū)號(hào):");&l
52、t;/p><p> scanf("%s",s);</p><p> book.key = atoi(s);</p><p> printf("\t請(qǐng)輸入書(shū)名:");</p><p> scanf("%s",&book.bname);</p><p&g
53、t; printf("\t請(qǐng)輸入作者:");</p><p> scanf("%s",&book.writter);</p><p> printf("\t請(qǐng)輸入總量:");</p><p> scanf("%s",s);</p><p> bo
54、ok.total = atoi(s);//將字符串轉(zhuǎn)化為整型樹(shù) </p><p> book.left = book.total;</p><p> for(int i=0;i<M;i++)</p><p> book.reader[i].number[0]='\0';</p><p><b> }&l
55、t;/b></p><p> /*************插入新書(shū),在B樹(shù)中插入新結(jié)點(diǎn)***********/</p><p> int InsertBTree(BTree &T, Books K) {</p><p> //在m階B樹(shù)T上結(jié)點(diǎn)*q的key[i]與key[i+1]之間插入關(guān)鍵字K。</p><p><
56、b> BTree ap;</b></p><p> Result rs;</p><p><b> BTree q;</b></p><p><b> int i;</b></p><p> char addnum;</p><p> int f
57、inished, needNewRoot, s;</p><p><b> Books x;</b></p><p> if (!T){ </p><p> NewRoot(T, NULL, K, NULL); </p><p><b> }</b>
58、</p><p><b> else {</b></p><p> rs = SearchBTree(T,K);//查找元素k 在樹(shù)中的位置</p><p> q = rs.pt; </p><p> i = rs.i; </p><p> if(rs.tag == 1){ </
59、p><p> if(strcmp(q->key[i].bname,K.bname) != 0){</p><p> printf("\n\t錄入失敗,原因:\n");</p><p> printf(".\t書(shū)號(hào)沖突,請(qǐng)重新為該書(shū)編號(hào)!\n\n");</p><p> printf("
60、;\t已經(jīng)存在書(shū)號(hào)為%d 的書(shū)為:\n",q->key[i].key);</p><p> ShowBookMess(q->key[i]);</p><p><b> return 0;</b></p><p><b> }</b></p><p><b>
61、else</b></p><p><b> {</b></p><p> printf("\n\t該書(shū)已經(jīng)存在!\n\n");</p><p> printf("\t是否增加其總量(y/n):");</p><p> getchar();</p>
62、<p> scanf("%c",&addnum);</p><p> if(addnum == 'Y' || addnum == 'y'){</p><p> q->key[i].total+=K.total; </p><p> q->key[i].left += K.to
63、tal; </p><p> printf("\n\t增加總量后該書(shū)的信息如下\n");</p><p><b> }</b></p><p><b> else{</b></p><p> printf("\n\t該書(shū)的信息如下:\n");&l
64、t;/p><p><b> }</b></p><p> ShowBookMess(q->key[i]);</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> } &
65、lt;/b></p><p><b> x = K; </b></p><p> ap = NULL; </p><p> finished = needNewRoot = 0; </p><p> while (!needNewRoot && !finished) {</p
66、><p> Insert(q, i, x, ap); //插入結(jié)點(diǎn)</p><p> if (q->keynum < m) </p><p> finished = 1; // 插入完成</p><p> else { // 分裂結(jié)點(diǎn)*q</p><p> s = (m+1)/2; <
67、/p><p> split(q, s, ap); </p><p> x = q->key[s];</p><p> if (q->parent) { // 在雙親結(jié)點(diǎn)*q中查找x的插入位置</p><p> q = q->parent; </p><p> i = Search(q, x)
68、; </p><p><b> } </b></p><p><b> else </b></p><p> needNewRoot = 1;</p><p><b> } </b></p><p><b> } </b>
69、;</p><p> if (needNewRoot) </p><p> NewRoot(T, q, x, ap); // 生成新根結(jié)點(diǎn)*T,q和ap為子樹(shù)指針</p><p><b> }</b></p><p><b> return 1;</b></p>
70、<p><b> }</b></p><p> /*************凹入表示法輸入***********/</p><p> void mball(BTree bth,int num)//以brh為根節(jié)點(diǎn)的凹入輸出 </p><p><b> {</b></p><p>&
71、lt;b> BTree p;</b></p><p><b> int i,j;</b></p><p> p=bth; //當(dāng)前指向要輸出的結(jié)點(diǎn)的指針</p><p> if(p) //結(jié)點(diǎn)非空</p><p><b> {</b></p><p&
72、gt; for(j=0;j<num;j++)</p><p> printf(" ");</p><p> for(i=1;i<=p->keynum;i++)</p><p><b> {</b></p><p><b> //k=t;</b>&l
73、t;/p><p> printf("%d ",p->key[i].key); //順序輸出該結(jié)點(diǎn)的關(guān)鍵字 </p><p><b> //t=k;</b></p><p><b> }</b></p><p> printf(" \n")
74、;</p><p> for(i=0;i<=p->keynum;i++)</p><p> mball(p->ptr[i],num+1);</p><p> //順序遞歸訪問(wèn)該結(jié)點(diǎn)的各個(gè)子結(jié)點(diǎn)</p><p><b> }</b></p><p><b> }
75、</b></p><p> //*************刪除舊書(shū)***********//</p><p> /*************刪除一個(gè)關(guān)鍵字***********/</p><p> void DeleteBTree(BTree &T)//在m階B-樹(shù)T上刪除關(guān)鍵詞</p><p><b>
76、 {</b></p><p> Books x;//要?jiǎng)h除</p><p> Result rs; </p><p> BTree q,p;</p><p> int i,j,s=(m+1)/2;</p><p> char isdel;//輸入的是y還是n </p><p&
77、gt; printf("\n");</p><p> printf("\n\t 請(qǐng)輸入你想要?jiǎng)h除的書(shū)的關(guān)鍵字(即書(shū)號(hào)): ");</p><p> scanf("%d",&x.key);//x為要?jiǎng)h的關(guān)鍵字 </p><p> rs = SearchBTree(T,x);//找到x
78、在B-樹(shù)中的位置 </p><p> if(rs.tag==0)</p><p><b> {</b></p><p> printf("\n\t這本書(shū)不存在!\n");</p><p><b> return;</b></p><p><b
79、> }</b></p><p> printf("\n\t 你確定刪除這本書(shū)嗎?(y/n)");</p><p> getchar();</p><p> scanf("%c",&isdel);</p><p> if(isdel == 'n'
80、||isdel == 'N') </p><p><b> return;</b></p><p> else if (isdel == 'y'||isdel == 'Y') </p><p><b> {</b></p><p> while
81、(rs.pt->ptr[rs.i])//轉(zhuǎn)化為葉子節(jié)點(diǎn)刪除</p><p><b> {</b></p><p> rs.pt->key[rs.i]=rs.pt->ptr[rs.i]->key[1];</p><p> rs.pt=rs.pt->ptr[rs.i];</p><p>&
82、lt;b> rs.i=1;</b></p><p><b> } </b></p><p> p=rs.pt;//指向要?jiǎng)h除關(guān)鍵字的結(jié)點(diǎn) </p><p> i=rs.i;//刪除的關(guān)鍵詞p->key[i]位置 </p><p> for(j=i;j<p->keynum;j+
83、+)//刪除p->key[i]和p->ptr[i] </p><p><b> {</b></p><p> p->key[j]=p->key[j+1];</p><p> p->ptr[j]=p->ptr[j+1];</p><p><b> }</b>
84、</p><p> p->keynum--;</p><p> while((p->keynum<s-1)&&(p!=T))</p><p><b> {</b></p><p> q=p->parent;</p><p><b> i=
85、0;</b></p><p> while(p!=q->ptr[i])//找出p結(jié)點(diǎn)為其雙親結(jié)點(diǎn)q的第i個(gè)孩子; </p><p><b> i++;</b></p><p> if(i==0)//結(jié)點(diǎn)p為最左邊的孩子</p><p><b> {</b></p>
86、;<p> if(q->ptr[1]->keynum>s-1)//右兄弟是否有多余的關(guān)鍵字 </p><p> MoveLeft(q,1);</p><p><b> else</b></p><p> Merge(q,1);</p><p><b> } <
87、/b></p><p> else if(i==q->keynum)//結(jié)點(diǎn)p為最右邊的孩子</p><p><b> {</b></p><p> if(q->ptr[i-1]->keynum>s-1)</p><p> MoveRight(q,i);</p><
88、;p><b> else</b></p><p> Merge(q,i); </p><p><b> } </b></p><p> else if(q->ptr[i-1]->keynum>s-1)//結(jié)點(diǎn)p為中間孩子,先檢查左兄弟</p><p> MoveR
89、ight(q,i);</p><p> else if(q->ptr[i+1]->keynum>s-1)//再檢查右兄弟 </p><p> MoveLeft(q,i+1);</p><p> else Merge(q,i); </p><p><b> p=q; </b></p&g
90、t;<p><b> }</b></p><p> if(T->keynum==0)//根結(jié)點(diǎn)被合并,整個(gè)B-樹(shù)降低一層 </p><p><b> {</b></p><p><b> q=T;</b></p><p> T=T->ptr[
91、0];</p><p><b> free(q);</b></p><p><b> }</b></p><p><b> } </b></p><p><b> }</b></p><p> void MoveLeft(
92、BTree &q,int i)//將一個(gè)關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到左兄弟中 ,q為要?jiǎng)h關(guān)鍵字結(jié)點(diǎn)的雙親結(jié)點(diǎn) </p><p><b> {</b></p><p><b> int j;</b></p><p> BTree r=q->ptr[i-1];//指向左結(jié)點(diǎn) </p><p>
93、 r->keynum++;</p><p> r->key[r->keynum]=q->key[i];//從雙親結(jié)點(diǎn)q移動(dòng)關(guān)鍵詞到左結(jié)點(diǎn)中 </p><p> r->ptr[r->keynum]=q->ptr[i]->ptr[0];</p><p> r=q->ptr[i]; //指向右子樹(shù)</p&
94、gt;<p> q->key[i]=r->key[1];//將右結(jié)點(diǎn)樹(shù)中第一個(gè)關(guān)鍵詞移到雙親結(jié)點(diǎn)q中 </p><p> r->ptr[0]=r->ptr[1];</p><p> r->keynum--;</p><p> for(j=1;j<=r->keynum;j++)//將右結(jié)點(diǎn)中所有關(guān)鍵詞左移
95、一位 </p><p><b> {</b></p><p> r->key[j]=r->key[j+1];</p><p> r->ptr[j]=r->ptr[j+1];</p><p><b> }</b></p><p><b>
96、; } </b></p><p> void MoveRight(BTree &q,int i)//將一個(gè)關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到右兄弟中 ,q為要?jiǎng)h關(guān)鍵字結(jié)點(diǎn)的雙親結(jié)點(diǎn) </p><p><b> {</b></p><p><b> int j;</b></p><p>
97、 BTree r=q->ptr[i];//指向右結(jié)點(diǎn)</p><p> for(j=r->keynum;j>0;j--)//將右結(jié)點(diǎn)中所有關(guān)鍵詞右移一位 </p><p><b> {</b></p><p> r->key[j+1]=r->key[j];</p><p> r-&
98、gt;ptr[j+1]=r->ptr[j];</p><p><b> }</b></p><p> r->key[1]=q->key[i];//將雙親結(jié)點(diǎn)q移動(dòng)關(guān)鍵詞到右結(jié)點(diǎn)中</p><p> r->ptr[1]=r->ptr[0];</p><p> r->keynum+
99、+;</p><p> r=q->ptr[i-1];//指向左結(jié)點(diǎn)</p><p> q->key[i]=r->key[r->keynum];//將左結(jié)點(diǎn)中最后一個(gè)關(guān)鍵詞移到雙親結(jié)點(diǎn)q中 </p><p> q->ptr[i]->ptr[0]=r->ptr[r->keynum];</p><p
100、> r->keynum--;</p><p><b> } </b></p><p> void Merge(BTree &q,int i)//合并結(jié)點(diǎn),q為被刪關(guān)鍵字結(jié)點(diǎn)的雙親結(jié)點(diǎn) </p><p><b> {</b></p><p><b> int j
101、;</b></p><p> BTree r=q->ptr[i];//指向右結(jié)點(diǎn),將被置空并刪除;</p><p> BTree l=q->ptr[i-1];//指向左結(jié)點(diǎn)</p><p> l->keynum++;//從結(jié)點(diǎn)q移動(dòng)關(guān)鍵詞到左孩子中</p><p> l->key[l->key
102、num]=q->key[i];</p><p> l->ptr[l->keynum]=r->ptr[0];</p><p> for(j=1;j<=r->keynum;j++)//插入右結(jié)點(diǎn)中所有關(guān)鍵詞</p><p><b> {</b></p><p> l->key
103、num++;</p><p> l->key[l->keynum]=r->key[j];</p><p> l->ptr[l->keynum]=r->ptr[j]; </p><p><b> } </b></p><p> for(j=i;j<q->keynum;
104、j++)//刪除父結(jié)點(diǎn)中相應(yīng)的關(guān)鍵詞 </p><p><b> {</b></p><p> q->key[j]=q->key[j+1];</p><p> q->ptr[j]=q->ptr[j+1];</p><p><b> }</b></p>&
105、lt;p> q->keynum--;</p><p> free(r);//釋放空的右結(jié)點(diǎn)占用的空間 </p><p><b> }</b></p><p> //*************顯示書(shū)庫(kù)***********//</p><p> /*************顯示整棵樹(shù)的信息******
106、*****/</p><p> void display(BTree T){</p><p> int i = 0;</p><p><b> if(T) { </b></p><p> for(i=0; i<T->keynum; i++){ //使用遞歸的方法顯示每個(gè)結(jié)點(diǎn)</p>
107、<p> display(T->ptr[i]);</p><p> printf("\t");</p><p> printf("書(shū)號(hào)為:%d ", T->key[i+1].key);</p><p> printf("書(shū)名為:%5s ", T->key[i+1].b
108、name);</p><p> printf("作者為:%5s ", T->key[i+1].writter);</p><p> printf("剩余量為:%5d ", T->key[i+1].left);</p><p> printf("總量為:%5d", T->key[i
109、+1].total);</p><p> printf("\n\n");</p><p><b> }</b></p><p> display(T->ptr[i]);</p><p><b> }</b></p><p><b>
110、 }</b></p><p> //*************凹入顯示***********//</p><p> /*************凹入表示法輸入***********/</p><p> void mball(BTree bth,int num)//以brh為根節(jié)點(diǎn)的凹入輸出 </p><p><b&g
111、t; {</b></p><p><b> BTree p;</b></p><p><b> int i,j;</b></p><p> p=bth; //當(dāng)前指向要輸出的結(jié)點(diǎn)的指針</p><p> if(p) //結(jié)點(diǎn)非空</p><p><
112、;b> {</b></p><p> for(j=0;j<num;j++)</p><p> printf(" ");</p><p> for(i=1;i<=p->keynum;i++)</p><p><b> {</b></p>&
113、lt;p><b> //k=t;</b></p><p> printf("%d ",p->key[i].key); //順序輸出該結(jié)點(diǎn)的關(guān)鍵字 </p><p><b> //t=k;</b></p><p><b> }</b></p>
114、<p> printf(" \n");</p><p> for(i=0;i<=p->keynum;i++)</p><p> mball(p->ptr[i],num+1);</p><p> //順序遞歸訪問(wèn)該結(jié)點(diǎn)的各個(gè)子結(jié)點(diǎn)</p><p><b> }</b
115、></p><p><b> }</b></p><p> //*************查找圖書(shū)***********//</p><p> /*************輸入書(shū)的關(guān)鍵字***********/</p><p> void InBookKey(Books &book){</p
116、><p> char s[5];</p><p> printf("\t請(qǐng)輸入書(shū)號(hào):");</p><p> scanf("%s",s);</p><p> book.key = atoi(s);</p><p><b> }</b></p&g
117、t;<p> /*************在m階B樹(shù)T上查找關(guān)鍵字K,返回結(jié)果(pt,i,tag)***********/</p><p> Result SearchBTree(BTree T, Books K){ </p><p> BTree p, q;</p><p> int found, i;</p><p>
118、;<b> Result R;</b></p><p><b> p = T; </b></p><p> q = NULL; </p><p> found = 0; </p><p><b> i = 0; </b></p><p> w
119、hile (p && !found) {</p><p> i = Search(p, K); </p><p> if (i > 0 && p->key[i].key == K.key) </p><p> found = 1; </p><p><
120、b> else { </b></p><p><b> q = p; </b></p><p> p = p->ptr[i]; </p><p><b> }</b></p><p><b> }</b></p><p&g
121、t; if (found) { </p><p> R.pt = p; </p><p> R.i = i; </p><p> R.tag = 1; </p><p><b> } </b></p><p> else { </p><p>
122、 R.pt = q; </p><p><b> R.i = i; </b></p><p> R.tag = 0; </p><p><b> }</b></p><p> return R; </p><p><b> }&
123、lt;/b></p><p> /***************顯示書(shū)的具體信息**********/</p><p> void ShowBookMess(Books book){</p><p> printf("\t書(shū)號(hào)為:%3d\n", book.key);</p><p> printf("
124、;\t書(shū)名為:%3s\n", book.bname);</p><p> printf("\t作者為:%3s\n", book.writter);</p><p> printf("\t剩余量為:%3d\n", book.left);</p><p> printf("\t總量為:%3d\n"
125、;, book.total);</p><p> printf("\n");</p><p><b> }</b></p><p> //*************讀者借書(shū)***********//</p><p> void borrow(BTree root)</p><
126、;p><b> {</b></p><p> int i,t,j;</p><p><b> BTree p;</b></p><p><b> Books k;</b></p><p> Result rs;</p><p> pri
127、ntf("\n");</p><p> printf("\n\t輸入你想查找的書(shū)的關(guān)鍵字 (即書(shū)號(hào)): ");</p><p> scanf("%d",&k.key);</p><p> printf("\n");</p><p> rs = S
128、earchBTree(root,k);</p><p><b> p=rs.pt;</b></p><p><b> i=rs.i;</b></p><p> if(rs.tag==1) //找到并顯示該書(shū)的信息</p><p><b&
129、gt; {</b></p><p> printf("\n\t 你想借這本書(shū)嗎 ?(y/n)");</p><p> cout<<endl<<"\t ┌───┬──────────────┐";</p><p> cout<<endl<<setio
130、sflags(ios::left)<<"\t │ 書(shū)名 │" <<setw(28)<<p->key[i].bname<<"│"; //輸出相關(guān)內(nèi)容</p><p> cout<<endl<<"\t ├───┼──────────────┤";</p>&
131、lt;p> cout<<endl<<setiosflags(ios::left)<<"\t │ 作者 │" <<setw(28)<<p->key[i].writter<<"│";</p><p> cout<<endl<<"\t ├───┴───
132、───────────┤";</p><p> cout<<endl<<setiosflags(ios::left)<<"\t │ 現(xiàn)庫(kù)存量 │"<<setw(24)<<p->key[i].left<<"│";</p><p> cout<<e
133、ndl<<"\t ├─────┼────────────┤";</p><p> cout<<endl<<setiosflags(ios::left)<<"\t │ 總庫(kù)存量 │"<<setw(24)<<p->key[i].total<<"│";</
134、p><p> cout<<endl<<"\t └─────┴────────────┘"<<endl;</p><p> t=getch();</p><p> if(t=='y'||t=='Y')</p><p><b> {</
135、b></p><p> if( (p->key[i].left)==0) printf("\n\t對(duì)不起,這本書(shū)已經(jīng)被借光了...");</p><p><b> else</b></p><p><b> {</b></p><p> for(j=0;j&l
136、t;M;j++) if( p->key[i].reader[j].number[0]=='\0') break;//把指針指到空的借閱者上</p><p> printf("\n\t 請(qǐng)輸入你的借書(shū)證號(hào): "); //輸入借書(shū)證號(hào)</p><p> scanf("%s",(p->key[i].reader[j
137、]).number);</p><p> printf("\n\t 請(qǐng)輸入借書(shū)日期: "); //輸入借書(shū)日期</p><p> printf("\n\t\t 年: ");</p><p> scanf("%d",&((p->key[i].reader[j])
138、.bro.year));</p><p> printf("\t\t 月: ");</p><p> scanf("%d",&((p->key[i].reader[j]).bro.month));</p><p> printf("\t\t 日: ");</p&
139、gt;<p> scanf("%d",&((p->key[i].reader[j]).bro.day));</p><p> printf("\n\t 輸入應(yīng)還書(shū)日期: "); //輸入應(yīng)還書(shū)日期</p><p> printf("\n\t\t 年: ");</p
140、><p> scanf("%d",&((p->key[i].reader[j]).back.year));</p><p> printf("\t\t 月: ");</p><p> scanf("%d",&((p->key[i].reader[j]).back.mo
141、nth));</p><p> printf("\t\t 日: ");</p><p> scanf("%d",&((p->key[i].reader[j]).back.day));</p><p> p->key[i].left--; /
142、/現(xiàn)存書(shū)量減1</p><p> printf("\n\t 你已借了書(shū)號(hào)為%d的這本書(shū).",k.key);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
143、<p> else printf("\n\t 這書(shū)號(hào)為%d的書(shū)不存在!",rs.i); //沒(méi)找到</p><p> } //借書(shū)函數(shù),無(wú)返回值</p><p> //*************讀者還書(shū)*******
144、****//</p><p> void payback(BTree root)//還書(shū)函數(shù),無(wú)返回值</p><p><b> {</b></p><p> int i,t,j,flag,temp;</p><p><b> BTree p;</b></p><p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖書(shū)管理課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)—課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)-課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)---圖書(shū)管理
- 圖書(shū)管理系統(tǒng)--jsp課程設(shè)計(jì)報(bào)告
- 學(xué)校圖書(shū)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- c課程設(shè)計(jì)報(bào)告-- 圖書(shū)管理系統(tǒng)
- 圖書(shū)管理信息課程設(shè)計(jì)
- 《圖書(shū)管理系統(tǒng)》課程設(shè)計(jì)
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)
- 圖書(shū)管理系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)---圖書(shū)管理系統(tǒng)
評(píng)論
0/150
提交評(píng)論