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

下載本文檔

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

文檔簡介

1、<p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  題 目 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p>  學(xué)生姓名 </p><p>  指導(dǎo)教師

2、 </p><p>  學(xué) 院 信息科學(xué)與工程學(xué)院 </p><p>  專業(yè)班級 </p><p>  學(xué) 號 </p><p>  完成時(shí)間 2011年07月

3、 </p><p><b>  目 錄</b></p><p>  第一章、需求分析2</p><p>  第二章、概要設(shè)計(jì)2</p><p>  2.1設(shè)定圖的抽象數(shù)據(jù)類型2</p><p>  2.2設(shè)定隊(duì)列的抽象數(shù)據(jù)類型3</p><p> 

4、 2.3本程序包含的功能模塊3</p><p>  第三章、詳細(xì)設(shè)計(jì)3</p><p>  3.1頂點(diǎn)、邊和圖的類型6</p><p><b>  3.2隊(duì)列類型8</b></p><p>  3.3主程序和其他偽碼算法9</p><p>  第四章、調(diào)試分析9</p>

5、<p>  第五章、用戶手冊9</p><p>  第六章、測試結(jié)果10</p><p>  第七章、心得體會10</p><p>  附:源程序代碼11</p><p><b>  圖遍歷的演示</b></p><p>  題目:試設(shè)計(jì)一個程序,演示在連通的無向圖上訪問全部結(jié)點(diǎn)

6、的操作</p><p><b>  第一章、需求分析</b></p><p>  1、以鄰接多重表為存儲結(jié)構(gòu);</p><p>  2、實(shí)現(xiàn)連通和非連通的無向圖的深度優(yōu)先和廣度優(yōu)先遍歷;</p><p>  3、要求利用棧實(shí)現(xiàn)無向圖的深度優(yōu)先遍歷;</p><p>  4、以用戶指定的結(jié)點(diǎn)為起點(diǎn),

7、分別輸出每種遍歷下的結(jié)點(diǎn)訪問序列和生成樹的邊集;</p><p>  5、用凹入表打印生成樹;</p><p>  6、求出從一個結(jié)點(diǎn)到另外一個結(jié)點(diǎn),但不經(jīng)過另外一個指定結(jié)點(diǎn)的所有簡單路徑;</p><p>  6、本程序用C語言編寫,在C-Free3.5環(huán)境下通過。</p><p><b>  第二章、概要設(shè)計(jì)</b>

8、</p><p>  1、設(shè)定圖的抽象數(shù)據(jù)類型:</p><p>  ADT Graph{</p><p>  數(shù)據(jù)對象V:V是具有相同特性的數(shù)據(jù)元素的集合,稱為點(diǎn)集.</p><p><b>  數(shù)據(jù)關(guān)系R:</b></p><p><b>  R={VR}</b><

9、/p><p>  VR={(v,w)|v,w屬于V,(v,w)表示v和w之間存在的路徑}</p><p><b>  基本操作P:</b></p><p>  CreatGraph(&G,V,VR)</p><p>  初始條件:V是圖的頂點(diǎn)集,VR是圖中弧的集合.</p><p>  操作結(jié)

10、果:按V和VR是定義構(gòu)造圖G.</p><p>  DestroyGraph(&G)</p><p><b>  初始條件:圖G存在</b></p><p><b>  操作結(jié)果:銷毀圖G</b></p><p>  LocateVex(G,u)</p><p>  

11、初始條件: 圖G存在,u和G中頂點(diǎn)有相同的特征</p><p>  操作結(jié)果:若圖G中存在頂點(diǎn)u,則返回該頂點(diǎn)在圖中的位置;否則返回其他信息</p><p>  GetVex(G,v)</p><p>  初始條件: 圖G存在,v是G中頂點(diǎn)</p><p>  操作結(jié)果:返回v的值</p><p>  FirstAjv

12、ex(G,v)</p><p>  初始條件: 圖G存在,v是G中頂點(diǎn)</p><p>  操作結(jié)果:返回v的第一個鄰接頂點(diǎn),若頂在圖中沒有鄰接頂點(diǎn),則返回為空</p><p>  NextAjvex(G,v,w)</p><p>  初始條件: 圖G存在,v是G中頂點(diǎn),w是v的鄰接頂點(diǎn)</p><p>  操作結(jié)果:

13、返回v的下一個鄰接頂點(diǎn),若w是v的最后一個鄰接頂點(diǎn),則返回空</p><p>  DeleteVexx(&G,v)</p><p>  初始條件: 圖G存在,v是G中頂點(diǎn)</p><p>  操作結(jié)果:刪除頂點(diǎn)v已經(jīng)其相關(guān)的弧</p><p>  DFSTraverse(G,visit())</p><p> 

14、 初始條件: 圖G存在,visit的頂點(diǎn)的應(yīng)用函數(shù)</p><p>  操作結(jié)果: 對圖進(jìn)行深度優(yōu)先遍歷,在遍歷過程中對每個結(jié)點(diǎn)調(diào)用visit函數(shù)一次,一旦visit失敗,則操作失敗</p><p>  BFSTraverse(G,visit())</p><p>  初始條件: 圖G存在,visit的頂點(diǎn)的應(yīng)用函數(shù)</p><p>  操作

15、結(jié)果:對圖進(jìn)行廣度優(yōu)先遍歷,在遍歷過程中對每個結(jié)點(diǎn)調(diào)用visit函數(shù)一次,一旦visit失敗,則操作失敗</p><p>  }ADT Graph</p><p>  2、設(shè)定隊(duì)列的抽象數(shù)據(jù)類型:</p><p>  ADT Queue{</p><p>  數(shù)據(jù)對象:D={ai|ai屬于Elemset,i=1,2….,n,n>=0}&

16、lt;/p><p>  數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai屬于D,i=1,2,…,n}</p><p>  約定ai為端為隊(duì)列頭,an為隊(duì)列尾</p><p><b>  基本操作:</b></p><p>  InitQueue(&Q)</p><p>  操作

