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

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  圖的遍歷和生成樹求解</p><p>  摘要:圖是一種比線形表和樹更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。在圖形結(jié)構(gòu)中,節(jié)點(diǎn)之間的關(guān)系可以是任意的,圖中任意兩個(gè)數(shù)據(jù)元素之間都可能相關(guān)。本程序是采用鄰接矩陣、鄰接表結(jié)構(gòu)存儲(chǔ)來(lái)實(shí)現(xiàn)對(duì)圖的存儲(chǔ)。采用鄰接矩陣即為數(shù)組表示法,鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。對(duì)圖的遍歷分別采用了廣度優(yōu)先遍歷和深度優(yōu)先遍歷。圖的最小生成樹基于圖的兩種存儲(chǔ)結(jié)構(gòu),采用Prim算法和Kruskal

2、算法對(duì)圖的最小生成樹進(jìn)行求解。</p><p>  關(guān)鍵詞:圖;存儲(chǔ)結(jié)構(gòu);遍歷 ;最小生成樹</p><p><b>  目 錄</b></p><p>  1.設(shè)計(jì)背景………………………………………………………1</p><p>  1.1課程設(shè)計(jì)目的………………………………………………1</p>

3、<p>  1.2題目要求……………………………………………………1</p><p>  2.設(shè)計(jì)方案………………………………………………………1</p><p>  2.1設(shè)計(jì)方法……………………………………………………1</p><p>  2.2方法實(shí)現(xiàn)……………………………………………………2</p><p>  3. 方案

4、實(shí)施………………………………………………………3</p><p>  3.1采用的數(shù)據(jù)結(jié)構(gòu)說(shuō)明及類型的定義………………………3</p><p>  3.2函數(shù)功能描述及相關(guān)函數(shù)的實(shí)現(xiàn)…………………………5</p><p>  3.3程序中需說(shuō)明的地方,如用到的宏及代表的意義………16</p><p>  4. 結(jié)果與結(jié)論……………………………

5、…………………… 17</p><p>  4.1測(cè)試數(shù)據(jù)及測(cè)試結(jié)果………………………………………17</p><p>  4.2實(shí)驗(yàn)結(jié)論……………………………………………………19</p><p>  5.收獲與致謝…………………………………………………19</p><p>  6.參考文獻(xiàn)……………………………………………………20<

6、;/p><p><b>  設(shè)計(jì)背景</b></p><p><b>  1.1課程設(shè)計(jì)目的</b></p><p>  通過(guò)本課程設(shè)計(jì),加深對(duì)《面向?qū)ο蟪绦蛟O(shè)計(jì)C++》課程所學(xué)知識(shí)的理解,熟練掌握和鞏固C++語(yǔ)言的基本知識(shí)和語(yǔ)法規(guī)范,掌握使用面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言C++,或面向?qū)ο箝_發(fā)平臺(tái)Visual C++等,培養(yǎng)調(diào)查研究、

7、查閱技術(shù)文獻(xiàn)、資料、手冊(cè)以及編寫技術(shù)文獻(xiàn)的能力。學(xué)會(huì)編制結(jié)構(gòu)清晰、風(fēng)格良好的C++語(yǔ)言程序,從而具備利用計(jì)算機(jī)編程分析解決綜合性實(shí)際問(wèn)題的初步能力。</p><p><b>  1.2題目要求</b></p><p>  課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程. 通過(guò)課程設(shè)計(jì)

8、,鞏固和加深對(duì)隊(duì)列以及圖等理論知識(shí)的理解;掌握現(xiàn)實(shí)復(fù)雜問(wèn)題的分析建模和解決方法,掌握包括問(wèn)題描述、系統(tǒng)分析、設(shè)計(jì)建模、代碼實(shí)現(xiàn)、結(jié)果分析等的方法;提高利用計(jì)算機(jī)分析解決綜合性實(shí)際問(wèn)題的基本能力;鍛煉個(gè)人動(dòng)手能力,歷練自身素質(zhì)。</p><p><b>  2.設(shè)計(jì)方案</b></p><p><b>  2.1設(shè)計(jì)方法</b></p>

9、<p>  2.1.1問(wèn)題的分析和結(jié)構(gòu)的設(shè)計(jì)思路</p><p>  1) 圖的遍歷和生成樹求解所有功能:圖的生成、圖的遍歷、最小生成樹求解。</p><p>  2) 需要?jiǎng)?chuàng)建所有圖的存儲(chǔ)結(jié)構(gòu)(鄰接矩陣存儲(chǔ)結(jié)構(gòu)和鄰接表存儲(chǔ)結(jié)構(gòu))。</p><p>  3)程序設(shè)計(jì)的目的是通過(guò)屏幕上輸出的提示語(yǔ)句,進(jìn)行相應(yīng)的操作。</p><p&g

