數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--家族關(guān)系查詢系統(tǒng)_第1頁(yè)
已閱讀1頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  課程名稱: 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)</p><p>  課程設(shè)計(jì)題目: 家族關(guān)系查詢系統(tǒng)</p><p><b>  目 錄 </b></p><p>  1 課程設(shè)計(jì)的目的…………………………</p><p>  2 需求分析…………………………………</p><p>  3

2、 課程設(shè)計(jì)報(bào)告內(nèi)容………………………</p><p>  3.1概要設(shè)計(jì)…………………………………</p><p>  3.2詳細(xì)設(shè)計(jì)…………………………………</p><p>  3.3調(diào)試分析…………………………………</p><p>  3.4用戶手冊(cè)………………………………</p><p>  3.5測(cè)試結(jié)果…

3、………………………………</p><p>  3.6程序清單………………………………</p><p>  4 小結(jié) ………………………………………</p><p>  5 參考文獻(xiàn) …………………………………</p><p><b>  1.課程設(shè)計(jì)的目的</b></p><p>  (1) 熟練

4、使用 C 語(yǔ)言編寫程序,解決實(shí)際問題;</p><p>  (2) 了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力;</p><p>  (3) 初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能;</p><p>  (4) 提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問題的能力;</p><p>

5、<b>  2.需求分析</b></p><p>  隨著社會(huì)發(fā)展,人們使用紙質(zhì)的家譜已經(jīng)非常不方便而且不利于在家譜里進(jìn)行添加和修改。而用算法設(shè)計(jì)一個(gè)家族關(guān)系查詢系統(tǒng)則可以解決這個(gè)問題。數(shù)據(jù)結(jié)構(gòu)的二叉樹剛好滿足家譜的基本結(jié)構(gòu)。首先建立一個(gè)文件作為家譜,然后在文件中輸入字符串,實(shí)現(xiàn)了在文件中按照數(shù)據(jù)的邏輯關(guān)系進(jìn)進(jìn)輸入便可建立相應(yīng)的三叉鏈表。然后就是進(jìn)行數(shù)據(jù)的存儲(chǔ)、刪除及查找工作。</p&

6、gt;<p><b>  算法分析</b></p><p>  本次設(shè)計(jì)研究的是建立家族關(guān)系,實(shí)現(xiàn)對(duì)家族成員關(guān)系相關(guān)查詢的問題。在設(shè)計(jì)中使用的數(shù)據(jù)結(jié)構(gòu)為樹狀結(jié)構(gòu),樹狀結(jié)構(gòu)采用三叉鏈表實(shí)現(xiàn)。我們?cè)诮⒑眉易尻P(guān)系后將其存儲(chǔ)在文件中,在文件中家族關(guān)系是以樹的形式存儲(chǔ),運(yùn)用樹的操作使家族關(guān)系得以準(zhǔn)確建立。 家族關(guān)系查詢系統(tǒng)可分為六大模塊,分別是創(chuàng)建、修改、查詢、保存、退出等。建立家族關(guān)

7、系模塊,建立家族關(guān)系并存入文件。建立時(shí)首先輸入家族關(guān)系的名稱,以此名稱為名建立文本文件。接下來按層輸入成員姓名,輸入一個(gè)在文件中寫入一個(gè)字符串,以回車鍵結(jié)束。打開一個(gè)家族關(guān)系。在界面輸入選項(xiàng)名,以家族關(guān)系名為文件名打開文件,如果家族關(guān)系不存在,返回空;如果存在,打開文件,讀取文件。向家族中添加一個(gè)新成員,添加的新成員要根據(jù)其父親確定其在家族中的位置。首先判斷該父親是否在此家族關(guān)系中,若存在,則查找其父親,將新節(jié)點(diǎn)插入其父親的最后一個(gè)孩子

8、之后;若沒有孩子,直接作為左孩子插入。以寫入的方式打開文件,更新數(shù)組中的信息,然后將數(shù)組中的信息寫入文件保存,關(guān)閉文件。查找功能模塊,查找一個(gè)成員的所有祖先及其兄弟,查找一個(gè)成員的所有祖先路徑,需要從它的父親一直向上查找?guī)ЦY(jié)點(diǎn)。查找一個(gè)成員的</p><p><b>  源程序</b></p><p>  #include <stdio.h> </