17、結(jié)果:構(gòu)造一個空隊(duì)列Q</p><p>  DestryoQueue(&Q)</p><p>  初始條件:隊(duì)列Q已存在。</p><p>  操作結(jié)果:隊(duì)列Q被銷毀,不再存在。</p><p>  EnQueue(&Q,e)</p><p>  初始條件:隊(duì)列Q已經(jīng)存在</p><

18、p>  操作結(jié)果:插入元素e為Q的新的隊(duì)尾元素</p><p>  DeQueue(&Q,&E)</p><p>  初始條件:Q為非空隊(duì)列</p><p>  操作結(jié)果:刪除Q的隊(duì)尾元素,并用e返回其值</p><p>  QueueEmpty(Q)</p><p>  初始條件:隊(duì)列已經(jīng)存在&

19、lt;/p><p>  操作結(jié)果:若隊(duì)列為空,則返回TRUE,否則返回FLASE</p><p>  }ADT Queue</p><p>  3、本程序包含四個模塊:</p><p><b>  主程序模塊</b></p><p>  void main ()</p><p>

20、;<b>  {</b></p><p><b>  手動構(gòu)造一個圖;</b></p><p>  進(jìn)行深度優(yōu)先遍歷圖;</p><p>  進(jìn)行廣度優(yōu)先遍歷圖;</p><p><b>  };</b></p><p>  手動構(gòu)造一個圖-自己輸入圖的

21、頂點(diǎn)和邊生成一個圖;</p><p>  進(jìn)行深度優(yōu)先遍歷圖-打出遍歷的結(jié)點(diǎn)序列和邊集;</p><p>  進(jìn)行廣度優(yōu)先遍歷圖-打出遍歷的結(jié)點(diǎn)序列和邊集;</p><p><b>  第三章、詳細(xì)設(shè)計(jì)</b></p><p><b>  頂點(diǎn),邊和圖類型</b></p><p&

22、gt;  #define MAX_INFO 10 /* 相關(guān)信息字符串的最大長度+1 */</p><p>  #define MAX_VERTEX_NUM 20 /* 圖中頂點(diǎn)數(shù)的最大值*/</p><p>  int visited[MAX_VERTEX_NUM]; /*全局變量,訪問標(biāo)志數(shù)組 */</p><p>  t

23、ypedef char InfoType; /*相關(guān)信息類型*/</p><p>  typedef char VertexType; /* 字符類型 */</p><p>  typedef enum{unvisited,visited}VisitIf;</p><p>  typedef struct EBox

24、 /*邊結(jié)點(diǎn)類型*/ </p><p>  { </p><p>  int mark; /*訪問標(biāo)記 */ </p><p>  int ivex,jvex;

25、 /*該邊依附的兩個頂點(diǎn)位置*/</p><p>  struct EBox *ilink,*jlink; /*分別指向依附這兩個頂點(diǎn)的下一條邊 */</p><p><b>  }EBox; </b></p><p>  typedef struct VexBox