10、t;  4)選擇適當(dāng)?shù)乃惴?,?shí)現(xiàn)圖的遍歷和最小生成樹的求解等功能。</p><p>  5)選擇適當(dāng)?shù)淖兞?,?lái)表示圖相應(yīng)的頂點(diǎn)、邊、邊的權(quán)值等信息。</p><p>  6)當(dāng)輸入的信息出錯(cuò)時(shí),程序應(yīng)給錯(cuò)誤信息提示,使程序設(shè)計(jì)得全面周密。</p><p>  2.1.2圖的遍歷和生成樹求解的算法思想及設(shè)計(jì)</p><p>  1) 由于圖的存

11、儲(chǔ)結(jié)構(gòu)不同,故采用鄰接矩陣和鄰接表兩種存儲(chǔ)結(jié)構(gòu)建立圖。</p><p>  2)對(duì)圖的深度遍歷基于鄰接矩陣,廣度遍歷基于鄰接表。</p><p>  3)基于鄰接矩陣存儲(chǔ)結(jié)構(gòu),用prim算法求圖的最小生成樹。</p><p>  4)基于鄰接表存儲(chǔ)結(jié)構(gòu),用Kruskal算法求圖的最小生成樹。</p><p>  5)綜合1、2、3三點(diǎn)因素,可

12、以采用隊(duì)列來(lái)實(shí)現(xiàn)對(duì)圖的廣度優(yōu)先遍歷的算法,其示意圖如下:</p><p>  6)圖遍歷和生成樹求解的總體結(jié)構(gòu)框圖如下:</p><p><b>  2.2方法實(shí)現(xiàn)</b></p><p><b>  2.2.1創(chuàng)建結(jié)點(diǎn)</b></p><p>  1)建立隊(duì)列LinkQueue,以及隊(duì)頭指針fro

13、nt、隊(duì)尾指針rear。</p><p>  2)建立圖的存儲(chǔ)類型MGraph,以及頂點(diǎn)向量vexs[]。</p><p>  3)建立圖的鄰接矩陣AdjMatrix[][],以及邊的權(quán)值。</p><p>  4)建立圖的鄰接表ALGraph,以及鄰接表頭結(jié)點(diǎn)的類型AdjList[],弧的結(jié)點(diǎn)結(jié)構(gòu)類型ArcNode。</p><p><

14、;b>  2.2.2編寫函數(shù)</b></p><p>  建立具體的功能實(shí)現(xiàn)函數(shù),如初始化、錄入、輸出等。</p><p>  1.基于鄰接矩陣創(chuàng)建圖CreateUDN(MGraph &G,AdjMatrix &GA)</p><p>  2.基于鄰接表建立圖CreateALGraph(ALGraph &G) </p&

15、gt;<p>  3.鄰接矩陣的輸出Display(MGraph G,AdjMatrix GA)</p><p>  4.鄰接表的輸出DisplayG(ALGraph G) </p><p>  5.基于鄰接矩陣圖進(jìn)行深度優(yōu)先遍歷DFS1(MGraph G,int n,int v)</p><p>  6.對(duì)結(jié)點(diǎn)隊(duì)列初始化InitQueue (Link

16、Queue &Q) </p><p>  7.判斷隊(duì)列是否為空 QueueEmpty (LinkQueue Q)</p><p>  8.頂點(diǎn)信息入隊(duì)EnQueue (LinkQueue &Q,int e)</p><p>  9.頂點(diǎn)信息出隊(duì)DeQueue (LinkQueue &Q,int &e)</p><p

17、>  10.基于鄰接表對(duì)圖進(jìn)行廣度優(yōu)先遍歷BFS(ALGraph G,int v)</p><p>  11.Prim求生成樹MiniSpanTree_PRIM(MGraph G,AdjMatrix GA,VertexType u) </p><p>  12.Kruskal求生成樹Kruskal(ALGraph G)</p><p>  13. 求頂點(diǎn)在圖中

18、位置LocateVex(MGraph G,VertexType u),LocateVexG(ALGraph G,vertexType e)</p><p>  14.主函數(shù)main()</p><p><b>  3.方案實(shí)施</b></p><p>  3.1 采用的數(shù)據(jù)結(jié)構(gòu)說(shuō)明及類型的定義</p><p>  1.鄰

