版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
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é)到的知識,編寫C程序解決實(shí)際問題的能力,以及嚴(yán)謹(jǐn)?shù)墓ぷ鲬B(tài)度和良好的程序設(shè)計(jì)習(xí)慣。通過課程設(shè)計(jì)的訓(xùn)練,學(xué)生應(yīng)該能夠了解程序設(shè)計(jì)的基本開發(fā)過程,掌握編寫、調(diào)試和測試C語言程序的基
5、本技巧,充分理解結(jié)構(gòu)化程序設(shè)計(jì)的基本方法。</p><p> 數(shù)據(jù)結(jié)構(gòu)程序設(shè)計(jì)的主要任務(wù)是要求學(xué)生遵循軟件開發(fā)過程的基本規(guī)范,運(yùn)用結(jié)構(gòu)化程序設(shè)計(jì)的方法,按照課程設(shè)計(jì)的題目要求,分析、設(shè)計(jì)、編寫、調(diào)試和測試數(shù)據(jù)結(jié)構(gòu)程序及編寫設(shè)計(jì)報(bào)告。</p><p> 第二部分:系統(tǒng)功能和原始數(shù)據(jù)</p><p><b> 原始數(shù)據(jù)</b></p&g
6、t;<p> 入庫書號: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.圖書信息錄入功能;</p><p> 2.圖書信息瀏覽功能;</p>&
7、lt;p> 3.按書名查詢圖書信息;</p><p> 4.圖書信息添加、刪除功能;</p><p> 備注:圖書信息包括:書的編號、書名、作者名、剩余量、總庫存量、借書者信息等。</p><p> 第三部分:程序總體設(shè)計(jì)</p><p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p>
8、;<b> B-樹,順序表。</b></p><p> #define m 5 //B-樹的階</p><p> #define M 20//借相同書的最大人數(shù)</p><p> /*************借閱者信息(用單鏈表方式存儲)***********/</p><p> struct data
9、 //記錄借書和還書日期的結(jié)構(gòu)體類型</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];//借閱者編號</p><p> struct data bro;
11、 //記錄讀者的借書日期</p><p> struct data back; //記錄讀者的還書日期</p><p><b> }Reader;</b></p><p> /*************書的結(jié)構(gòu)體***********/</p><p> typedef struct Bo
12、ok{</p><p> unsigned int key;//書的編號</p><p> char bname[20];//書的名稱</p><p> char writter[20];//作者姓名</p><p> unsigned int left;//剩余量</p><p>
13、; unsigned int total;//總庫存量</p><p> Reader reader[M];//借書者記錄</p><p> }Books;</p><p> /*************B-樹的存儲結(jié)構(gòu)***********/</p><p> typedef struct BTNode{
14、</p><p> int keynum;//結(jié)點(diǎn)關(guān)鍵子的個數(shù) </p><p> struct BTNode *parent;//指向父結(jié)點(diǎn)的指針</p><p> Books key[m+1];//一個結(jié)點(diǎn)中最多存放的書的個數(shù)</p><p> struct BTNode *ptr[m+1];//指向孩子
15、結(jié)點(diǎn)的指針</p><p> }BTNode,*BTree;</p><p> /*************查找結(jié)果的存儲結(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> /*************輸入書的信息*************/</p><p> void InBookMess(Bo
18、oks &book);//輸入書號、書名等</p><p> /*************查找關(guān)鍵字在結(jié)點(diǎn)的位置*************/</p><p> int Search(BTree p, Books K);//一個結(jié)點(diǎn)中查找元素,返回結(jié)點(diǎn)的位置 </p><p> Result SearchBTree(BTree T, Books K);/
19、/查找K書在樹的位置并返回結(jié)果結(jié)構(gòu)體 </p><p> void ShowBookMess(Books book);//顯示一本書的具體信息</p><p> /*************插入關(guān)鍵字*************/</p><p> void NewRoot(BTree &T, BTree p, Books x, BTree ap);//
20、 生成一個樹新的結(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);//一個節(jié)點(diǎn)上的插入 </p><p> int InsertBTree(BTree &am
21、p;T, Books K);//將書插到B-樹上</p><p> /*************B-樹凹入輸出*************/ </p><p> void mball(BTree bth,int num);//凹入輸出</p><p> /*************刪除關(guān)鍵字*************/</p><p>
22、 void MoveLeft(BTree &q,int i);//將一個關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到左兄弟中 ,q為要刪關(guān)鍵字結(jié)點(diǎn)的雙親結(jié)點(diǎn) </p><p> void MoveRight(BTree &q,int i);//將一個關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到右兄弟中 ,q為要刪關(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);//刪除一個關(guān)鍵字</p><p> /*************顯示書庫*************/</p><p> void display(BTree T);//顯示一棵樹的所有書的書名</p><p>
24、 /*************輸入書的關(guān)鍵字***********/ </p><p> void InBookKey(Books &book);//輸入查找書的關(guān)鍵字 </p><p> /*************借還書*************/</p><p> void borrow(BTree root);//借書 </p>
25、<p> void payback(BTree root);//還書</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------------------ 錄入書信息----------------\n");</p><p> InBoo
29、kMess(k); //輸入添加書的內(nèi)容 </p><p> InsertBTree(root,k);//將書插入在B-樹中 </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-樹中的一本書</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------------------------------ 全部的書----------------------------\n\n");</p><p> display(root);// 顯示整棵樹的書的信息 </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------------------ 查找書信息----------------\n")
36、;</p><p> InBookKey(k);//輸入要查找書的關(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]);//顯示一本書的具體信息 </p><p><b> }</b></p><p><b> else{</b></p><p> printf("\t你要查找的書號%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----------------- 還書-----------------\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)入圖書管理系統(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.新書入庫 \n 2.刪除舊書 \n 3.顯示書庫 \n 4.凹入顯示 \n 5.查找圖書 \n
48、 6.讀者借書 \n 7.讀者還書 \n 8.退出系統(tǒng) \n");</p><p> printf(" \n");</p><p> printf("\n");</p>
49、<p> printf("\t\t\t>>>>>>>>>請選擇<<<<<<<<<<\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、*新書入庫***********//</p><p> /*************輸入添加書的內(nèi)容***********/</p><p> void InBookMess(Books &book){</p><p> char s[5];</p><p> printf("\t請輸入書號:");&l
52、t;/p><p> scanf("%s",s);</p><p> book.key = atoi(s);</p><p> printf("\t請輸入書名:");</p><p> scanf("%s",&book.bname);</p><p&g
53、t; printf("\t請輸入作者:");</p><p> scanf("%s",&book.writter);</p><p> printf("\t請輸入總量:");</p><p> scanf("%s",s);</p><p> bo
54、ok.total = atoi(s);//將字符串轉(zhuǎn)化為整型樹 </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> /*************插入新書,在B樹中插入新結(jié)點(diǎn)***********/</p><p> int InsertBTree(BTree &T, Books K) {</p><p> //在m階B樹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 在樹中的位置</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書號沖突,請重新為該書編號!\n\n");</p><p> printf("
60、;\t已經(jīng)存在書號為%d 的書為:\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該書已經(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增加總量后該書的信息如下\n");</p><p><b> }</b></p><p><b> else{</b></p><p> printf("\n\t該書的信息如下:\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為子樹指針</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> //順序遞歸訪問該結(jié)點(diǎn)的各個子結(jié)點(diǎn)</p><p><b> }</b></p><p><b> }
75、</b></p><p> //*************刪除舊書***********//</p><p> /*************刪除一個關(guān)鍵字***********/</p><p> void DeleteBTree(BTree &T)//在m階B-樹T上刪除關(guān)鍵詞</p><p><b>
76、 {</b></p><p> Books x;//要刪除</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 請輸入你想要刪除的書的關(guān)鍵字(即書號): ");</p><p> scanf("%d",&x.key);//x為要刪的關(guān)鍵字 </p><p> rs = SearchBTree(T,x);//找到x
78、在B-樹中的位置 </p><p> if(rs.tag==0)</p><p><b> {</b></p><p> printf("\n\t這本書不存在!\n");</p><p><b> return;</b></p><p><b
79、> }</b></p><p> printf("\n\t 你確定刪除這本書嗎?(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;//指向要刪除關(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個孩子; </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)被合并,整個B-樹降低一層 </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)//將一個關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到左兄弟中 ,q為要刪關(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移動關(guān)鍵詞到左結(jié)點(diǎn)中 </p><p> r->ptr[r->keynum]=q->ptr[i]->ptr[0];</p><p> r=q->ptr[i]; //指向右子樹</p&
94、gt;<p> q->key[i]=r->key[1];//將右結(jié)點(diǎn)樹中第一個關(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)//將一個關(guān)鍵詞經(jīng)結(jié)點(diǎn)q移到右兄弟中 ,q為要刪關(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移動關(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)中最后一個關(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移動關(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> //*************顯示書庫***********//</p><p> /*************顯示整棵樹的信息******
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++){ //使用遞歸的方法顯示每個結(jié)點(diǎn)</p>
107、<p> display(T->ptr[i]);</p><p> printf("\t");</p><p> printf("書號為:%d ", T->key[i+1].key);</p><p> printf("書名為:%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> //順序遞歸訪問該結(jié)點(diǎn)的各個子結(jié)點(diǎn)</p><p><b> }</b
115、></p><p><b> }</b></p><p> //*************查找圖書***********//</p><p> /*************輸入書的關(guān)鍵字***********/</p><p> void InBookKey(Books &book){</p
116、><p> char s[5];</p><p> printf("\t請輸入書號:");</p><p> scanf("%s",s);</p><p> book.key = atoi(s);</p><p><b> }</b></p&g
117、t;<p> /*************在m階B樹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> /***************顯示書的具體信息**********/</p><p> void ShowBookMess(Books book){</p><p> printf("\t書號為:%3d\n", book.key);</p><p> printf("
124、;\t書名為:%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> //*************讀者借書***********//</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輸入你想查找的書的關(guān)鍵字 (即書號): ");</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) //找到并顯示該書的信息</p><p><b&
129、gt; {</b></p><p> printf("\n\t 你想借這本書嗎 ?(y/n)");</p><p> cout<<endl<<"\t ┌───┬──────────────┐";</p><p> cout<<endl<<setio
130、sflags(ios::left)<<"\t │ 書名 │" <<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)庫存量 │"<<setw(24)<<p->key[i].left<<"│";</p><p> cout<<e
133、ndl<<"\t ├─────┼────────────┤";</p><p> cout<<endl<<setiosflags(ios::left)<<"\t │ 總庫存量 │"<<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對不起,這本書已經(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 請輸入你的借書證號: "); //輸入借書證號</p><p> scanf("%s",(p->key[i].reader[j
137、]).number);</p><p> printf("\n\t 請輸入借書日期: "); //輸入借書日期</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)還書日期: "); //輸入應(yīng)還書日期</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)存書量減1</p><p> printf("\n\t 你已借了書號為%d的這本書.",k.key);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
143、<p> else printf("\n\t 這書號為%d的書不存在!",rs.i); //沒找到</p><p> } //借書函數(shù),無返回值</p><p> //*************讀者還書*******
144、****//</p><p> void payback(BTree root)//還書函數(shù),無返回值</p><p><b> {</b></p><p> int i,t,j,flag,temp;</p><p><b> BTree p;</b></p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖書管理課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)—課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)-課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)---圖書管理
- 圖書管理系統(tǒng)--jsp課程設(shè)計(jì)報(bào)告
- 學(xué)校圖書管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- c課程設(shè)計(jì)報(bào)告-- 圖書管理系統(tǒng)
- 圖書管理信息課程設(shè)計(jì)
- 《圖書管理系統(tǒng)》課程設(shè)計(jì)
- 圖書管理系統(tǒng)課程設(shè)計(jì)
- 圖書管理系統(tǒng)課程設(shè)計(jì)
- 圖書管理系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)---圖書管理系統(tǒng)
評論
0/150
提交評論