9、p><p>  #include <stdlib.h> </p><p>  #include <string.h> </p><p>  #include<conio.h> </p><p>  typedef char TElemType; </p><p>  typedef in

10、t status; </p><p>  typedef struct BiTPNode{ </p><p>  TElemType data[10]; </p><p>  struct BiTPNode *parent,*lchild,*rchild; //父親及左右孩子指針</p><p>  }BiTPNode,*BiPTree; &

11、lt;/p><p>  BiPTree P; </p><p>  BiPTree T; </p><p><b>  //家譜的創(chuàng)建</b></p><p>  int Cre() </p><p><b>  { </b></p><p>  syst

12、em("cls"); </p><p>  FILE *fp; //聲明指向文件的指針</p><p>  char filename[40],str[10]; </p><p>  printf("請(qǐng)輸入家譜名稱:"); </p><p>  getchar(); </p><p&

13、gt;  gets(filename); //輸入家譜名稱</p><p>  while(filename[0]==NULL) </p><p><b>  { </b></p><p>  printf("家譜名不能為空,請(qǐng)重新輸入:"); </p><p>  gets(filename); &

14、lt;/p><p><b>  } </b></p><p>  if((fp=fopen(filename,"w"))==NULL) </p><p><b>  { </b></p><p>  printf("%s家譜創(chuàng)建失敗!\n",filename);

15、</p><p>  return 0; </p><p><b>  } </b></p><p>  printf("請(qǐng)輸入家譜內(nèi)容:\n"); </p><p>  while (strlen(gets(str))>0) </p><p><b>  {

16、</b></p><p>  fputs(str,fp); //向文件寫入字符串</p><p>  putc('\n',fp); </p><p><b>  } </b></p><p>  fclose(fp); //關(guān)閉文件</p><p>  printf(&

17、quot;按任一鍵繼續(xù)!"); </p><p><b>  getch(); </b></p><p>  return 1; </p><p><b>  } </b></p><p>  status loc(BiPTree T,BiPTree &P,TElemType na

18、me[10]){ </p><p><b>  if(T)</b></p><p><b>  {</b></p><p><b>  P=T; </b></p><p><b>  //字符串的比較</b></p><p>  i

19、f(!strcmp(name,T->data)) return 1; </p><p>  if(loc(T->lchild,P,name)) return 1; </p><p>  if(loc(T->rchild,P,name)) return 1;</p><p><b>  } </b></p><

20、;p><b>  else </b></p><p>  return 0; </p><p><b>  } </b></p><p><b>  //構(gòu)造二叉樹</b></p><p>  status inittree(BiPTree &T){ </p

21、><p>  T=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p><b>  if(T) </b></p><p>  return 0; </p><p>  T->lchild=NULL; </p><p>  T->rchild=NULL

22、; </p><p>  T->parent=NULL; </p><p>  return 1; </p><p><b>  } </b></p><p><b>  //載入家譜</b></p><p>  status Crt(BiPTree &T){

23、</p><p>  FILE *fp; </p><p>  BiPTree Q,R,M,N; </p><p>  char filename[40],name[10]; </p><p>  system("cls"); //清屏</p><p>  R=(BiTPNode *)malloc(

24、sizeof(BiTPNode)); //分配存儲(chǔ)空間</p><p>  M=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p>  N=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p>  printf("請(qǐng)輸入家譜名:"); </p><

