2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論