26、 /*頂點(diǎn)結(jié)點(diǎn)類型*/ </p><p><b>  {</b></p><p>  char data[MAX_LEN]; </p><p>  EBox *fistedge; /*指向第一條依附該頂點(diǎn)的邊*/ </p><p>  }VexBox;

27、 </p><p>  typedef struct</p><p><b>  { </b></p><p>  VexBox list[MAX_VERTEX_NUM]; </p><p>  int vexnum,edgenum; /*無向圖當(dāng)前頂點(diǎn)數(shù)和邊數(shù) */ &l

28、t;/p><p>  }AMLGraph; </p><p><b>  圖的基本操作如下:</b></p><p>  int LocateVex(AMLGraph G,VertexType u);</p><p>  // 查G和u有相同特征的頂點(diǎn),若存在則返回該頂點(diǎn)在無向圖中位置;否則返回-1。</p>

29、<p>  VertexType& GetVex(AMLGraph G,int v);</p><p>  //以v返回鄰接多重表中序號為i的頂點(diǎn)。</p><p>  int FirstAdjVex(AMLGraph G,VertexType v);</p><p>  //返回v的第一個鄰接頂點(diǎn)的序號。若頂點(diǎn)在G中沒有鄰接頂點(diǎn),則返回-1。

30、</p><p>  int NextAdjVex(AMLGraph G,VertexType v,VertexType w);</p><p>  //返回v的(相對于w的)下一個鄰接頂點(diǎn)的序號若w是v的最后一個鄰接點(diǎn),則返回-1。</p><p>  void CreateGraph(AMLGraph &G);</p><p> 

31、 //采用鄰接多重表存儲結(jié)構(gòu),構(gòu)造無向圖G。</p><p>  Status DeleteArc(AMLGraph &G,VertexType v,VertexType w);</p><p>  //在G中刪除邊<v,w>。</p><p>  Status DeleteVex(AMLGraph &G,VertexType v);&l

32、t;/p><p>  //在G中刪除頂點(diǎn)v及其相關(guān)的邊。</p><p>  void DestroyGraph(AMLGraph &G);</p><p><b>  //銷毀一個圖</b></p><p>  void Display(AMLGraph G);</p><p>  //輸出

33、無向圖的鄰接多重表G。</p><p>  void DFSTraverse(AMLGraph G,VertexType start,int(*visit)(VertexType));</p><p>  //從start頂點(diǎn)起,(利用棧非遞歸)深度優(yōu)先遍歷圖G。</p><p>  void BFSTraverse(AMLGraph G,VertexType st

34、art,int(*Visit)(VertexType));</p><p>  //從start頂點(diǎn)起,廣度優(yōu)先遍歷圖G。void MarkUnvizited(AMLGraph G);//置邊的訪問標(biāo)記為未被訪問。其中部分操作的算法如下: void CreateGraph(AMLGraph *p) /*創(chuàng)建無向圖 */</p><p&g

35、t;  { </p><p>  int i,j,k; </p><p>  EBox *q; </p><p>  printf("\n\t\t\t請輸入圖的結(jié)點(diǎn)個數(shù)和邊的個數(shù):"); </p><p>  /*輸入圖的結(jié)點(diǎn)數(shù)和邊數(shù)*/&l

36、t;/p><p>  scanf("%d,%d",&p->vexnum,&p->edgenum); </p><p>  for(i=1;i<=p->vexnum;i++) </p><p>  { printf("\n\t\t\t請輸入結(jié)點(diǎn)%d的名稱:",i);/*輸入頂點(diǎn)數(shù)據(jù)信

37、息*/</p><p>  scanf("%s",p->list[i].data); </p><p>  p->list[i].fistedge=NULL; /*初始化指針*/ </p><p><b>  } </b></p><p&g

38、t;  for(k=0;k<p->edgenum;k++) /*輸入各邊并構(gòu)造多重鏈表*/ </p><p>  { printf("\n\t\t\t請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):");</p><p>  scanf("%d,%d",&i,&j);</p><p> 

39、 q=(EBox *)malloc(sizeof(EBox));</p><p>  q->mark=0; /*對邊結(jié)點(diǎn)賦值*/</p><p>  q->ivex=i;</p><p>  q->ilink=p->list[i].fistedge;</p>&l

40、t;p>  q->jvex=j;</p><p>  q->jlink=p->list[j].fistedge;</p><p>  p->list[i].fistedge=p->list[j].fistedge=q; /*完成邊在鏈頭的插入*/</p><p><b>  }</b></p>

41、<p>  printf("\n");</p><p><b>  }</b></p><p>  void DFS(AMLGraph *p, int v) </p><p>  { /*對第v個頂點(diǎn)的深度優(yōu)先遍歷 */</p>

42、<p><b>  int w; </b></p><p>  EBox *q; </p><p>  visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p><p>  printf("%s ",p->list[v].data);&l

43、t;/p><p>  for(q=p->list[v].fistedge;q!=NULL;) </p><p>  {if(q->ivex==v)</p><p>  {w=q->jvex; q=q->jlink;} </p><p><b>  else </b></p>&

44、lt;p>  {w=q->ivex; q=q->ilink;} </p><p>  if(!visited[w]) DFS(p,w); /*對尚未訪問的點(diǎn)調(diào)用DFS*/</p><p><b>  } </b></p><p><b>  }</b></p>