25、;p>  getchar(); </p><p>  gets(filename); </p><p>  while(filename[0]==NULL) </p><p><b>  { </b></p><p>  printf("家譜名不能為空,請(qǐng)重新輸入:"); </p>

26、<p>  gets(filename); </p><p><b>  } </b></p><p>  if((fp=fopen(filename,"r"))==NULL) </p><p><b>  { </b></p><p>  printf("

27、%s家譜打開失敗!\n",filename); </p><p>  return 0; </p><p><b>  } </b></p><p>  inittree(T); </p><p>  fscanf(fp,"%s",name); //從文件讀入姓名</p>&l

28、t;p>  strcpy(T->data,name); </p><p>  T->lchild=NULL; </p><p>  T->rchild=NULL; </p><p>  T->parent=NULL; </p><p>  fclose(fp); </p><p>  if

29、((fp=fopen(filename,"r"))==NULL) </p><p><b>  { </b></p><p>  printf("%家譜打開失敗!\n",filename); </p><p>  return 0; </p><p><b>  } &l

30、t;/b></p><p>  fscanf(fp,"%s",name); </p><p>  while(!feof(fp)){ </p><p>  if(loc(T,P,name)){ </p><p>  fscanf(fp,"%s",name); </p><p&g

31、t;  Q=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p>  strcpy(Q->data,name); </p><p>  P->lchild=Q; //構(gòu)建孩子</p><p>  Q->parent=P; </p><p>  Q->lchild=NULL; &l

32、t;/p><p>  Q->rchild=NULL; </p><p><b>  N=P; </b></p><p><b>  } </b></p><p>  else if(!loc(T,P,name)){ </p><p>  Q=(BiTPNode *)mall

33、oc(sizeof(BiTPNode)); </p><p><b>  R=N; </b></p><p>  R=R->lchild; </p><p>  while(R){ </p><p><b>  M=R; </b></p><p>  R=R->r

34、child;} </p><p>  strcpy(Q->data,name); </p><p>  M->rchild=Q; </p><p>  Q->parent=M; </p><p>  Q->lchild=NULL; </p><p>  Q->rchild=NULL;} &

35、lt;/p><p>  fscanf(fp,"%s",name); </p><p><b>  } </b></p><p>  printf("信息載入成功,按任一鍵繼續(xù)!"); </p><p><b>  getch(); </b></p>

36、<p>  return 1; </p><p><b>  } </b></p><p><b>  //添加成員</b></p><p>  status in(BiPTree &T){ </p><p>  char father[10],name[10]; </p&g

37、t;<p>  BiPTree Q,M; </p><p>  system("cls"); </p><p>  printf("請(qǐng)輸入要添加到該家譜中的人的父親姓名:"); </p><p>  getchar(); </p><p>  gets(father); </p>

38、;<p>  while(!loc(T,P,father)){ </p><p>  printf("%s不在該家譜中!請(qǐng)重新輸入:",father); </p><p>  gets(father);} </p><p>  printf("請(qǐng)輸入要添加到該家譜中的人的姓名:"); </p>&l

39、t;p>  gets(name); </p><p>  Q=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p>  M=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p>  strcpy(Q->data,name); </p><p>  Q-

40、>lchild=NULL; </p><p>  Q->rchild=NULL; </p><p>  if(!P->lchild){ </p><p>  P->lchild=Q; </p><p>  Q->parent=P;} </p><p><b>  else { &

41、lt;/b></p><p>  P=P->lchild; </p><p>  while(P){ </p><p><b>  M=P; </b></p><p>  P=P->rchild;} </p><p>  M->rchild=Q; </p>&

42、lt;p>  Q->parent=M; </p><p><b>  } </b></p><p>  printf("成員添加成功,按任一鍵繼續(xù)!"); </p><p><b>  getch(); </b></p><p>  return 1; </p&

43、gt;<p><b>  } </b></p><p><b>  //刪除成員</b></p><p>  status de(BiPTree &T){ </p><p>  char name[10]; </p><p>  system("cls");

44、 </p><p>  printf("請(qǐng)輸入要?jiǎng)h除的人的姓名:"); </p><p>  getchar(); </p><p>  gets(name); </p><p>  while(!loc(T,P,name)){ </p><p>  printf("%s不在該家譜中!請(qǐng)重

45、新輸入:",name); </p><p>  gets(name);} </p><p>  if(!P->rchild){ </p><p>  if(P->parent->lchild==P) </p><p>  P->parent->lchild=NULL; </p><p

46、><b>  else </b></p><p>  P->parent->rchild=NULL; </p><p>  free(P);} </p><p>  else if(P->rchild){ </p><p>  if(P->parent->lchild==P) <

47、/p><p>  P->parent->lchild=P->rchild; </p><p><b>  else </b></p><p>  P->parent->rchild=P->rchild; </p><p>  free(P);} </p><p> 

48、 printf("成員刪除成功,按任一鍵繼續(xù)!"); </p><p><b>  getch(); </b></p><p>  return 1; </p><p><b>  }</b></p><p>  status Show(TElemType e[10]){ <

49、;/p><p>  printf("%s ",e); </p><p>  return 1; </p><p><b>  } </b></p><p><b>  //二叉樹的遍歷</b></p><p>  status pre(BiPTree T,s