19、接矩陣的存儲(chǔ)表示如下</p><p>  typedef struct ArcCell</p><p><b>  {</b></p><p>  VRType adj; //VRType是頂點(diǎn)關(guān)系類型,對(duì)無(wú)權(quán)圖,用0和1;對(duì)有權(quán)圖,則為權(quán)值類型 </p><p>  InfoType *info; //該弧相關(guān)信

20、息的指針(可無(wú))</p><p>  }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];</p><p>  typedef struct </p><p><b>  {</b></p><p>  VertexType vexs[MAX_VERTEX_NUM];//

21、頂點(diǎn)向量</p><p>  AdjMatrix arcs;//鄰接矩陣</p><p>  int vexnum,arcnum;//圖的當(dāng)前頂點(diǎn)數(shù)和弧數(shù)</p><p>  GraphKind kind;//圖的種類標(biāo)志</p><p><b>  }MGraph;</b></p><p>  

22、2.鄰接表的存儲(chǔ)表示如下</p><p>  typedef struct ArcNode{ //弧的結(jié)點(diǎn)結(jié)構(gòu)類型</p><p>  int adjvex;//該弧所指向的頂點(diǎn)的位置</p><p>  int weight;/*該弧的權(quán)重*/</p><p>  struct ArcNode *nextarc;//指向下一條弧的指針&

23、lt;/p><p>  InfoType *info;//該弧相關(guān)信息的指針(可無(wú))</p><p><b>  }ArcNode;</b></p><p>  typedef struct VNode{//鄰接表頭結(jié)點(diǎn)的類型</p><p>  vertexType data;//頂點(diǎn)信息</p><

24、;p>  ArcNode *firstarc;//指向第一條依附該頂點(diǎn)的弧的指針</p><p>  }VNode,AdjList[MAX_VERTEX_NUM];</p><p>  typedef struct{//鄰接表</p><p>  AdjList vertices;</p><p>  int vexnum,arcnum

25、;//圖的當(dāng)前頂點(diǎn)數(shù)和弧數(shù)</p><p><b>  }ALGraph</b></p><p><b>  3.隊(duì)列的存儲(chǔ)結(jié)構(gòu)</b></p><p>  typedef struct QNode</p><p><b>  {</b></p><p>

26、;  TElemType data;</p><p>  QNode *next;</p><p>  }QNode,*QueuePtr;</p><p>  typedef struct</p><p><b>  {</b></p><p>  QueuePtr front;//隊(duì)頭指針<

27、;/p><p>  QueuePtr rear;//隊(duì)尾指針</p><p>  }LinkQueue;</p><p>  4.Prim算法輔助數(shù)組存儲(chǔ)結(jié)構(gòu)</p><p>  typedef struct //輔助數(shù)組存儲(chǔ)結(jié)構(gòu)</p><p><b>  {</b></p>&l

28、t;p>  VertexType adjvex;</p><p>  VRType lowcost;</p><p>  }Closedge[ MAX_VERTEX_NUM];</p><p>  3.2函數(shù)功能描述及相關(guān)函數(shù)的實(shí)現(xiàn)</p><p>  1.基于鄰接矩陣創(chuàng)建圖CreateUDN(MGraph &G,AdjMatr

29、ix &GA)</p><p>  Status CreateUDN(MGraph &G,AdjMatrix &GA)</p><p>  {//用鄰接矩陣表示法,構(gòu)造無(wú)向網(wǎng)G,以及表示出其鄰接矩陣GA</p><p>  int i,j,k,w;</p><p>  VertexType v1,v2;</p&g

30、t;<p>  printf("請(qǐng)輸入無(wú)向網(wǎng)G的頂點(diǎn)數(shù),邊數(shù):\n");</p><p>  scanf("%d,%d",&G.vexnum,&G.arcnum,);</p><p>  printf("請(qǐng)輸入%d個(gè)頂點(diǎn)的值:\n",G.vexnum);</p><p>  f

31、or(i=1;i<=G.vexnum;++i) </p><p>  scanf("%s",&G.vexs[i]); //構(gòu)造頂點(diǎn)向量</p><p>  getchar();</p><p>  for(i=1;i<=G.vexnum;i++)</p><p>  {for(j=1;j<=G.

32、vexnum;j++) //初始化鄰接矩陣</p><p><b>  {</b></p><p>  GA[i][j].adj=INFINITY;</p><p>  GA[i][j].info=NULL;</p><p><b>  }</b></p><p>&

33、lt;b>  }</b></p><p>  printf("請(qǐng)輸入%d條邊的頂點(diǎn)1頂點(diǎn)2和權(quán)值(以空格作為間隔):\n",G.arcnum);</p><p>  for(k=1;k<=G.arcnum;k++)</p><p><b>  {</b></p><p>  s

34、canf("%s%s%d",&v1,&v2,&w); //輸入一條邊依附的頂點(diǎn)和權(quán)值</p><p>  i=LocateVex(G,v1);</p><p>  j=LocateVex(G,v2); //確定v1和v2在G中的位置</p><p>  GA[i][j].adj=GA[j][i].adj=w; //弧&

35、lt;v1,v2>的權(quán)值 和<v2,v1>的對(duì)稱弧</p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  2.基于鄰接表建立圖CreateALGraph(ALGraph &G)</

36、p><p>  Status CreateALGraph(ALGraph &G)</p><p>  {//用鄰接表表示法,構(gòu)建無(wú)向網(wǎng)G</p><p>  int i,j,k,w;</p><p>  ArcNode *s,*p;</p><p>  printf("請(qǐng)輸入頂點(diǎn)數(shù)和邊數(shù)(輸入格式為:頂點(diǎn)

37、數(shù),邊數(shù)):\n");</p><p>  scanf("%d,%d",&(G.vexnum),&(G.arcnum)); </p><p>  vertexType v1,v2;</p><p>  printf("請(qǐng)輸入頂點(diǎn)信息:\n");</p><p>  for (

38、i=1;i<=G.vexnum;i++) </p><p><b>  {</b></p><p>  scanf("\n%c",&(G.vertices[i].data)); //初始化鄰接表的頭結(jié)點(diǎn)</p><p>  G.vertices[i].firstarc=NULL; </p><

39、;p><b>  }</b></p><p>  printf("請(qǐng)輸入邊的信息(輸入格式為:v1,v2,w):\n");</p><p>  for (k=1;k<=G.arcnum;k++)</p><p><b>  {</b></p><p>  scanf(

40、"\n%c,%c,%d",&v1,&v2,&w); //輸入一條邊依附的頂點(diǎn)和權(quán)值</p><p>  j= LocateVexG(G,v2);</p><p>  i= LocateVexG(G,v1); //確定v1和v2在G中的位置</p><p>  s=(ArcNode*)malloc(sizeof(ArcNod

41、e)); </p><p>  s->adjvex=j;</p><p>  s->weight=w;</p><p>  s->nextarc=G.vertices[i].firstarc; </p><p>  G.vertices[i].firstarc=s;//將下標(biāo)為j的結(jié)點(diǎn)連接在下標(biāo)為i的結(jié)點(diǎn)后面</p&g