45、<p>  void DFSTraverse(AMLGraph *p,int n) </p><p>  { /*深度優(yōu)先遍歷 */</p><p><b>  int v;</b></p><p>  printf("\n

46、\t\t\t");</p><p>  for(v=1;v<=p->vexnum;v++) </p><p>  visited[v]=0; *訪問標(biāo)志數(shù)組初始化*/ </p><p>  DFS(p,n); /*對起

47、始頂點(diǎn)調(diào)用DFS*/ </p><p>  for(v=1;v<=p->vexnum;v++) </p><p>  if(!visited[v]) DFS(p,v); /*對尚未訪問的頂點(diǎn)調(diào)用DFS*/</p><p>  printf("\n"); </p>

48、<p><b>  } </b></p><p><b>  2、隊(duì)列類型</b></p><p>  typedef int QelemType;</p><p>  typedef struct QNode{</p><p>  QElemType data;</p&

49、gt;<p>  struct QNode *next;</p><p>  }QNode,*QueuePtr;</p><p>  typedef struct{</p><p>  QueuePtr front;</p><p>  QueuePtr rear; /* 隊(duì)頭、隊(duì)尾指針 */</p><p&

50、gt;  }LinkQueue;</p><p>  隊(duì)列的基本操作如下:Status InitQueue(LinkQueue &Q);//構(gòu)造一個空隊(duì)列Q。Status DestroyQueue(LinkQueue &Q);//銷毀隊(duì)列Q(無論空否均可)。Status QueueEmpty(LinkQueue Q);//若Q為空隊(duì)列,則返回1,否則返回-1。Status EnQue

51、ue(LinkQueue &Q,QElemType e);//插入元素e為Q的新的隊(duì)尾元素。Status DeQueue(LinkQueue &Q,QElemType &e);//若隊(duì)列不空,刪除Q的隊(duì)頭元素,用e返回其值,并返回1,否則返回-1。</p><p>  其中部分操作的算法如下:</p><p>  void BFS(AMLGraph *p,in

52、t v) </p><p>  { /*對第v個頂點(diǎn)進(jìn)行廣度優(yōu)先遍歷*/ </p><p>  int u,w; </p><p>  EBox *x; </p><p>  typedef struct queue</p><p>

53、;<b>  { </b></p><p><b>  int m; </b></p><p>  struct queue *next; </p><p>  }Q; /*輔助隊(duì)列Q*/ </p><p&g

54、t;  Q *head,*tail,*q; </p><p>  head=tail=(Q *)malloc(sizeof(Q)); </p><p>  tail->next=NULL; </p><p>  visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p>&l

55、t;p>  printf("%s ",p->list[v].data);</p><p>  tail->m=v; /*v入隊(duì)列 */ </p><p>  tail->next=(Q *)malloc(sizeof(Q)); </p><p>  ta

56、il=tail->next; </p><p>  tail->next=NULL; </p><p>  while(head!=tail)</p><p><b>  { </b></p><p>  q=head; </p><p>  head=head->

57、;next; </p><p>  u=q->m; /*對頭元素出隊(duì)并置為u*/ </p><p>  free(q); </p><p>  for(x=p->list[u].fistedge;x!=NULL;) </p><p>  { if(x->

58、;ivex==u) {w=x->jvex;x=x->ilink;}</p><p>  else {w=x->ivex;x=x->jlink;} </p><p>  if(!visited[w])</p><p><b>  { </b></p><p>  visited[w]=

59、1; </p><p>  printf("%s ",p->list[w].data);</p><p>  tail->m=w; /*w入隊(duì)列*/</p><p>  tail=tail->next=(Q *)malloc(sizeof(Q)); </p&

60、gt;<p>  tail->next=NULL; </p><p>  } /*if*/</p><p>  } /*for */</p><p>  } /*while*/</p><p>  } /*BFS*/</

