版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 圖的遍歷</b></p><p><b> 課 程 設(shè) 計</b></p><p><b> 課程設(shè)計任務(wù)書</b></p><p> 2010 ~2011 學年第1 學期</p><p> 學生姓名: 專業(yè)班級:</p
2、><p> 指導教師: 工作部門: </p><p><b> 一、課程設(shè)計題目 </b></p><p><b> 圖的遍歷</b></p><p> 二、課程設(shè)計內(nèi)容(含技術(shù)指標)</p><p> 1.顯示圖的鄰接矩陣, 圖的鄰接表, 深
3、度優(yōu)先遍歷, 廣度優(yōu)先遍歷, 最小生成樹PRIM算法, 最小生成樹KRUSCAL算法,圖的連通分量。</p><p> 2.當用戶選擇的功能錯誤時,系統(tǒng)會輸出相應(yīng)的提示。</p><p> 3.通過圖操作的實現(xiàn),把一些實際生活中的具體的事物抽象出來</p><p><b> 三、進度安排</b></p><p>
4、 1.初步完成總體設(shè)計,搭好框架;</p><p> 2.完成最低要求:兩種必須都要實現(xiàn),寫出畫圖的思路;</p><p> 3.進一步要求:畫出圖的結(jié)構(gòu),有興趣的同學可以進一步改進圖的效果。</p><p><b> 四、基本要求</b></p><p> 1.界面友好,函數(shù)功能要劃分好</p>
5、<p> 2.程序要加必要的注釋</p><p> 3.要提供程序測試方案</p><p><b> 目 錄</b></p><p> 一 概述 .............................................1</p><p> 1.問題描述 ……………………………………
6、…………………………………………………..1</p><p> 2.系統(tǒng)分析 ………………………………………………………………………………………..1</p><p> 3.課程設(shè)計(論文)進程安排 …………………………………………………………………..1</p><p> 二.總體設(shè)計方案...................................
7、...2</p><p> 1.整體設(shè)計思路...............................................................................................................................2</p><p> 2.算法的整體思路 ………………………………………………………………
8、……………….3</p><p> 3.工作內(nèi)容 ……………………………………………………………………………………….3</p><p> 三 詳細設(shè)計 ………………………………………………………4</p><p> 1.詳細設(shè)計思路及算法 …………………………………………………………………………..4</p><p> 2.程序流程
9、圖 ……………………………………………………………………………………11</p><p> 四 程序的調(diào)試與運行結(jié)果說明……………………………… 12</p><p> 1.運行結(jié)果 ………………………………………………………………………………………12</p><p> 五.課程設(shè)計總結(jié) ………………………………………………15</p><
10、;p> 參考文獻 …………………………………………………………16</p><p> 附錄A 原程序清單 ………………………………………………16</p><p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計成績評定表 …………………………………30</p><p><b> 一 概述</b></p><p><b>
11、1.問題描述</b></p><p><b> 函數(shù)功能要劃分好</b></p><p><b> 總體設(shè)計應(yīng)畫流程圖</b></p><p><b> 程序要加必要的注釋</b></p><p><b> 要提供程序測試方案</b>&
12、lt;/p><p><b> 2.系統(tǒng)分析</b></p><p> 掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計方法,具備初步的獨立分析和設(shè)計能力</p><p> 初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計、程序編碼、測試等基本方法和技能</p><p> 提高綜合運用所學的理論知識和方法獨立分析和解決問題的能力</p>
13、<p> 訓練用系統(tǒng)的觀點和軟件開發(fā)一般規(guī)范進行軟件開發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學的工作方法和作風</p><p> 3.課程設(shè)計(論文)進程安排</p><p><b> 二.總體設(shè)計方案</b></p><p><b> 1.整體設(shè)計思路</b></p><p><
14、b> 圖的鄰接矩陣:</b></p><p> 對于一個具有n個頂點的圖,可以使用n*n的矩陣(二維數(shù)組)來表示它們間的鄰接關(guān)系。</p><p><b> 圖的鄰接表:</b></p><p> 鄰接表由表頭結(jié)點和表結(jié)點兩部分組成,其中圖中每個頂點均對應(yīng)一個存儲在數(shù)組中的表頭結(jié)點。如這個表頭結(jié)點所對應(yīng)的頂點存在相鄰頂
15、點,則把相鄰頂點依次存放于表頭結(jié)點所指向的單向鏈表中。</p><p> 深度優(yōu)先遍歷的遞歸算法思想:</p><p> 假定以圖中某個頂點Vi為出發(fā)點,首先訪問出發(fā)點,然后選擇一個Vi的未訪問過的鄰接點Vj,以Vj為新的出發(fā)點繼續(xù)進行深度優(yōu)先搜索,直至圖中所有頂點都被訪問過。</p><p> 訪問結(jié)點V并標記結(jié)點V為已訪問;</p><
16、p> 查找結(jié)點V的第一個鄰接結(jié)點W;</p><p> 若結(jié)點W的臨界結(jié)點W存在,則繼續(xù)執(zhí)行,否則算法結(jié)束;</p><p> 若結(jié)點W尚未被訪問,則遞歸訪問結(jié)點W;</p><p> 查找結(jié)點V的W臨界結(jié)點的下一個臨界結(jié)點W ,轉(zhuǎn)到步驟(3)。 </p><p><b> 廣度優(yōu)先遍歷算法:</b>&l
17、t;/p><p> 從圖的某一頂點Vi出發(fā),訪問此頂點后,依次訪問Vi的各個未曾訪問過的鄰接點,然后分別從這些鄰接點出發(fā),直至圖中所有已有已被訪問的頂點的鄰接點都被訪問到。</p><p> 訪問初始結(jié)點V并標記結(jié)點V為已訪問;</p><p><b> 結(jié)點V入隊列;</b></p><p> 當隊列非空時則繼續(xù)執(zhí)
18、行,否則算法結(jié)束;</p><p> 出隊列取得隊頭結(jié)點U;</p><p> 查找結(jié)點U的第一個鄰接結(jié)點W;</p><p> 若結(jié)點U的鄰接結(jié)點W不存在,則轉(zhuǎn)到步驟(3),否則循環(huán)執(zhí)行下列步驟:</p><p> (6.1)若結(jié)點W尚未被訪問,則訪問結(jié)點W并標記結(jié)點W為已訪問;</p><p> ?。?.2
19、)結(jié)點W入隊;</p><p> ?。?.3)查找結(jié)點U的W鄰接結(jié)點的下一個鄰接結(jié)點W,轉(zhuǎn)到步驟(6)。</p><p><b> 普利姆算法思想:</b></p><p> 令集合U的初值為U={u0},集合T的初值為T={}。從所有結(jié)點u屬于U和結(jié)點v屬于V\U的帶權(quán)邊中選出具有最小權(quán)值的邊(u,v),將結(jié)點v加入集合U中,將邊(u,v
20、)加入集合T中。如此不斷反復,當U=V時,最小生成樹便構(gòu)造完畢。</p><p> 克魯斯卡爾算法思想:</p><p> 設(shè)無向連通帶權(quán)圖G=(V,E),其中V為結(jié)點的集合,E為邊的集合。設(shè)帶權(quán)圖G的最小生成樹T由結(jié)點集合和邊的集合構(gòu)成,其初值為T=(v,{}),即初始時最小生成樹T只由帶權(quán)圖G中的結(jié)點集合組成,各結(jié)點之間沒有一條邊。這樣,最小生成樹T中的各個結(jié)點各自構(gòu)成一個連通分量
21、。然后,按照邊的權(quán)值遞增的順序考察帶權(quán)圖G中邊集合E的各條邊,若被考察的邊的兩個結(jié)點屬于T的兩個不同的連通分量,則將此邊加入懂啊最小生成樹T中,同時,把兩個連通分量連接為一個連通分量;若被考察的邊的兩個結(jié)點屬于T的同一個連通分量,則將此邊舍去。如此下去,當T中的連通分量個數(shù)為1時,T中的該連通分量即為帶權(quán)圖G的一棵最小生成樹。</p><p><b> 連通分量:</b></p>
22、;<p> 非連通圖的每一個連通部分。</p><p><b> 2.算法的整體思路</b></p><p> 本系統(tǒng)能分別用鄰接矩陣存儲結(jié)構(gòu)和鄰接表存儲結(jié)構(gòu)構(gòu)造無向圖,然后在此無向圖中能實現(xiàn)深度優(yōu)先遍歷,廣度優(yōu)先遍歷,最小生成樹和連通分量的算法。</p><p><b> 3.工作內(nèi)容</b><
23、;/p><p> 1.顯示圖的鄰接矩陣, 圖的鄰接表, 深度優(yōu)先遍歷, 廣度優(yōu)先遍歷, 最小生成樹PRIM算法, 最小生成樹KRUSCAL算法,圖的連通分量。</p><p> 2.當用戶選擇的功能錯誤時,系統(tǒng)會輸出相應(yīng)的提示。</p><p> 3.通過圖操作的實現(xiàn),把一些實際生活中的具體的事物抽象出來。</p><p><b>
24、; 三 詳細設(shè)計</b></p><p> 1.詳細設(shè)計思路及算法</p><p><b> 圖1-1 無向圖</b></p><p> 1.程序中所用變量的定義:</p><p> #include <iostream></p><p> #include &
25、lt;malloc.h></p><p> using namespace std; </p><p> #define int_max 10000</p><p> #define inf 9999 </p><p> #define max 20</p><p> 2.鄰接矩陣的定義:</p&
26、gt;<p> typedef struct ArcCell</p><p><b> {</b></p><p><b> int adj;</b></p><p> char *info;</p><p> }ArcCell,AdjMatrix[20][20];</
27、p><p> typedef struct </p><p><b> {</b></p><p> char vexs[20];</p><p> AdjMatrix arcs;</p><p> int vexnum,arcnum;</p><p> }MGra
28、ph_L;</p><p> A 0 50 60 0 0 0 0</p><p> B 50 0 0 65 40 0 0</p><p> C 60 0 0 52 0 0 45</p><p> D 0 65 52 0 50 30 0</p><p&
29、gt; E 0 40 0 50 0 70 0</p><p> F 0 0 0 30 70 0 80</p><p> G 0 0 45 0 0 80 0</p><p><b> 圖1-2 鄰接矩陣</b></p><p><b> 3.鄰接表:&
30、lt;/b></p><p><b> 表1-1 鄰接表</b></p><p><b> 4.深度優(yōu)先遍歷:</b></p><p> void adjprint(algraph gra)</p><p><b> 5.廣度優(yōu)先遍歷:</b></p>
31、<p> void bfstra(algraph gra)</p><p> 6.最小生成樹PRIM算法:</p><p> 7.最小生成樹KRUSCAL算法:</p><p><b> 2.程序流程圖 </b></p><p> 四 程序的調(diào)試與運行結(jié)果說明</p><p&g
32、t;<b> ?。?運行結(jié)果</b></p><p> 圖2-1 輸入頂點數(shù)</p><p><b> 圖2-2 輸入權(quán)值</b></p><p><b> 無向圖創(chuàng)建成功</b></p><p><b> 圖2-3 菜單</b></p>
33、;<p><b> 圖2-4 鄰接矩陣</b></p><p><b> 圖2-5 鄰接表</b></p><p> 圖2-6 深廣度優(yōu)先遍歷</p><p> 圖2-7 最小生成樹</p><p><b> 圖2-8 連通分量</b></p>
34、;<p><b> 五.課程設(shè)計總結(jié)</b></p><p> 課程設(shè)計是把我們所學的理論知識進行系統(tǒng)的總結(jié)并應(yīng)用于實踐的良好機會,有利于加強我們用知識理論來分析實際問題的能力,進而加強了我們對知識認識的實踐度,鞏固了我們的理論知識,深化了對知識的認識,并為走向社會打下一個良好的基礎(chǔ)。</p><p> 對于我們學生來講,此次課程設(shè)計是為了讓我們訓
35、練自己的實際設(shè)計能力,通過設(shè)計實踐,去真正獲得此項目管理和團隊協(xié)作等方面的基本訓練和工作經(jīng)驗。通過課程設(shè)計的一系列訓練,我們能提高如何綜合運用所學知識解決實際問題的能力,以及獲得此項目管理和團隊協(xié)作等等眾多方面的具體經(jīng)驗,增強對相關(guān)課程具體內(nèi)容的理解和掌握能力,培養(yǎng)對整體課程知識綜合運用和融會貫通能力。</p><p> 通過這近一個星期的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實踐,我學到了很多東西。本次課程設(shè)計對我來說正是一個提高
36、自己能力的機會,我好好的抓住機會,努力做好每一步,完善每一步。自己的C語言知識和數(shù)據(jù)結(jié)構(gòu)知識得到了鞏固,編程能力也有了一定的提高。同時也學會了解決問題的方法。</p><p> 此次課程設(shè)計也讓我認識到必須培養(yǎng)嚴謹?shù)膽B(tài)度。自己在編程時經(jīng)常因為一些類似于“少了分號”的小錯誤而導致錯誤,不夠認真細致,這給自己帶來了許多麻煩。編程是一件十分嚴謹?shù)氖虑?,容不得馬虎。所以在今后自己一定要培養(yǎng)嚴謹?shù)膽B(tài)度。我想這不僅是對于程
37、序設(shè)計,做任何事都應(yīng)如此。</p><p> 在實踐過程中,我和組員分工合作,勇于提出問題,解決難題,在實踐中,我遇到了許多困難,但都一一克服了。最終我圓滿的完成此次課程設(shè)計,學到了很多東西。同時,程序還存在著一些缺陷,就是不能輸出原圖,存在一些局限性,不過我會繼續(xù)努力思考,完善程序,做到最好。</p><p> 此次試驗,老師對我的指導是至關(guān)重要的,在此我非常感謝老師,從她那我學到了
38、很多有關(guān)c語言的知識,為以后的學習打下了一定的基礎(chǔ)。</p><p> 總的來說,本次課程設(shè)計,不僅我的知識面有所提高,另外我的綜合素質(zhì)也有所提高,,比如說:團隊精神、提問能力、思考能力等等。這次課程設(shè)計為我以后更好的學習和使用c語言打下了基礎(chǔ)。</p><p><b> 參考文獻</b></p><p> [1]數(shù)據(jù)結(jié)構(gòu)—使用C語言(第
39、3版)朱戰(zhàn)立 編,西安交通大學出版社。</p><p> [2] Visual C++程序設(shè)計──基礎(chǔ)與實例分析.北京:清華大學出版社,2004</p><p><b> 附錄A 原程序清單</b></p><p> #include <iostream></p><p> #include <
40、malloc.h></p><p> using namespace std; </p><p> #define int_max 10000</p><p> #define inf 9999 </p><p> #define max 20</p><p> //…………………………………………鄰接
41、矩陣定義……………………</p><p> typedef struct ArcCell</p><p><b> {</b></p><p><b> int adj;</b></p><p> char *info;</p><p> }ArcCell,AdjM
42、atrix[20][20];</p><p> typedef struct </p><p><b> {</b></p><p> char vexs[20];</p><p> AdjMatrix arcs;</p><p> int vexnum,arcnum;</p>
43、;<p> }MGraph_L;</p><p> //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</p><p> int localvex(MGraph_L G,char v)//返回V的位置</p><p><b> {</b></
44、p><p><b> int i=0;</b></p><p> while(G.vexs[i]!=v)</p><p><b> {</b></p><p><b> ++i;</b></p><p><b> }</b>&
45、lt;/p><p><b> return i;</b></p><p><b> }</b></p><p> int creatMGraph_L(MGraph_L &G)//創(chuàng)建圖用鄰接矩陣表示</p><p><b> {</b></p><
46、;p> char v1,v2;</p><p> int i,j,w;</p><p> cout<<"…………創(chuàng)建無向圖…………"<<endl;<<"請輸入圖G頂點和弧的個數(shù):(4 6)不包括“()”"<<endl;</p><p> cin>>G.v
47、exnum>>G.arcnum;</p><p> for(i=0;i!=G.vexnum;++i)</p><p><b> {</b></p><p> cout<<"輸入頂點"<<i<<endl;</p><p> cin>>G
48、.vexs[i];</p><p><b> }</b></p><p> for(i=0;i!=G.vexnum;++i)</p><p> for(j=0;j!=G.vexnum;++j)</p><p><b> { </b></p><p> G.arcs[
49、i][j].adj=int_max;</p><p> G.arcs[i][j].info=NULL;</p><p><b> }</b></p><p> for(int k=0;k!=G.arcnum;++k)</p><p><b> { </b></p><p&
50、gt; cout<<"輸入一條邊依附的頂點和權(quán):(a b 3)不包括()"<<endl;</p><p> cin>>v1>>v2>>w;//輸入一條邊依附的兩點及權(quán)值</p><p> i=localvex(G,v1);//確定頂點V1和V2在圖中的位置</p><p> j=
51、localvex(G,v2);</p><p> G.arcs[i][j].adj=w;</p><p> G.arcs[j][i].adj=w;</p><p><b> }</b></p><p> cout<<"圖G鄰接矩陣創(chuàng)建成功!"<<endl;</p&
52、gt;<p> return G.vexnum;</p><p><b> }</b></p><p> void ljjzprint(MGraph_L G)</p><p><b> {</b></p><p><b> int i,j;</b><
53、;/p><p> for(i=0;i!=G.vexnum;++i)</p><p><b> {</b></p><p> for(j=0;j!=G.vexnum;++j)</p><p> cout<<G.arcs[i][j].adj<<" ";</p>&
54、lt;p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p><p> int visited[max];//訪問標記</p><p><b> int we;</b></p>
55、<p> typedef struct arcnode//弧結(jié)點</p><p><b> {</b></p><p> int adjvex;//該弧指向的頂點的位置</p><p> struct arcnode *nextarc;//弧尾相同的下一條弧</p><p> char *info;/
56、/該弧信息</p><p><b> }arcnode;</b></p><p> typedef struct vnode//鄰接鏈表頂點頭接點</p><p><b> {</b></p><p> char data;//結(jié)點信息</p><p> arcno
57、de *firstarc;//指向第一條依附該結(jié)點的弧的指針</p><p> }vnode,adjlist;</p><p> typedef struct//圖的定義</p><p><b> {</b></p><p> adjlist vertices[max];</p><p>
58、 int vexnum,arcnum;</p><p><b> int kind;</b></p><p><b> }algraph;</b></p><p> //…………………………………………隊列定義……………………</p><p> typedef struct qnode&l
59、t;/p><p><b> {</b></p><p><b> int data;</b></p><p> struct qnode *next;</p><p> }qnode,*queueptr;</p><p> typedef struct</p>
60、;<p><b> {</b></p><p> queueptr front;</p><p> queueptr rear;</p><p> }linkqueue;</p><p> //………………………………………………………………………</p><p> ty
61、pedef struct acr</p><p><b> {</b></p><p> int pre;//弧的一結(jié)點</p><p> int bak;//弧另一結(jié)點</p><p> int weight;//弧的權(quán)</p><p><b> }edg;</b>
62、;</p><p> int creatadj(algraph &gra,MGraph_L G)//用鄰接表存儲圖</p><p><b> {</b></p><p> int i=0,j=0;</p><p> arcnode *arc,*tem,*p;</p><p> f
63、or(i=0;i!=G.vexnum;++i)</p><p><b> {</b></p><p> gra.vertices[i].data=G.vexs[i];</p><p> gra.vertices[i].firstarc=NULL;</p><p><b> }</b><
64、/p><p> for(i=0;i!=G.vexnum;++i)</p><p><b> {</b></p><p> for(j=0;j!=G.vexnum;++j)</p><p><b> {</b></p><p> if(gra.vertices[i].fi
65、rstarc==NULL)</p><p><b> {</b></p><p> if(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)</p><p><b> {</b></p><p> arc=(arcnode *)malloc(siz
66、eof(arcnode));</p><p> arc->adjvex=j;</p><p> gra.vertices[i].firstarc=arc;</p><p> arc->nextarc=NULL;</p><p><b> p=arc;</b></p><p>&
67、lt;b> ++j;</b></p><p> while(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)</p><p><b> {</b></p><p> tem=(arcnode *)malloc(sizeof(arcnode));</p><
68、;p> tem->adjvex=j; </p><p> gra.vertices[i].firstarc=tem;</p><p> tem->nextarc=arc;</p><p><b> arc=tem;</b></p><p><b> ++j;</b>
69、</p><p><b> }</b></p><p><b> --j;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> else</b>
70、;</p><p><b> {</b></p><p> if(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)</p><p><b> {</b></p><p> arc=(arcnode *)malloc(sizeof(arcnode)
71、);</p><p> arc->adjvex=j;</p><p> p->nextarc=arc;</p><p> arc->nextarc=NULL;</p><p><b> p=arc;</b></p><p><b> }</b>&l
72、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> gra.vexnum=G.vexnum;</p><p> gra.arcnum=G.arcnum;</p&
73、gt;<p> /*for(i=0;i!=gra.vexnum;++i)</p><p><b> {</b></p><p> arcnode *p;</p><p> cout<<i<<" ";</p><p> p=gra.vertices[i].
74、firstarc;</p><p> while(p!=NULL)</p><p><b> {</b></p><p> cout<<p->adjvex;</p><p> p=p->nextarc;</p><p><b> }</b>&
75、lt;/p><p> cout<<endl;</p><p><b> }*/</b></p><p> cout<<"圖G鄰接表創(chuàng)建成功!"<<endl;</p><p><b> return 1;</b></p><
76、;p><b> }</b></p><p> void adjprint(algraph gra)</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=0;i!=gra.vexnum;++i)<
77、;/p><p><b> {</b></p><p> arcnode *p;</p><p> cout<<i<<" ";</p><p> p=gra.vertices[i].firstarc;</p><p> while(p!=NULL)&
78、lt;/p><p><b> {</b></p><p> cout<<p->adjvex;</p><p> p=p->nextarc;</p><p><b> }</b></p><p> cout<<endl;</p&g
79、t;<p><b> }</b></p><p><b> }</b></p><p> int firstadjvex(algraph gra,vnode v)//返回依附頂點V的第一個點</p><p> //即以V為尾的第一個結(jié)點</p><p><b> {
80、</b></p><p> if(v.firstarc!=NULL)</p><p> return v.firstarc->adjvex;</p><p><b> }</b></p><p> int nextadjvex(algraph gra,vnode v,int w)//返回依附頂點
81、V的相對于W的下一個頂點</p><p><b> {</b></p><p> arcnode *p;</p><p> p=v.firstarc;</p><p> while(p!=NULL&&p->adjvex!=w)</p><p><b> {
82、</b></p><p> p=p->nextarc;</p><p><b> }</b></p><p> if(p->adjvex==w&&p->nextarc!=NULL)</p><p><b> {</b></p>&l
83、t;p> p=p->nextarc;</p><p> return p->adjvex;</p><p><b> }</b></p><p> if(p->adjvex==w&&p->nextarc==NULL)</p><p> return -10;<
84、/p><p><b> }</b></p><p> int initqueue(linkqueue &q)//初始化隊列</p><p><b> {</b></p><p> q.rear=(queueptr)malloc(sizeof(qnode));</p><
85、;p> q.front=q.rear;</p><p> if(!q.front)</p><p><b> return 0;</b></p><p> q.front->next=NULL;</p><p><b> return 1;</b></p><
86、;p><b> }</b></p><p> int enqueue(linkqueue &q,int e)//入隊</p><p><b> {</b></p><p> queueptr p;</p><p> p=(queueptr)malloc(sizeof(qnod
87、e));</p><p><b> if(!p)</b></p><p><b> return 0;</b></p><p> p->data=e;</p><p> p->next=NULL;</p><p> q.rear->next=p;&
88、lt;/p><p><b> q.rear=p;</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> int dequeue(linkqueue &q,int &e)//出隊</p>
89、;<p><b> {</b></p><p> queueptr p;</p><p> if(q.front==q.rear)</p><p><b> return 0;</b></p><p> p=q.front->next;</p><p
90、> e=p->data;</p><p> q.front->next=p->next;</p><p> if(q.rear==p)</p><p> q.rear=q.front;</p><p><b> free(p);</b></p><p><b
91、> return 1;</b></p><p><b> }</b></p><p> int queueempty(linkqueue q)//判斷隊為空</p><p><b> {</b></p><p> if(q.front==q.rear)</p>
92、<p><b> return 1;</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> void bfstra(algraph gra)//廣度優(yōu)先遍歷</p><p><b>
93、 {</b></p><p><b> int i,e;</b></p><p> linkqueue q;</p><p> for(i=0;i!=gra.vexnum;++i)</p><p> visited[i]=0;</p><p> initqueue(q);&
94、lt;/p><p> for(i=0;i!=gra.vexnum;++i)</p><p> if(!visited[i])</p><p> { visited[i]=1;</p><p> cout<<gra.vertices[i].data;</p><p> enqueue(q,i);<
95、/p><p> while(!queueempty(q))</p><p><b> {</b></p><p> dequeue(q,e);</p><p> // cout<<" "<<e<<" ";</p><p&g
96、t; for(we=firstadjvex(gra,gra.vertices[e]);we>=0;we=nextadjvex(gra,gra.vertices[e],we))</p><p><b> {</b></p><p> if(!visited[we])</p><p><b> {</b><
97、/p><p> visited[we]=1;</p><p> cout<<gra.vertices[we].data;</p><p> enqueue(q,we);</p><p><b> }</b></p><p><b> }</b></p&
98、gt;<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> int dfs(algraph gra,int i);//聲明DFS</p><p> int dfstra(algraph
99、 gra)</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=0;i!=gra.vexnum;++i)</p><p><b> {</b></p><p> visited
100、[i]=0;</p><p><b> }</b></p><p> for(j=0;j!=gra.vexnum;++j)</p><p><b> {</b></p><p> if(visited[j]==0)</p><p> dfs(gra,j);</
101、p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> int dfs(algraph gra,int i)</p><p><b> {</b
102、></p><p> visited[i]=1;</p><p><b> int we1;</b></p><p> // cout<<i<<visited[i]<<endl;</p><p> cout<<gra.vertices[i].data;<
103、/p><p> // cout<<endl;</p><p> for(we=firstadjvex(gra,gra.vertices[i]);we>=0;we=nextadjvex(gra,gra.vertices[i],we))</p><p><b> {</b></p><p> // co
104、ut<<we<<visited[we]<<endl;</p><p><b> we1=we;</b></p><p> // cout<<nextadjvex(gra,gra.vertices[i],we)<<endl;</p><p> if(visited[we]==0)&
105、lt;/p><p> // cout<<</p><p> dfs(gra,we);//<<endl;</p><p> // cout<<i<<we1<<endl;</p><p><b> we=we1;</b></p><p>
106、; // cout<<nextadjvex(gra,gra.vertices[i],we)<<endl; </p><p><b> }</b></p><p> return 12;</p><p><b> }</b></p><p> int bfstra_
107、fen(algraph gra)//求連通分量</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=0;i!=gra.vexnum;++i)</p><p><b> {</b></p>
108、<p> visited[i]=0;</p><p><b> }</b></p><p> for(j=0;j!=gra.vexnum;++j)</p><p><b> {</b></p><p> if(visited[j]==0)</p><p>
109、<b> {</b></p><p> dfs(gra,j);</p><p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> return
110、 0;</b></p><p><b> }</b></p><p> typedef struct </p><p><b> {</b></p><p> int adjvex;</p><p> int lowcost;</p>&l
111、t;p> }closedge;</p><p> /*int minimum(closedge *p);</p><p> int minispantree(MGraph_L G,char u)</p><p><b> {</b></p><p> int k,j,i;</p><p
112、> closedge closedge_a[20];</p><p> k=localvex(G,u);</p><p> // cout<<k<<endl;</p><p> for(j=0;j!=G.vexnum;++j)</p><p><b> {</b></p>
113、;<p><b> if(j!=k)</b></p><p><b> { </b></p><p> closedge_a[j].adjvex=u;</p><p> closedge_a[j].lowcost=G.arcs[k][j].adj;</p><p><b&
114、gt; }</b></p><p> for(i=1;i!=G.vexnum;++i)</p><p><b> {</b></p><p> k=minimum(closedge_a);</p><p><b> cout<<k;</b></p>&
115、lt;p> cout<<closedge_a[k].adjvex<<" "<<G.vexs[k]<<endl;</p><p> closedge_a[k].lowcost=0;</p><p> for(j=0;j!=G.vexnum;++j)</p><p> if(G.arcs[
116、k][j].adj<closedge_a[j].lowcost)</p><p><b> { </b></p><p> closedge_a[j].adjvex=G.vexs[k];</p><p> closedge_a[j].lowcost=G.arcs[k][j].adj;</p><p><
117、b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p>
118、 int minimum(closedge *p)</p><p><b> {</b></p><p> int s=10000;</p><p> for(;p!=NULL;++p)</p><p><b> {</b></p><p> if(s>p-&
119、gt;lowcost)</p><p> s=p->lowcost;</p><p><b> }</b></p><p><b> return s;</b></p><p><b> }*/</b></p><p> int prim
120、(int g[][max],int n) //最小生成樹PRIM算法</p><p><b> {</b></p><p> int lowcost[max],prevex[max]; //LOWCOST[]存儲當前集合U分別到剩余結(jié)點的最短路徑</p><p> //prevex[]存儲最短路徑在U中的結(jié)點</p><
121、;p> int i,j,k,min; </p><p> for(i=2;i<=n;i++) //n個頂點,n-1條邊 </p><p><b> {</b></p><p> lowcost[i]=g[1][i]; //初始化 </p><p> prevex[i]=1; //頂點未加入到最小生成
122、樹中 </p><p><b> } </b></p><p> lowcost[1]=0; //標志頂點1加入U集合 </p><p> for(i=2;i<=n;i++) //形成n-1條邊的生成樹 </p><p><b> {</b></p><p>&
123、lt;b> min=inf; </b></p><p><b> k=0; </b></p><p> for(j=2;j<=n;j++) //尋找滿足邊的一個頂點在U,另一個頂點在V的最小邊 </p><p> if((lowcost[j]<min)&&(lowcost[j]!=0)) &
124、lt;/p><p><b> {</b></p><p> min=lowcost[j]; </p><p><b> k=j; </b></p><p><b> } </b></p><p> printf("(%d,%d)%d\t&
125、quot;,prevex[k]-1,k-1,min); </p><p> lowcost[k]=0; //頂點k加入U </p><p> for(j=2;j<=n;j++) //修改由頂點k到其他頂點邊的權(quán)值 </p><p> if(g[k][j]<lowcost[j]) </p><p><b> {&l
126、t;/b></p><p> lowcost[j]=g[k][j]; </p><p> prevex[j]=k; </p><p><b> } </b></p><p> printf("\n"); </p><p><b> } </b&
127、gt;</p><p><b> return 0;</b></p><p><b> } </b></p><p> int acrvisited[100];//kruscal弧標記數(shù)組</p><p> int find(int acrvisited[],int f)</p>
128、<p><b> {</b></p><p> while(acrvisited[f]>0)</p><p> f=acrvisited[f];</p><p><b> return f;</b></p><p><b> }</b></p
129、><p> void kruscal_arc(MGraph_L G,algraph gra)</p><p><b> { </b></p><p> edg edgs[20];</p><p> int i,j,k=0;</p><p> for(i=0;i!=G.vexnum;++i)&
130、lt;/p><p> for(j=i;j!=G.vexnum;++j)</p><p><b> {</b></p><p> if(G.arcs[i][j].adj!=10000)</p><p><b> {</b></p><p> edgs[k].pre=i;&
131、lt;/p><p> edgs[k].bak=j;</p><p> edgs[k].weight=G.arcs[i][j].adj;</p><p><b> ++k;</b></p><p><b> }</b></p><p><b> }</b&
132、gt;</p><p> int x,y,m,n;</p><p> int buf,edf;</p><p> for(i=0;i!=gra.arcnum;++i)</p><p> acrvisited[i]=0; </p><p> for(j=0;j!=G.arcnum;++j)</p>
133、<p><b> {</b></p><p><b> m=10000;</b></p><p> for(i=0;i!=G.arcnum;++i)</p><p><b> {</b></p><p> if(edgs[i].weight<m)&l
134、t;/p><p><b> {</b></p><p> m=edgs[i].weight;</p><p> x=edgs[i].pre;</p><p> y=edgs[i].bak;</p><p><b> n=i;</b></p><p&g
135、t;<b> }</b></p><p><b> }</b></p><p> // cout<<x<<y<<m;</p><p> // cout<<endl;</p><p> buf=find(acrvisited,x);<
136、/p><p> edf=find(acrvisited,y); </p><p> // cout<<buf<<" "<<edf<<endl;</p><p> edgs[n].weight=10000;</p><p> if(buf!=edf)</p>
137、<p><b> {</b></p><p> acrvisited[buf]=edf;</p><p> cout<<"("<<x<<","<<y<<")"<<m;</p><p> cou
138、t<<endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> { </b>
139、;</p><p> algraph gra;</p><p> MGraph_L G;</p><p> int i,d,g[20][20];</p><p> char a='a';</p><p> d=creatMGraph_L(G);</p><p> cr
140、eatadj(gra,G);</p><p><b> vnode v;</b></p><p> cout<<endl<<"……####注意:若該圖為非強連通圖(含有多個連通分量)時"<<endl</p><p> <<" 最小生成樹不存在,則顯示為
141、非法值。"<<endl<<endl;</p><p> cout<<"…………………菜單……………………"<<endl<<endl;</p><p> cout<<"0、顯示該圖的鄰接矩陣……………………"<<endl;</p><p
142、> cout<<"1、顯示該圖的鄰接表……………………"<<endl;</p><p> cout<<"2、深度優(yōu)先遍歷…………………………"<<endl;</p><p> cout<<"3、廣度優(yōu)先遍歷…………………………"<<endl;<
143、;/p><p> cout<<"4、最小生成樹PRIM算法…………………"<<endl;</p><p> cout<<"5、最小生成樹KRUSCAL算法………………"<<endl;</p><p> cout<<"6、該圖的連通分量………………………&q
144、uot;<<endl<<endl;</p><p><b> int s;</b></p><p> char y='y';</p><p> while(y='y')</p><p><b> {</b></p><
145、;p> cout<<"請選擇菜單:"<<endl;</p><p><b> cin>>s;</b></p><p><b> switch(s)</b></p><p><b> {</b></p><p>
146、;<b> case 0:</b></p><p> cout<<"鄰接矩陣顯示如下:"<<endl;</p><p> ljjzprint(G);</p><p><b> break;</b></p><p><b> case 1
147、:</b></p><p> cout<<"鄰接表顯示如下:"<<endl;</p><p> adjprint(gra);</p><p><b> break;</b></p><p><b> case 2:</b></p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖的遍歷課程設(shè)計
- 圖的遍歷課程設(shè)計
- 圖的遍歷實現(xiàn)課程設(shè)計--圖的遍歷的實現(xiàn)
- 課程設(shè)計論文-圖的遍歷
- 圖的廣度遍歷課程設(shè)計報告
- 圖遍歷的演示課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-----圖的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---圖的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告(圖的遍歷)
- 《圖的建立與遍歷》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)庫課程設(shè)計---圖的存儲與遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-圖的遍歷和構(gòu)建
- 圖的廣度優(yōu)先遍歷-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-- 圖的遍歷和生成樹求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---圖的遍歷和生成樹求解
- 遍歷二叉樹課程設(shè)計
- 新數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---圖的遍歷和生成樹求解實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-圖的遍歷和生成樹的求解實現(xiàn)說明書
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計
評論
0/150
提交評論