版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷和生成樹求解
- 新數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷和生成樹求解實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-圖的遍歷和生成樹的求解實(shí)現(xiàn)說(shuō)明書
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-----圖的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-圖的遍歷和構(gòu)建
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---線索二叉樹的生成及其遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(圖的遍歷)
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--樹的遍歷,文件目錄結(jié)構(gòu)的顯示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——樹的遍歷文件目錄結(jié)構(gòu)的顯示
- 《圖的建立與遍歷》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-最小生成樹
- 圖的廣度優(yōu)先遍歷-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之二叉樹的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-最小生成樹問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉樹的建立和遍歷的演示
評(píng)論
0/150
提交評(píng)論