61、p><p>  void BFSTraverse(AMLGraph *p,int n) </p><p>  { printf("\n\t\t\t"); /*廣度優(yōu)先遍歷*/</p><p><b>  int v;</b></p><p>

62、  for(v=1;v<=p->vexnum;v++) </p><p>  visited[v]=0; /*訪問標(biāo)志數(shù)組初始化*/ </p><p>  BFS(p,n); /*對起始頂點(diǎn)調(diào)用BFS*/ </p><p>  

63、for(v=1;v<=p->vexnum;v++) </p><p>  if(!visited[v]) BFS(p,v);</p><p>  printf("\n"); /*對未訪問頂點(diǎn)調(diào)用BFS*/</p><p><b>  }</b></p>

64、<p>  3、主程序和其他偽碼算法 void main (){顯示菜單;輸入功能選擇鍵;switch(flag){case 1:手動構(gòu)造一個圖;case 2:進(jìn)行深度優(yōu)先遍歷圖;case 3:進(jìn)行廣度優(yōu)先遍歷圖; case 4:退出程序;}算法代碼</p><p>  main() /*主函數(shù) */ &l

65、t;/p><p>  { int x,n; </p><p>  AMLGraph graph,*p; </p><p><b>  p=&graph;</b></p><p>  system("color 1f");</p><p>  printf(&qu

66、ot;\t\t\t****** 圖的深度和廣度優(yōu)先遍歷 *******\n");</p><p>  printf("\t\t\t* *\n");</p><p>  printf("\t\t\t****** ********\n"

67、);</p><p>  printf("\n");</p><p><b>  while(1)</b></p><p>  { printf("\n");</p><p>  printf("\t\t\t ~~~~~~~~ 功能菜單

68、 ~~~~~~~ \n");</p><p>  printf("\n");</p><p>  printf("\t\t\t*********************************************\n");</p><p>  printf("\t\t\t*

69、 1.創(chuàng)建圖 *\n");</p><p>  printf("\t\t\t* *\n");</p><p>  printf("\t\t\t* 2.深度優(yōu)先遍歷圖 *\n&q

70、uot;);</p><p>  printf("\t\t\t* *\n");</p><p>  printf("\t\t\t* 3.廣度優(yōu)先遍歷圖 *\n");</p><p>  prin

71、tf("\t\t\t* *\n");</p><p>  printf("\t\t\t* 4.退出系統(tǒng) *\n");</p><p>  printf("\t\t\t*

72、 *\n");</p><p>  printf("\t\t\t*********************************************\n");</p><p>  printf("\n\t\t\t請輸入選擇的功能編號(1-4):"); </p>&l

73、t;p>  scanf("%d",&n);</p><p>  if(n<0 || n>4)</p><p><b>  {</b></p><p>  printf("\n\n\t\t\t你輸入的功能號錯誤,請重新輸入,按Enter鍵繼續(xù)??!");</p><

74、;p>  getchar();</p><p>  getchar();</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  switch(n)</b></p><p><

75、;b>  {</b></p><p>  case 1: system("color 3f");</p><p>  CreateGraph(p);break;</p><p>  case 2: { system("color 79");</p><p>  printf(&

76、quot;\n\t\t\t請輸入起始遍歷結(jié)點(diǎn):");</p><p>  scanf("%d",&x); </p><p>  printf("\n\t\t\t深度優(yōu)先遍歷結(jié)果為:"); </p><p>  printf("\n");</p><p>  DF

77、STraverse(p,x);</p><p>  printf("\n");</p><p><b>  } break;</b></p><p>  case 3: { system("color 2E");</p><p>  printf("\n\t\t\t請

78、輸入起始遍歷結(jié)點(diǎn):");</p><p>  scanf("%d",&x); </p><p>  printf("\n\t\t\t廣度優(yōu)先遍歷結(jié)果為:"); </p><p>  printf("\n");</p><p>  BFSTraverse(p,x);&

79、lt;/p><p>  printf("\n"); </p><p><b>  } break;</b></p><p>  case 4: printf("\n\n\t\t\t謝謝你的使用!\n\n\n");</p><p><b>  exit(0);</b

80、></p><p>  }/*switch */ </p><p>  } /*while */</p><p>  } /*main */</p><p>  第四章、調(diào)試分析1、本程序以鄰接多重表為存儲結(jié)構(gòu)。這個程序涉及到圖的生成和圖的深度以及廣度遍歷,文件的保存和讀取,還有棧和隊(duì)列的操

81、作,另外還有森林的生成和打印,路徑的尋找。2、本程序不僅可以進(jìn)行連通無向圖的遍歷,還可以進(jìn)行非連通圖的遍歷。為了方便顯示和理解,現(xiàn)在暫且用一個大寫字母表示一個頂點(diǎn)。邊還可以附加信息,但為了方便操作,暫且不輸入信息。已經(jīng)先把圖的相關(guān)信息保存在了文本文檔里,所以要測試時(shí)直接從文件導(dǎo)入,可以減少用手輸入的麻煩,同時(shí)也可以減少輸入的錯誤。3、由于構(gòu)造圖時(shí),后輸入的邊是插在先輸入的邊的前面。所以在輸入邊時(shí),可以按字母從大到小的順序輸入。那么顯

82、示圖的時(shí)候就可以按字母從小到大的順序顯示。4、程序定義了一個二倍頂點(diǎn)長的數(shù)組存放輸入的邊,以便程序可以把它保存到文件里。故耗費(fèi)了一定的內(nèi)存空間。 第五章、用戶手冊1、本程序的運(yùn)行環(huán)境DOS操作系統(tǒng),GTraverse.exe2、進(jìn)入演示程序后即顯示一個有功能選擇的界面,如下:3、選擇操作1:程序就提示分別輸入無向圖的頂點(diǎn)數(shù),邊數(shù),邊的信息,頂點(diǎn)和邊的值:輸入完成后</p

83、><p>  5、選擇操作3:系統(tǒng)提示輸入遍歷圖的起始點(diǎn),程序運(yùn)行后,首先顯示廣度優(yōu)先遍歷的訪問結(jié)點(diǎn)序列。</p><p>  6、選擇操作4:退出程序。</p><p>  第六章、測試結(jié)果1、數(shù)據(jù)可以任意輸入,但是頂點(diǎn)數(shù)不要太多,不然占用太多內(nèi)存,會導(dǎo)致死機(jī)。2、遍歷一個連通的無向圖,如遍歷以下這個連通無向圖:</p><p>  1)

84、選擇操作1,分別進(jìn)行以下操作:</p><p>  請輸入圖的結(jié)點(diǎn)個數(shù)和邊的個數(shù):4,5</p><p>  請輸入結(jié)點(diǎn)1的名稱:A </p><p>  請輸入結(jié)點(diǎn)2的名稱:B</p><p>  請輸入結(jié)點(diǎn)3的名稱:C</p><p>  請輸入結(jié)點(diǎn)4的名稱:D</p><p>  請輸入互

85、相有關(guān)聯(lián)的兩個結(jié)點(diǎn):1,2</p><p>  請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):1,3</p><p>  請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):1,4</p><p>  請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):2,4</p><p>  請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):3,4</p><p>  2) 選擇操作2,輸出圖的信息如下:</p