42、t;<p>  p=(ArcNode*)malloc(sizeof(ArcNode));</p><p>  p->adjvex=i;</p><p>  p->weight=w;</p><p>  p->nextarc=G.vertices[j].firstarc;</p><p>  G.vertices

43、[j].firstarc=p; //將下標(biāo)為i的結(jié)點(diǎn)連接在下標(biāo)為j的結(jié)點(diǎn)后面</p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  3.鄰接矩陣的輸出Display(MGraph G,AdjMatrix GA)&

44、lt;/p><p>  void Display(MGraph G,AdjMatrix GA)</p><p>  { //鄰接矩陣的輸出</p><p><b>  int i,j;</b></p><p>  for(i=1;i<=G.vexnum;i++) </p><p&

45、gt;  printf("G.vexs[%d]=%c\n",i,G.vexs[i]); //輸出頂點(diǎn)向量</p><p>  printf("鄰接矩陣GA.adj:\n"); </p><p>  for(i=1;i<=G.vexnum;i++)</p><p><b>  

46、{</b></p><p>  for(j=1;j<=G.vexnum;j++)</p><p>  printf("%5d",GA[i][j].adj);</p><p>  printf("\n");</p><p><b>  } </b></p>

47、;<p>  } </p><p>  4.鄰接表的輸出DisplayG(ALGraph G) </p><p>  void DisplayG(ALGraph G) </p><p><b>  {//鄰接表的輸出</b>

48、</p><p><b>  int i;</b></p><p>  ArcNode *p;</p><p>  for(i=1; i<=G.vexnum; i++)</p><p><b>  {</b></p><p>  p=G.vertices[i].firs

49、tarc;</p><p>  printf("(%d | %c)-> ",i,G.vertices[i].data);</p><p><b>  while(p)</b></p><p><b>  {</b></p><p>  if(p->nextarc)&l

50、t;/p><p>  printf("[%d,%c,%d]->",p->adjvex,G.vertices[p->adjvex].data,p->weight);</p><p><b>  else</b></p><p>  printf("[%d,%c,%d]->/\\",

51、p->adjvex,G.vertices[p->adjvex].data,p->weight);</p><p>  p=p->nextarc;</p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }&l

52、t;/b></p><p><b>  }</b></p><p>  5.基于鄰接矩陣圖進(jìn)行深度優(yōu)先遍歷DFS1(MGraph G,int n,int v)</p><p>  int visited[MAX_VERTEX_NUM]; //初始化標(biāo)志數(shù)組</p><p>  Status DFS1(MGraph

53、 G,int n,int v)</p><p>  {//基于鄰接矩陣,對(duì)圖G進(jìn)行深度優(yōu)先搜索</p><p><b>  int j;</b></p><p>  AdjMatrix A;</p><p>  printf("%3d",v);</p><p>  printf

54、("%c",G.vexs[v]);</p><p>  visited[v]=1;</p><p>  for(j=1;j<=n;j++)</p><p>  if(A[v][j].adj!=0&&!visited[j])</p><p>  DFS1(G,n,j);</p><p

55、>  return OK;</p><p><b>  }</b></p><p>  6.對(duì)結(jié)點(diǎn)隊(duì)列初始化InitQueue (LinkQueue &Q) </p><p>  Status InitQueue (LinkQueue &Q)</p><p>  {//建立一個(gè)空隊(duì)列</p&g

56、t;<p>  Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));</p><p>  if(!Q.front) return ERROR;</p><p>  Q.front->next=NULL;</p><p>  return OK;</p><p><b> 