50、tatus(*visit)(TElemType[10])){ </p><p><b>  if(T) { </b></p><p>  if ((*visit)(T->data)) </p><p>  if (pre(T->lchild,visit)) </p><p>  if (pre(T->r

51、child,visit)) return 1; </p><p>  return 0; </p><p><b>  } </b></p><p>  else return 1; </p><p><b>  } </b></p><p><b>  //家族成

52、員查詢</b></p><p>  status Sea(BiPTree T){ </p><p>  char name[10]; </p><p>  BiPTree N; </p><p>  N=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p>  sys

53、tem("cls"); </p><p>  printf("請(qǐng)輸入要查尋的人的姓名:"); </p><p>  getchar(); </p><p>  gets(name); </p><p>  while(!loc(T,P,name)){ </p><p>  pri

54、ntf("%s不在該家譜中!請(qǐng)重新輸入:",name); </p><p>  gets(name);} </p><p><b>  N=P; </b></p><p><b>  if(P==T) </b></p><p>  printf("%s的父親在該家譜中沒

55、有記載!\n",P->data); </p><p><b>  else { </b></p><p>  while(N->parent->rchild==N) </p><p>  N=N->parent; </p><p>  printf("%s的父親是:%s\n&q

56、uot;,P->data,N->parent->data);} </p><p><b>  N=P; </b></p><p><b>  if(P==T) </b></p><p>  printf("%s沒有兄弟!\n",P->data); </p><

57、p>  else if(!P->rchild&&P->parent->rchild!=P) </p><p>  printf("%s沒有兄弟!\n",P->data); </p><p><b>  else { </b></p><p>  printf("%s的兄

58、弟有:\n",name); </p><p>  while(N->rchild){ </p><p>  printf("%s ",N->rchild->data); </p><p>  N=N->rchild;} </p><p><b>  N=P; </b>

59、</p><p>  while(N->parent->rchild==N){ </p><p>  printf("%s ",N->parent->data); </p><p>  N=N->parent;} </p><p>  printf("\n"); </

60、p><p><b>  } </b></p><p><b>  if(P==T) </b></p><p>  printf("%s的祖先在該家譜中沒有記載!\n",name); </p><p><b>  else </b></p><

61、p>  printf("%s的祖先是:%s\n",name,T->data); </p><p><b>  N=P; </b></p><p>  if(!P->lchild){ </p><p>  printf("%s沒有孩子!\n",name); </p><

62、p>  printf("%s沒有后代\n",name);} </p><p><b>  else { </b></p><p>  printf("%s的孩子有:\n",name); </p><p>  printf("%s ",P->lchild->data);

63、 </p><p>  N=N->lchild; </p><p>  while(N->rchild){ </p><p>  printf("%s ",N->rchild->data); </p><p>  N=N->rchild;} </p><p>  pri

64、ntf("\n"); </p><p>  printf("%s的后代有:\n",name); </p><p>  pre(P->lchild,Show); </p><p>  printf("\n"); </p><p><b>  } </b>&l

65、t;/p><p>  printf("按任一鍵繼續(xù)!"); </p><p><b>  getch(); </b></p><p>  return 1; </p><p><b>  } </b></p><p><b>  //文件的創(chuàng)建<

66、;/b></p><p>  status write(BiPTree T,char filename[40]){ </p><p>  FILE *fp; </p><p>  if((fp=fopen(filename,"a+"))==NULL) </p><p><b>  { </b>&

67、lt;/p><p>  printf("%s文件創(chuàng)建失敗!\n",filename); </p><p>  return 0; </p><p><b>  } </b></p><p>  fprintf(fp,"%s ",T->data); </p><

68、p>  T=T->lchild; </p><p>  while(T){ </p><p>  fprintf(fp,"%s ",T->data); </p><p>  T=T->rchild;} </p><p>  fprintf(fp,"\n"); //輸出</p

69、><p>  fclose(fp); </p><p>  return 1; </p><p><b>  } </b></p><p>  status prewrite(BiPTree T,status(*visit)(BiPTree,char[40]),char filename[40]){ </p>

70、<p><b>  if(T) { </b></p><p>  if (T->lchild) </p><p>  (*visit)(T,filename); </p><p>  prewrite(T->lchild,visit,filename); </p><p>  prewrite(T-

71、>rchild,visit,filename); </p><p>  return 1;} </p><p>  else return 1; </p><p><b>  }</b></p><p>  status wrong() </p><p><b>  { </

72、b></p><p><b>  char a; </b></p><p>  scanf("%c",&a); </p><p>  printf("無(wú)此選項(xiàng),請(qǐng)重新選擇!(按任一鍵繼續(xù)!)"); </p><p><b>  getch(); </b

73、></p><p>  return 1; </p><p><b>  } </b></p><p><b>  //家譜的存儲(chǔ)</b></p><p>  status Sav(BiPTree T){ </p><p>  FILE *fp; </p>