86、><p>  請輸入起始遍歷結(jié)點(diǎn):1</p><p>  深度優(yōu)先遍歷結(jié)果為:A B D C</p><p>  3) 選擇操作3,輸出圖的信息如下:</p><p>  請輸入起始遍歷結(jié)點(diǎn):1</p><p>  廣度優(yōu)先遍歷結(jié)果為:A B C D</p><p>  第七章、心得體會這道題的完

87、成,花了一個星期時(shí)間,因?yàn)槲乙粋€多學(xué)期沒接觸C語言和數(shù)據(jù)結(jié)構(gòu)首先我把基本功能完成后來逐步地增加了許多功能。把本來只能遍歷連通圖的功能上,改進(jìn)為可以遍歷非連通圖。通過這道設(shè)計(jì)題,使我更深刻的理解數(shù)據(jù)結(jié)構(gòu)及其重要作用,對數(shù)據(jù)結(jié)構(gòu)有了一個新的認(rèn)識,深刻的認(rèn)識到數(shù)據(jù)結(jié)構(gòu)對于我們學(xué)習(xí)計(jì)算機(jī)的重要性和其深遠(yuǎn)但是意義.同時(shí),通過這次課程設(shè)計(jì),也加強(qiáng)我的動手能力和思維能力,可以將自己所學(xué)的知識用于實(shí)踐,這不僅對自己是一次鍛煉機(jī)會,而且讓自己有一種成就感

88、和自豪感,覺得自己終于可以做出一點(diǎn)有用的東西了。不過,我覺得自己編寫程序的一些思路算法和水平還非常有限。所以以后自己還得在C語言和其他語言上下苦功夫。</p><p><b>  附:源程序</b></p><p>  #include <stdio.h> </p><p>  #include <stdlib.h>