57、 }</b></p><p>  7.判斷隊(duì)列是否為空 QueueEmpty (LinkQueue Q)</p><p>  int QueueEmpty (LinkQueue Q)</p><p>  {//判斷隊(duì)列是否為空</p><p>  if(Q.front==Q.rear)</p><p>&l

58、t;b>  return 1;</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  8.頂點(diǎn)信息入隊(duì)EnQueue (LinkQueue &Q,int e)</p><p>  Status EnQue

59、ue (LinkQueue &Q,int e)</p><p><b>  {//結(jié)點(diǎn)進(jìn)隊(duì)</b></p><p><b>  QNode *p;</b></p><p>  p=(QNode*)malloc(sizeof(QNode));</p><p>  if(!p) return E

60、RROR;</p><p>  p->data=e;</p><p>  p->next=NULL;</p><p>  Q.rear->next=p;</p><p><b>  Q.rear=p;</b></p><p>  return OK;</p><

61、;p><b>  }</b></p><p>  9.頂點(diǎn)信息出隊(duì)DeQueue (LinkQueue &Q,int &e)</p><p>  int DeQueue (LinkQueue &Q,int &e)</p><p><b>  {//結(jié)點(diǎn)出隊(duì)</b></p>

62、<p>  if(Q.front==Q.rear)</p><p>  printf("隊(duì)列為空!\n");</p><p><b>  QNode *p;</b></p><p>  p=(QNode*)malloc(sizeof(QNode));</p><p>  if(!p) re

63、turn ERROR;</p><p>  p=Q.front->next;</p><p>  e=p->data;</p><p>  Q.front->next=p->next;</p><p>  if(Q.rear==p)</p><p>  Q.rear=Q.front;</p

64、><p><b>  free(p);</b></p><p>  return OK;</p><p><b>  }</b></p><p>  10.基于鄰接表對(duì)圖進(jìn)行廣度優(yōu)先遍歷BFS(ALGraph G,int v)</p><p>  int visited1[MAX

65、_VERTEX_NUM];//初始化標(biāo)志數(shù)組</p><p>  Status BFS(ALGraph G,int v)</p><p>  {//基于鄰接表,對(duì)無(wú)向圖G進(jìn)行廣度優(yōu)先搜索</p><p><b>  int u, w;</b></p><p>  LinkQueue Q;</p><p

66、>  InitQueue(Q);</p><p>  if(!visited1[v])</p><p><b>  {</b></p><p>  visited1[v]=1;</p><p>  printf("%c\t",G.vertices[v].data);</p><

67、;p>  EnQueue(Q,v);</p><p>  while(!QueueEmpty(Q))</p><p><b>  {</b></p><p>  DeQueue(Q,u);</p><p>  for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))&l

68、t;/p><p>  if(!visited1[w])</p><p><b>  {</b></p><p>  visited1[w]=1;</p><p>  printf("%c\t",G.vertices[w].data);</p><p>  EnQueue(Q,w);

69、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><

70、;p>  11.Prim求生成樹MiniSpanTree_PRIM(MGraph G,AdjMatrix GA,VertexType u)</p><p>  Status MiniSpanTree_PRIM(MGraph G,AdjMatrix GA,VertexType u)</p><p>  {//用Prim算法從第u個(gè)頂點(diǎn)出發(fā)構(gòu)造網(wǎng)G的最小生成樹T,輸出T的各邊 </

71、p><p>  int k,j,i;</p><p>  Closedge closedge;</p><p>  k=LocateVex(G,u);</p><p>  for(j=1;j<=G.vexnum;j++)</p><p><b>  {</b></p><p&

72、gt;<b>  if(j!=k)</b></p><p><b>  {</b></p><p>  closedge[j].adjvex=u;</p><p>  closedge[j].lowcost=GA[k][j].adj;// 輔助數(shù)組初始化</p><p><b>  }&l

73、t;/b></p><p><b>  }</b></p><p>  closedge[j].adjvex = '\0';</p><p>  closedge[j].lowcost = 88;</p><p>  closedge[k].adjvex = u;</p><p&

74、gt;  closedge[k].lowcost=0;//初始U={u}</p><p>  printf("最小生成樹的各條邊為:\n");</p><p>  for(i=2;i<=G.vexnum;++i)</p><p>  {//選擇其余的G.vexnum-1個(gè)頂點(diǎn)</p><p>  k=minimum(

75、closedge); //求出T的下一個(gè)結(jié)點(diǎn);第k個(gè)頂點(diǎn)</p><p>  printf("%c--%c\n",closedge[k].adjvex,G.vexs[k]);//輸出生成樹的邊</p><p>  closedge[k].lowcost=0;//第k頂點(diǎn)并入U(xiǎn)集</p><p>  for(j=1;j<=G.vexnum;+

76、+j)</p><p>  if(GA[k][j].adj<closedge[j].lowcost)</p><p>  {//新頂點(diǎn)并入U(xiǎn)集后,重新選擇最小邊</p><p>  closedge[j].adjvex=G.vexs[k];</p><p>  closedge[j].lowcost=GA[k][j].adj;</

77、p><p><b>  }</b></p><p><b>  }</b></p><p>  return OK;</p><p><b>  }</b></p><p>  12.Kruskal求生成樹Kruskal(ALGraph G)</p&g