74、<p>  char filename[40]; </p><p>  system("cls"); </p><p>  printf("請(qǐng)輸入新的文件名:"); </p><p>  getchar(); </p><p>  gets(filename); </p>&l

75、t;p>  while(filename[0]==NULL) </p><p><b>  { </b></p><p>  printf("家譜名不能為空,請(qǐng)重新輸入:"); </p><p>  gets(filename); </p><p><b>  } </b>

76、</p><p>  prewrite(T,write,filename); </p><p>  printf("%s家譜保存成功,按任一鍵繼續(xù)!",filename); </p><p><b>  getch(); </b></p><p>  return 1; </p><

77、;p><b>  } </b></p><p><b>  //修改家譜</b></p><p>  status Upd(){ </p><p>  system("cls"); </p><p><b>  int xz; </b></p&g

78、t;<p><b>  while(1) </b></p><p><b>  { </b></p><p>  system("cls"); </p><p>  printf("\n\n\n\n");</p><p>  printf(&qu

79、ot; 家族成員的添加與刪除操作 \n");</p><p>  printf(" 請(qǐng)選擇 \n");</p><p>  printf(" 1.添加成員. \n"); </p><p>  printf(" 2.刪除成員. \n&

80、quot;); </p><p>  printf(" 3.返回上一級(jí). \n"); </p><p>  printf(" 請(qǐng)選擇:"); </p><p>  scanf("%d",&xz); </p><p>  switch(xz) <

81、;/p><p><b>  { </b></p><p>  case 1 : in(T);break; </p><p>  case 2 : de(T);break; </p><p>  case 3 : return 0; </p><p><b>  default :</b

82、></p><p><b>  wrong();</b></p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>

83、;  }</b></p><p><b>  main() </b></p><p><b>  { </b></p><p>  P=(BiTPNode *)malloc(sizeof(BiTPNode)); </p><p><b>  int xz; </b>

84、</p><p><b>  while(1) </b></p><p><b>  { </b></p><p>  system("cls"); </p><p>  printf("\n\n\n\n"); </p><p>  p

85、rintf(" 家族關(guān)系查詢系統(tǒng) \n"); </p><p>  printf(" 具體操作如下 \n"); </p><p>  printf(" 1.創(chuàng)建家譜. \n"); </p><p>  printf(" 2.

86、載入家譜. \n"); </p><p>  printf(" 3.修改家譜. \n"); </p><p>  printf(" 4.查尋成員. \n"); </p><p>  printf(" 5.保存家譜.

87、 \n"); </p><p>  printf(" 6.退出程序. \n"); </p><p>  printf(" 請(qǐng)選擇操作:"); </p><p>  scanf("%d",&xz); </p><p>  switc

88、h(xz) </p><p><b>  { </b></p><p><b>  case 1 : </b></p><p><b>  Cre();</b></p><p><b>  break; </b></p><p>&

89、lt;b>  case 2 : </b></p><p><b>  Crt(T);</b></p><p><b>  break; </b></p><p><b>  case 3 : </b></p><p><b>  Upd();<

90、/b></p><p><b>  break; </b></p><p><b>  case 4 : </b></p><p><b>  Sea(T);</b></p><p><b>  break; </b></p><

91、p><b>  case 5 : </b></p><p><b>  Sav(T);</b></p><p><b>  break; </b></p><p><b>  case 6 : </b></p><p>  return 0; <

92、;/p><p><b>  default :</b></p><p><b>  wrong();</b></p><p><b>  break; </b></p><p><b>  } </b></p><p><b>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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)論