89、; </p><p>  #define MAX_VERTEX_NUM 30 /*無向圖最大頂點(diǎn)數(shù)*/ </p><p>  #define MAX_LEN 20 /*數(shù)據(jù)最大長度 */</p><p>  int visited[MAX_VERTEX_N

90、UM]; /*全局變量,訪問標(biāo)志數(shù)組 */ </p><p>  typedef struct EBox /*邊結(jié)點(diǎn)類型*/ </p><p>  { </p><p>  int mark;

91、 /*訪問標(biāo)記 */ </p><p>  int ivex,jvex; /*該邊依附的兩個頂點(diǎn)位置*/</p><p>  struct EBox *ilink,*jlink; /*分別指向依附這兩個頂點(diǎn)的下一條邊 */</p>

92、<p><b>  }EBox; </b></p><p>  typedef struct VexBox /*頂點(diǎn)結(jié)點(diǎn)類型*/ </p><p><b>  {</b></p><p>  char data[MAX_LEN]; </p

93、><p>  EBox *fistedge; /*指向第一條依附該頂點(diǎn)的邊*/ </p><p>  }VexBox; </p><p>  typedef struct</p><p><b>  { </b></p><p&g

94、t;  VexBox list[MAX_VERTEX_NUM]; </p><p>  int vexnum,edgenum; /*無向圖當(dāng)前頂點(diǎn)數(shù)和邊數(shù) */ </p><p>  }AMLGraph; </p><p>  void CreateGraph(AMLGraph *p)