78、t;<p>  Status Kruskal(ALGraph G)</p><p><b>  {</b></p><p>  int i,j,min = INFINITY,k = 1;//min用于記錄最小權(quán)值,k表示當(dāng)前構(gòu)造的第幾條邊</p><p>  int set[MAX_VERTEX_NUM];//用于判斷兩個(gè)點(diǎn)是否在

79、同一集合里</p><p>  ArcNode *p,*q,*s;</p><p>  for(i = 1; i <= G.vexnum; ++i) set[i] = i;//初始化,將每個(gè)點(diǎn)自身作為一個(gè)集合</p><p>  while(k<G.vexnum&&k<=G.arcnum )</p><p>

80、<b>  {</b></p><p>  for(i = 1; i <= G.vexnum; ++i)</p><p><b>  {</b></p><p>  if(G.vertices[i].firstarc!=NULL)</p><p>  {//若第i+1個(gè)點(diǎn)沒有鄰邊,則下一循環(huán)&

81、lt;/p><p>  for(p=G.vertices[i].firstarc;p!=NULL;p=p->nextarc)//查找最小權(quán)值的邊</p><p>  if(p->weight < min)</p><p><b>  {</b></p><p>  min = p->weight;&l

82、t;/p><p><b>  q = p;</b></p><p><b>  j = i;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b&

83、gt;</p><p>  if(G.vertices[j].firstarc == q) </p><p>  G.vertices[j].firstarc = q->nextarc; //if-else用于刪除最小權(quán)值的邊</p><p><b>  else</b></p><p><b>  {

84、</b></p><p>  for(p = G.vertices[j].firstarc; p != q; p = p->nextarc) </p><p><b>  s = p;</b></p><p>  s->nextarc = q->nextarc;</p><p><b&

85、gt;  }</b></p><p>  if(set[j]!=set[q->adjvex])</p><p>  {//判斷兩點(diǎn)是否在同一集合,若不在,則輸出這條邊</p><p>  printf("(%c,%c) %d\n",G.vertices[j].data,G.vertices[q->adjvex].data,

86、q->weight);</p><p><b>  k++;</b></p><p>  /*int s2=set[j];*/</p><p>  for(i=1;i<=G.vexnum;i++)</p><p>  if(set[i]==set[j]/*s2*/)</p><p> 

87、 set[i]=set[q->adjvex];</p><p><b>  }</b></p><p>  min = INFINITY; //將min置為最大值</p><p><b>  }</b></p><p>  return OK;</p><p><

88、b>  }</b></p><p>  13.求頂點(diǎn)在圖中位置LocateVex(MGraph G,VertexType u),LocateVexG(ALGraph G,vertexType e)</p><p>  Status LocateVex(MGraph G,VertexType u)</p><p><b>  { int

89、i;</b></p><p>  for(i=1;i<=G.vexnum;++i)</p><p>  if(G.vexs[i]==u)</p><p><b>  return i;</b></p><p>  return -1;</p><p><b>  }&l

90、t;/b></p><p>  Status LocateVexG(ALGraph G,vertexType e)</p><p>  { for(int i=1;i<=G.vexnum;i++)</p><p><b>  {</b></p><p>  if(G.vertices[i].data==e)

91、</p><p>  return i;</p><p><b>  }</b></p><p>  return -1;</p><p><b>  }</b></p><p>  14.主函數(shù)main()</p><p>  int mai

92、n()</p><p>  { ALGraph A;</p><p><b>  MGraph G;</b></p><p>  AdjMatrix S;</p><p><b>  int n,v;</b></p><p>  VertexType u;</p&g

93、t;<p>  printf("用圖的鄰接矩陣存儲(chǔ)結(jié)構(gòu)建無(wú)向網(wǎng):\n");</p><p>  CreateUDN(G,S);</p><p>  printf("輸出鄰接矩陣:\n");</p><p>  Display(G,S);</p><p>  printf("用圖的

94、鄰接表存儲(chǔ)結(jié)構(gòu)建無(wú)向網(wǎng):\n");</p><p>  CreateALGraph(A);</p><p>  printf("輸出鄰接表:\n");</p><p>  DisplayG(A);printf("\n");</p><p>  printf("輸入圖的結(jié)點(diǎn)個(gè)數(shù)以及訪問(wèn)

95、的起始結(jié)點(diǎn)的位序(格式如:2,1):\n");</p><p>  scanf("%d,%d",&n,&v);</p><p>  printf("對(duì)圖進(jìn)行深度優(yōu)先遍歷(鄰接矩陣):\n");</p><p>  DFS1(G,n,v);</p><p>  printf(&q

96、uot;\n");</p><p>  printf("對(duì)圖進(jìn)行深度優(yōu)先遍歷(鄰接表):\n");</p><p>  DFS2(A,v);</p><p>  printf("\n");</p><p>  printf("對(duì)圖進(jìn)行廣度優(yōu)先遍歷(鄰接表):\n");<

97、;/p><p><b>  BFS(A,v);</b></p><p>  printf("\n");</p><p>  printf("利用PRIM算法求最小生成樹\n");</p><p>  u=G.vexs[1];</p><p>  MiniSpan

98、Tree_PRIM(G,S,u);</p><p>  printf("利用Kruskal算法求最小生成樹\n");</p><p>  Kruskal(A);</p><p>  printf("\n");</p><p>  return OK;</p><p><b&

99、gt;  }</b></p><p>  3.3 程序中需說(shuō)明的地方,如用到的宏及代表的意義</p><p>  #define OK 1</p><p>  #define ERROR 0</p><p>  #define INFINITY 88 //最大值(表示無(wú)窮大)</p><p>  #defi

100、ne MAX_VERTEX_NUM 20 //最大頂點(diǎn)個(gè)數(shù)</p><p>  #define MAX_INFO 20</p><p>  #define MAX_NAME 5</p><p>  typedef int Status; </p><p>  typedef char VertexType;</p><p&

101、gt;  typedef int VRType;</p><p>  typedef char vertexType;</p><p>  typedef char InfoType;</p><p>  typedef enum{DG,DN,UDG,UDN}GraphKind; //{有向圖,有向網(wǎng),無(wú)向圖,無(wú)向網(wǎng)}</p><p>  

102、typedef int TElemType;</p><p><b>  4. 結(jié)果與結(jié)論</b></p><p>  4.1測(cè)試數(shù)據(jù)及測(cè)試結(jié)果</p><p>  1.程序運(yùn)行開始界面:</p><p>  2.測(cè)試錄入頂點(diǎn)信息以及邊的信息,錄入數(shù)據(jù)及錄入結(jié)果如下:</p><p>  3.測(cè)試

103、輸出鄰接矩陣的函數(shù)</p><p>  4.測(cè)試基于鄰接表構(gòu)造圖函數(shù)</p><p>  5. 測(cè)試輸出鄰接表的函數(shù)</p><p>  6. 測(cè)試基于鄰接矩陣對(duì)圖進(jìn)行深度優(yōu)先遍歷的函數(shù)</p><p>  7.測(cè)試基于鄰接表對(duì)圖進(jìn)行廣度優(yōu)先遍歷的函數(shù)</p><p>  8.測(cè)試Prim算法求最小生成樹的函數(shù)<

104、/p><p>  9.測(cè)試Kruskal算法求最小生成樹的函數(shù)</p><p><b>  4.2實(shí)驗(yàn)結(jié)論</b></p><p>  通過(guò)以上程序演示的結(jié)果,其測(cè)試功能包含本次課程設(shè)計(jì)所要求的圖的主要功能,包括對(duì)圖的深度遍歷、廣度遍歷、Prim求最小生成樹、Kruskal求最小生成樹等功能。</p><p>  數(shù)據(jù)結(jié)構(gòu)的

105、構(gòu)造及初始化無(wú)誤,能夠滿足對(duì)圖的遍歷和最小生成樹求解的要求。</p><p>  錄入數(shù)據(jù)能夠驗(yàn)證其效果。</p><p>  鄰接矩陣的建立,結(jié)果中鄰接矩陣的輸出結(jié)果能驗(yàn)證其效果。</p><p>  鄰接表的建立,結(jié)果中鄰接表的輸出結(jié)果能驗(yàn)證其效果。。</p><p>  基于鄰接矩陣對(duì)圖的深度優(yōu)先遍歷,可以有預(yù)期的結(jié)果</p>

106、;<p>  基于鄰接表對(duì)圖的廣度優(yōu)先遍歷,可以有預(yù)期的結(jié)果。</p><p>  Prim算法求得最小生成樹,可以有預(yù)期的結(jié)果。</p><p>  Kruskal算法求得最小生成樹,可以有預(yù)期的結(jié)果。</p><p>  至此,本課程設(shè)計(jì)所提出的設(shè)計(jì)方法均得到有效的驗(yàn)證及證實(shí),各個(gè)功能均能完成其設(shè)計(jì)需要,各部分功能之間能夠相互協(xié)調(diào)印證,整個(gè)設(shè)計(jì)的結(jié)

107、果與預(yù)期相符。</p><p>  但是,還存在需要改進(jìn)的地方,課程要求是隨機(jī)生成一個(gè)無(wú)向連通圖,而此程序是先人為構(gòu)建一個(gè)無(wú)向連通圖,然后對(duì)圖進(jìn)行遍歷和生成樹求解。對(duì)于隨機(jī)生成無(wú)向連通圖,已有還不夠成熟的算法,由于時(shí)間有限,以后會(huì)對(duì)程序進(jìn)行改進(jìn),已完成題目的要求。</p><p><b>  收獲與致謝 </b></p><p>  本次實(shí)驗(yàn)主

108、要用到了數(shù)據(jù)結(jié)構(gòu)中圖以及隊(duì)列的相關(guān)知識(shí),使我對(duì)數(shù)據(jù)結(jié)構(gòu)這門課程有了更加深入的學(xué)習(xí)和運(yùn)用,另外,在運(yùn)用數(shù)據(jù)結(jié)構(gòu)解決實(shí)際問(wèn)題的編程能力方面有了很大的提高,對(duì)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)算法思想有了更深層次的理解,對(duì)于C語(yǔ)言程序設(shè)計(jì)的運(yùn)用有了進(jìn)一步第的鞏固和提高。在對(duì)于編寫程序的上下連貫性有了進(jìn)一步的提高。與此同時(shí),編寫程序會(huì)出現(xiàn)很多錯(cuò)誤,對(duì)于調(diào)試程序,也使我進(jìn)一步了解了算法,培養(yǎng)了編程思想。</p><p>  本次實(shí)驗(yàn)中,由于

109、變量及相關(guān)的功能函數(shù)比較多,需要全面考慮問(wèn)題,使我對(duì)問(wèn)題的分析能力有了很大的幫助,通過(guò)對(duì)程序的編程和測(cè)試,使我對(duì)于程序設(shè)計(jì)的周全思維提高很多。</p><p>  誠(chéng)然,我的多方面的提高,離不開老師的幫助,在此,我真誠(chéng)地向指導(dǎo)教師閆老師表示真心的感謝!</p><p><b>  6. 參考文獻(xiàn)</b></p><p>  [1] 嚴(yán)蔚敏,吳偉

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論