95、 /*創(chuàng)建無向圖 */</p><p>  { </p><p>  int i,j,k; </p><p>  EBox *q; </p><p>  printf("\n\t\t\t請輸入圖的結(jié)點(diǎn)個數(shù)和邊的個數(shù):&qu

96、ot;); /*輸入圖的結(jié)點(diǎn)數(shù)和邊數(shù)*/</p><p>  scanf("%d,%d",&p->vexnum,&p->edgenum); </p><p>  for(i=1;i<=p->vexnum;i++) </p><p>  { printf("\n\t\t\t請輸入結(jié)點(diǎn)

97、%d的名稱:",i); /*輸入頂點(diǎn)數(shù)據(jù)信息*/</p><p>  scanf("%s",p->list[i].data); </p><p>  p->list[i].fistedge=NULL; /*初始化指針*/ </p><p><b>  

98、} </b></p><p>  for(k=0;k<p->edgenum;k++) /*輸入各邊并構(gòu)造多重鏈表*/ </p><p>  { printf("\n\t\t\t請輸入互相有關(guān)聯(lián)的兩個結(jié)點(diǎn):");</p><p>  scanf("%d,%d&quo

99、t;,&i,&j);</p><p>  q=(EBox *)malloc(sizeof(EBox));</p><p>  q->mark=0; /*對邊結(jié)點(diǎn)賦值*/</p><p>  q->ivex=i;</p><p>  q->

100、;ilink=p->list[i].fistedge;</p><p>  q->jvex=j;</p><p>  q->jlink=p->list[j].fistedge;</p><p>  p->list[i].fistedge=p->list[j].fistedge=q; /*完成邊在鏈頭的插入*/</

101、p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p>  void DFS(AMLGraph *p, int v) </p><p>  {

102、 /*對第v個頂點(diǎn)的深度優(yōu)先遍歷 */</p><p><b>  int w; </b></p><p>  EBox *q; </p><p>  visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p>

103、<p>  printf("%s ",p->list[v].data);</p><p>  for(q=p->list[v].fistedge;q!=NULL;) </p><p>  {if(q->ivex==v)</p><p>  {w=q->jvex; q=q->jlink;} <

104、;/p><p><b>  else </b></p><p>  {w=q->ivex; q=q->ilink;} </p><p>  if(!visited[w]) DFS(p,w); /*對尚未訪問的點(diǎn)調(diào)用DFS*/</p><p><b>  } </

105、b></p><p><b>  }</b></p><p>  void DFSTraverse(AMLGraph *p,int n) </p><p>  { /*深度優(yōu)先遍歷 */</p><p><b&g

106、t;  int v;</b></p><p>  printf("\n\t\t\t");</p><p>  for(v=1;v<=p->vexnum;v++) </p><p>  visited[v]=0; /*訪問標(biāo)志數(shù)組初始化*/ </p>

107、<p>  DFS(p,n); /*對起始頂點(diǎn)調(diào)用DFS*/ </p><p>  for(v=1;v<=p->vexnum;v++) </p><p>  if(!visited[v]) DFS(p,v); /*對尚未訪問的頂點(diǎn)調(diào)用DFS*/</p>

108、<p>  printf("\n"); </p><p><b>  } </b></p><p>  void BFS(AMLGraph *p,int v) </p><p>  { /

109、*對第v個頂點(diǎn)進(jìn)行廣度優(yōu)先遍歷*/ </p><p>  int u,w; </p><p>  EBox *x; </p><p>  typedef struct queue</p><p><b>  { </b></p><p><b>  int m; &

110、lt;/b></p><p>  struct queue *next; </p><p>  }Q; /*輔助隊(duì)列Q*/ </p><p>  Q *head,*tail,*q; </p><p>  head=tail=(Q *)mallo

111、c(sizeof(Q)); </p><p>  tail->next=NULL; </p><p>  visited[v]=1; /*標(biāo)記已訪問結(jié)點(diǎn) */</p><p>  printf("%s ",p->list[v].data);</p><

112、p>  tail->m=v; /*v入隊(duì)列 */ </p><p>  tail->next=(Q *)malloc(sizeof(Q)); </p><p>  tail=tail->next; </p><p>  tail->next=NULL; <

113、;/p><p>  while(head!=tail)</p><p><b>  { </b></p><p>  q=head; </p><p>  head=head->next; </p><p>  u=q->m;

114、 /*對頭元素出隊(duì)并置為u*/ </p><p>  free(q); </p><p>  for(x=p->list[u].fistedge;x!=NULL;) </p><p>  { if(x->ivex==u) {w=x->jvex;x=x->ilink;}</p><p&g

115、t;  else {w=x->ivex;x=x->jlink;} </p><p>  if(!visited[w])</p><p><b>  { </b></p><p>  visited[w]=1; </p><p>  printf("%s ",p->l

116、ist[w].data);</p><p>  tail->m=w; /*w入隊(duì)列*/</p><p>  tail=tail->next=(Q *)malloc(sizeof(Q)); </p><p>  tail->next=NULL; </p><p>

117、;  } /*if*/</p><p>  } /*for */</p><p>  } /*while*/</p><p>  } /*BFS*/</p><p>  void BFSTraverse(AMLGraph *p,int n) &l

118、t;/p><p>  { printf("\n\t\t\t"); /*廣度優(yōu)先遍歷*/</p><p><b>  int v;</b></p><p>  for(v=1;v<=p->vexnum;v++) </p><p&

119、gt;  visited[v]=0; /*訪問標(biāo)志數(shù)組初始化*/ </p><p>  BFS(p,n); /*對起始頂點(diǎn)調(diào)用BFS*/ </p><p>  for(v=1;v<=p->vexnum;v++) </p><

120、p>  if(!visited[v]) BFS(p,v);</p><p>  printf("\n"); /*對未訪問頂點(diǎn)調(diào)用BFS*/</p><p><b>  }</b></p><p>  main()

121、 /*主函數(shù) */ </p><p>  { int x,n; </p><p>  AMLGraph graph,*p; </p><p><b>  p=&graph;</b></p><p>  system("color 1f");</p><p&

122、gt;  printf("\t\t\t****** 圖的深度和廣度優(yōu)先遍歷 *******\n");</p><p>  printf("\t\t\t* *\n");</p><p>  printf("\t\t\t****** **

123、******\n");</p><p>  printf("\n");</p><p><b>  while(1)</b></p><p>  { printf("\n");</p><p>  printf("\t\t\t ~~~~~~~~

124、 功能菜單 ~~~~~~~ \n");</p><p>  printf("\n");</p><p>  printf("\t\t\t*********************************************\n");</p><p>  printf("\t\t\

125、t* 1.創(chuàng)建圖 *\n");</p><p>  printf("\t\t\t* *\n");</p><p>  printf("\t\t\t* 2.深度優(yōu)先遍歷圖

126、 *\n");</p><p>  printf("\t\t\t* *\n");</p><p>  printf("\t\t\t* 3.廣度優(yōu)先遍歷圖 *\n");</p>&

127、lt;p>  printf("\t\t\t* *\n");</p><p>  printf("\t\t\t* 4.退出系統(tǒng) *\n");</p><p>  printf("\t\t\t*

128、 *\n");</p><p>  printf("\t\t\t*********************************************\n");</p><p>  printf("\n\t\t\t請輸入選擇的功能編號(1-4):");

129、</p><p>  scanf("%d",&n);</p><p>  if(n<0 || n>4)</p><p><b>  {</b></p><p>  printf("\n\n\t\t\t你輸入的功能號錯誤,請重新輸入,按Enter鍵繼續(xù)??!");&

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論