

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 二 ○ 一○ 屆 課 程 設(shè) 計 論 文</p><p><b> 《算法與數(shù)據(jù)結(jié)構(gòu)》</b></p><p><b> 二〇一〇年六月</b></p><p><b> 目錄</b></p><p> 一、引言 …………………………………………
2、</p><p> 二、設(shè)計目的與任務(wù)………………………………</p><p><b> 1·課程設(shè)計的目的</b></p><p><b> 2·課程設(shè)計的任務(wù)</b></p><p> 三、設(shè)計方案………………………………………</p><p>
3、;<b> 1·需求分析</b></p><p><b> 2·概要設(shè)計</b></p><p><b> 3·詳細(xì)設(shè)計</b></p><p><b> 4·程序清單</b></p><p> 四、調(diào)試分
4、析………………………………………</p><p> 五、測試結(jié)果………………………………………</p><p> 六、附錄……………………………………………</p><p> 七、工作環(huán)境………………………………………</p><p> 八、參考文獻……………………………</p><p> 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)
5、計</p><p><b> ——最小生成樹問題</b></p><p><b> 一、引言</b></p><p> 《數(shù)據(jù)結(jié)構(gòu)》是計算機科學(xué)與技術(shù)專業(yè)和信息系統(tǒng)專業(yè)的必修課之一,是一門綜合的專業(yè)技術(shù)課。本課程較系統(tǒng)的介紹了軟件開發(fā)過程中常用的數(shù)據(jù)結(jié)構(gòu)及相應(yīng)的實現(xiàn)算法。如線性表、棧、隊列、樹和二叉樹,圖、檢索和排列
6、等,并對性能進行分析和比較,內(nèi)容非常豐富。</p><p> 本課程設(shè)計我們要解決的是最小生成樹問題。要用到圖的相關(guān)數(shù)據(jù)結(jié)構(gòu)和最小生成樹的克魯斯卡爾算法,以及存儲圖的邊和點的鄰接矩陣。</p><p> 本課程設(shè)計要解決的問題是構(gòu)造連通圖的最小生成樹我們首先要做的是都造一個鄰接表,用以存儲圖,然后我們要想好怎樣利用克魯斯卡爾算法構(gòu)造最小生成樹,把這個算法寫入主程序,調(diào)試好程序,最后完成
7、報告。</p><p><b> 二、設(shè)計目的與任務(wù)</b></p><p><b> 1·課程設(shè)計的目的</b></p><p> 本課程設(shè)計是為了了解并掌握數(shù)據(jù)結(jié)構(gòu)及算法的設(shè)計方法,具備初步的獨立分析和設(shè)計能力;初步掌握軟件開發(fā)過程的相關(guān)步驟;提高運用所學(xué)理論知識獨立分析和解決問題的能力;訓(xùn)練用系統(tǒng)的觀
8、點和軟件開發(fā)的一般規(guī)范進行軟件開發(fā)。</p><p><b> 2·課程設(shè)計的任務(wù)</b></p><p> 問題描述:若要在n個城市之間建設(shè)通信網(wǎng)絡(luò),只需架設(shè)n—1條線路即可。如何以最低的經(jīng)濟代價建設(shè)這個通信網(wǎng),是一個最小生成樹的問題。</p><p><b> 三、設(shè)計方案</b></p>
9、<p><b> 1·需求分析</b></p><p> 利用克魯斯卡爾算法求最小生成樹;</p><p> 實現(xiàn)教科書6.5節(jié)中抽象數(shù)據(jù)類型MFSet。以此表示構(gòu)造生成樹過程中的連通分量。</p><p> 以文本形式輸出生成樹中各條邊以及它們的權(quán)值。</p><p><b>
10、 2·概要設(shè)計</b></p><p> 抽象數(shù)據(jù)類型(ADT)如下:</p><p> ADT GRAPH{</p><p> 數(shù)據(jù)對象V:V是具有相同特性的數(shù)據(jù)元素的集合,成為頂點集。</p><p><b> 數(shù)據(jù)關(guān)系R:</b></p><p><b&g
11、t; R={VR}</b></p><p> VR={<v,w>|v,w∈V且P(v,w),<v,w>表示從v到w的弧,</p><p> 謂詞P(v,w)定義了弧<v,w>的意義或信息</p><p><b> 基本操作P:</b></p><p> Creat
12、eGraph(&G,V,VR)</p><p> 初始條件:v是圖的頂點集,VR是圖中弧的集合。</p><p> 操作結(jié)果:按V和VR的定義構(gòu)造圖G。</p><p> DestroyGraph(&G)</p><p> 初始條件:圖G存在。</p><p> 操作結(jié)果:銷毀圖G </
13、p><p> LocateVex(G,u)</p><p> 初始條件:圖G存在,u和G中定點有相同特征。</p><p> 操作結(jié)果:若圖G中存在頂點u,則返回頂點在圖中的位置;否則返回其他信息。</p><p> GetVex(G,v)</p><p> 初始條件:圖G存在,v是G中某個頂點。</p&g
14、t;<p> 操作結(jié)果:返回v的值。</p><p> PutVex(&G,v,value)...</p><p> 初始條件:圖G存在。</p><p> 操作結(jié)果:對v賦值value。</p><p><b> }</b></p><p><b>
15、存儲結(jié)構(gòu)</b></p><p> typedef struct</p><p><b> {</b></p><p> int begin;</p><p><b> int end;</b></p><p> int weight;</p>
16、;<p><b> }edge;</b></p><p> typedef struct</p><p><b> {</b></p><p><b> int adj;</b></p><p> int weight;</p><p
17、> }AdjMatrix[MAX][MAX];</p><p> typedef struct</p><p><b> {</b></p><p> AdjMatrix arc;</p><p> int vexnum, arcnum;</p><p><b> }M
18、Graph;</b></p><p><b> 流程圖</b></p><p><b> 3·詳細(xì)設(shè)計</b></p><p> 在該函數(shù)中主要有6段代碼塊,分別是圖的構(gòu)建代碼,對權(quán)值排序的代碼,交換權(quán)值代碼,最小生成樹代碼,找尾代碼,主函數(shù)代碼。6段代碼分別實現(xiàn)不同的功能,共同滿足了課題所需要
19、實現(xiàn)的功能。</p><p><b> 主函數(shù)代碼</b></p><p> int main(void)//主函數(shù)</p><p><b> {</b></p><p> MGraph *G;</p><p> G = (MGraph*)malloc(sizeof
20、(MGraph));</p><p> if (G == NULL)</p><p><b> {</b></p><p> printf("memory allcation failed,goodbye");</p><p><b> exit(1);</b></
21、p><p><b> }</b></p><p> CreatGraph(G);</p><p> MiniSpanTree(G);</p><p> system("pause");</p><p><b> return 0;</b></p
22、><p><b> }</b></p><p><b> 圖的構(gòu)建代碼</b></p><p> void CreatGraph(MGraph *G)//構(gòu)件圖</p><p><b> {</b></p><p> int i, j,n, m;&
23、lt;/p><p> printf("請輸入邊數(shù)和頂點數(shù):");</p><p> scanf("%d %d",&G->arcnum,&G->vexnum);</p><p> for (i = 1; i <= G->vexnum; i++)//初始化圖</p><
24、p><b> {</b></p><p> for ( j = 1; j <= G->vexnum; j++)</p><p><b> {</b></p><p> G->arc[i][j].adj = G->arc[j][i].adj = 0;</p><p&g
25、t;<b> }</b></p><p><b> }</b></p><p> for ( i = 1; i <= G->arcnum; i++)//輸入邊和權(quán)值</p><p><b> {</b></p><p> printf("\n請輸
26、入有邊的2個頂點");</p><p> scanf("%d %d",&n,&m);</p><p> while(n < 0 || n > G->vexnum || m < 0 || n > G->vexnum)</p><p><b> {</b><
27、;/p><p> printf("輸入的數(shù)字不符合要求 請重新輸入:");</p><p> scanf("%d%d",&n,&m);</p><p><b> }</b></p><p> G->arc[n][m].adj = G->arc[m][
28、n].adj = 1;</p><p> getchar();</p><p> printf("\n請輸入%d與%d之間的權(quán)值:", n, m);</p><p> scanf("%d",&G->arc[n][m].weight);</p><p><b> }<
29、/b></p><p> printf("鄰接矩陣為:\n");</p><p> for ( i = 1; i <= G->vexnum; i++)</p><p><b> {</b></p><p> for ( j = 1; j <= G->vexnum;
30、 j++)</p><p><b> {</b></p><p> printf("%d ",G->arc[i][j].adj);</p><p><b> }</b></p><p> printf("\n");</p><
31、p><b> }</b></p><p><b> }</b></p><p><b> 對權(quán)值排序的代碼</b></p><p> void sort(edge edges[],MGraph *G)//對權(quán)值進行排序</p><p><b> {&l
32、t;/b></p><p><b> int i, j;</b></p><p> for ( i = 1; i < G->arcnum; i++)</p><p><b> {</b></p><p> for ( j = i + 1; j <= G->arc
33、num; j++)</p><p><b> {</b></p><p> if (edges[i].weight > edges[j].weight)</p><p><b> {</b></p><p> Swapn(edges, i, j);</p><p&g
34、t;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> printf("權(quán)排序之后的為:\n");</p><p> for (i = 1; i < G->arcnum;
35、i++)</p><p><b> {</b></p><p> printf("<< %d, %d >> %d\n", edges[i].begin, edges[i].end, edges[i].weight);</p><p><b> }</b></p&g
36、t;<p><b> }</b></p><p><b> 交換權(quán)值代碼</b></p><p> void Swapn(edge *edges,int i, int j)//交換權(quán)值 以及頭和尾</p><p><b> {</b></p><p>&l
37、t;b> int temp;</b></p><p> temp = edges[i].begin;</p><p> edges[i].begin = edges[j].begin;</p><p> edges[j].begin = temp;</p><p> temp = edges[i].end;<
38、/p><p> edges[i].end = edges[j].end;</p><p> edges[j].end = temp;</p><p> temp = edges[i].weight;</p><p> edges[i].weight = edges[j].weight;</p><p> edge
39、s[j].weight = temp;</p><p><b> }</b></p><p><b> 最小生成樹代碼</b></p><p> void MiniSpanTree(MGraph *G)//生成最小生成樹</p><p><b> {</b></p
40、><p> int i, j, n, m;</p><p> int k = 1;</p><p> int parent[M];</p><p> edge edges[M];</p><p> for ( i = 1; i < G->vexnum; i++)</p><p>
41、;<b> {</b></p><p> for (j = i + 1; j <= G->vexnum; j++)</p><p><b> {</b></p><p> if (G->arc[i][j].adj == 1)</p><p><b> {<
42、/b></p><p> edges[k].begin = i;</p><p> edges[k].end = j;</p><p> edges[k].weight = G->arc[i][j].weight;</p><p><b> k++;</b></p><p>&
43、lt;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> sort(edges, G);</p><p> for (i = 1; i <= G->arcnum; i++)</p>&l
44、t;p><b> {</b></p><p> parent[i] = 0;</p><p><b> }</b></p><p> printf("最小生成樹為:\n");</p><p> for (i = 1; i <= G->arcnum; i
45、++)//核心部分</p><p><b> {</b></p><p> n = Find(parent, edges[i].begin);</p><p> m = Find(parent, edges[i].end);</p><p> if (n != m)</p><p><
46、;b> {</b></p><p> parent[n] = m;</p><p> printf("<< %d, %d >> %d\n", edges[i].begin, edges[i].end, edges[i].weight);</p><p><b> }</b>
47、;</p><p><b> }</b></p><p><b> }</b></p><p><b> 6)找尾代碼</b></p><p> int Find(int *parent, int f)//找尾</p><p><b>
48、 {</b></p><p> while ( parent[f] > 0)</p><p><b> {</b></p><p> f = parent[f];</p><p><b> }</b></p><p><b> retu
49、rn f;</b></p><p><b> }</b></p><p><b> 4·程序清單</b></p><p> /*Name:最小生成樹kruskal算法</p><p> Author:Song Changzhi</p><p>
50、 Description:生成最小生成樹 </p><p> Date: 2010-06-15 20:07</p><p> Copyright:Song Changzhi</p><p><b> */</b></p><p> #include<stdio.h></p><p&
51、gt; #include<stdlib.h></p><p> #define M 20</p><p> #define MAX 20</p><p> typedef struct</p><p><b> {</b></p><p> int begin;</p
52、><p><b> int end;</b></p><p> int weight;</p><p><b> }edge;</b></p><p> typedef struct</p><p><b> {</b></p>&l
53、t;p><b> int adj;</b></p><p> int weight;</p><p> }AdjMatrix[MAX][MAX];</p><p> typedef struct</p><p><b> {</b></p><p> Adj
54、Matrix arc;</p><p> int vexnum, arcnum;</p><p><b> }MGraph;</b></p><p> void CreatGraph(MGraph *);//函數(shù)申明</p><p> void sort(edge* ,MGraph *);</p>
55、<p> void MiniSpanTree(MGraph *);</p><p> int Find(int *, int );</p><p> void Swapn(edge *, int, int);</p><p> void CreatGraph(MGraph *G)//構(gòu)件圖</p><p><b>
56、; {</b></p><p> int i, j,n, m;</p><p> printf("請輸入邊數(shù)和頂點數(shù):");</p><p> scanf("%d %d",&G->arcnum,&G->vexnum);</p><p> for (i =
57、 1; i <= G->vexnum; i++)//初始化圖</p><p><b> {</b></p><p> for ( j = 1; j <= G->vexnum; j++)</p><p><b> {</b></p><p> G->arc[i][
58、j].adj = G->arc[j][i].adj = 0;</p><p><b> }</b></p><p><b> }</b></p><p> for ( i = 1; i <= G->arcnum; i++)//輸入邊和權(quán)值</p><p><b>
59、 {</b></p><p> printf("\n請輸入有邊的2個頂點");</p><p> scanf("%d %d",&n,&m);</p><p> while(n < 0 || n > G->vexnum || m < 0 || n > G->v
60、exnum)</p><p><b> {</b></p><p> printf("輸入的數(shù)字不符合要求 請重新輸入:");</p><p> scanf("%d%d",&n,&m);</p><p><b> }</b></p
61、><p> G->arc[n][m].adj = G->arc[m][n].adj = 1;</p><p> getchar();</p><p> printf("\n請輸入%d與%d之間的權(quán)值:", n, m);</p><p> scanf("%d",&G->arc
62、[n][m].weight);</p><p><b> }</b></p><p> printf("鄰接矩陣為:\n");</p><p> for ( i = 1; i <= G->vexnum; i++)</p><p><b> {</b></
63、p><p> for ( j = 1; j <= G->vexnum; j++)</p><p><b> {</b></p><p> printf("%d ",G->arc[i][j].adj);</p><p><b> }</b></p>
64、<p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> void sort(edge edges[],MGraph *G)//對權(quán)值進行排序</p><p><b> {
65、</b></p><p><b> int i, j;</b></p><p> for ( i = 1; i < G->arcnum; i++)</p><p><b> {</b></p><p> for ( j = i + 1; j <= G->a
66、rcnum; j++)</p><p><b> {</b></p><p> if (edges[i].weight > edges[j].weight)</p><p><b> {</b></p><p> Swapn(edges, i, j);</p><p
67、><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> printf("權(quán)排序之后的為:\n");</p><p> for (i = 1; i < G->arcnum
68、; i++)</p><p><b> {</b></p><p> printf("<< %d, %d >> %d\n", edges[i].begin, edges[i].end, edges[i].weight);</p><p><b> }</b></p
69、><p><b> }</b></p><p> void Swapn(edge *edges,int i, int j)//交換權(quán)值 以及頭和尾</p><p><b> {</b></p><p><b> int temp;</b></p><p&
70、gt; temp = edges[i].begin;</p><p> edges[i].begin = edges[j].begin;</p><p> edges[j].begin = temp;</p><p> temp = edges[i].end;</p><p> edges[i].end = edges[j].end
71、;</p><p> edges[j].end = temp;</p><p> temp = edges[i].weight;</p><p> edges[i].weight = edges[j].weight;</p><p> edges[j].weight = temp;</p><p><b&
72、gt; }</b></p><p> void MiniSpanTree(MGraph *G)//生成最小生成樹</p><p><b> {</b></p><p> int i, j, n, m;</p><p> int k = 1;</p><p> int par
73、ent[M];</p><p> edge edges[M];</p><p> for ( i = 1; i < G->vexnum; i++)</p><p><b> {</b></p><p> for (j = i + 1; j <= G->vexnum; j++)</p&
74、gt;<p><b> {</b></p><p> if (G->arc[i][j].adj == 1)</p><p><b> {</b></p><p> edges[k].begin = i;</p><p> edges[k].end = j;</p&
75、gt;<p> edges[k].weight = G->arc[i][j].weight;</p><p><b> k++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
76、 }</b></p><p> sort(edges, G);</p><p> for (i = 1; i <= G->arcnum; i++)</p><p><b> {</b></p><p> parent[i] = 0;</p><p><b>
77、; }</b></p><p> printf("最小生成樹為:\n");</p><p> for (i = 1; i <= G->arcnum; i++)//核心部分</p><p><b> {</b></p><p> n = Find(parent, edg
78、es[i].begin);</p><p> m = Find(parent, edges[i].end);</p><p> if (n != m)</p><p><b> {</b></p><p> parent[n] = m;</p><p> printf("<
79、;< %d, %d >> %d\n", edges[i].begin, edges[i].end, edges[i].weight);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p&g
80、t;<p> int Find(int *parent, int f)//找尾</p><p><b> {</b></p><p> while ( parent[f] > 0)</p><p><b> {</b></p><p> f = parent[f];&l
81、t;/p><p><b> }</b></p><p><b> return f;</b></p><p><b> }</b></p><p> int main(void)//主函數(shù)</p><p><b> {</b>
82、</p><p> MGraph *G;</p><p> G = (MGraph*)malloc(sizeof(MGraph));</p><p> if (G == NULL)</p><p><b> {</b></p><p> printf("memory allca
83、tion failed,goodbye");</p><p><b> exit(1);</b></p><p><b> }</b></p><p> CreatGraph(G);</p><p> MiniSpanTree(G);</p><p> s
84、ystem("pause");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 四、調(diào)試分析</b></p><p> 終于,在老師的耐心指導(dǎo)和同學(xué)的幫助下,我的課設(shè)任務(wù)完成了。通
85、過這次課程設(shè)計中遇到的許多問題,我收獲頗多,下面就談一談我遇到的一個主要問題及相應(yīng)的產(chǎn)生原因。</p><p> 問題:頂點名的類型識別。</p><p> 現(xiàn)象:當(dāng)用字母表示頂點時,程序進入死循環(huán)。</p><p> 原因:頂點名稱與頂點數(shù)屬于同一數(shù)據(jù)類型即是int整形,當(dāng)出現(xiàn)類型沖突時,程序不能識別就會發(fā)生沖突。</p><p>&
86、lt;b> 五、測試結(jié)果</b></p><p> 當(dāng)運行程序時,進入每一步都會有相應(yīng)提示,這會對程序的使用者提供較大的便利。下面就是程序運行時的一些截圖。</p><p><b> 對給定的圖運行程序</b></p><p><b> 下面是給定的圖</b></p><p&g
87、t;<b> 運行程序</b></p><p><b> 輸入頂點數(shù)和邊數(shù)后</b></p><p><b> 輸入各邊及其權(quán)值后</b></p><p><b> 運行結(jié)果</b></p><p><b> 六、附錄</b>
88、;</p><p> 由于添加了如下兩段代碼:</p><p> printf("鄰接矩陣為:\n");</p><p> for ( i = 1; i <= G->vexnum; i++)</p><p><b> {</b></p><p> for
89、( j = 1; j <= G->vexnum; j++)</p><p><b> {</b></p><p> printf("%d ",G->arc[i][j].adj);</p><p><b> }</b></p><p> printf(&q
90、uot;\n");</p><p><b> }</b></p><p> printf("權(quán)排序之后的為:\n");</p><p> for (i = 1; i < G->arcnum; i++)</p><p><b> {</b></p
91、><p> printf("<< %d, %d >> %d\n", edges[i].begin, edges[i].end, edges[i].weight);</p><p><b> }</b></p><p><b> }</b></p><p&
92、gt; 程序又可以將圖的鄰接矩陣和排序后的權(quán)值列出來,多實現(xiàn)了兩個附加功能。這對于程序的使用者而言將能更直觀更方便的理解有圖到最小生成樹的運算過程,有利于對克魯斯卡爾算法的理解和掌握。</p><p><b> 七、工作環(huán)境</b></p><p> 編譯環(huán)境:Dev-C++4.9.9.2</p><p> 文檔書寫工具:Microso
93、ft Office Word2003</p><p> 硬件環(huán)境:Intel(R) Core(TM)2 Duo CPU</p><p> T5870 @2.00Hz</p><p><b> 2.00GB 內(nèi)存</b></p><p><b> 八、參考文獻</b></p>&
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(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ù)結(jié)構(gòu)課程設(shè)計-最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計java--最小生成樹
- 最小生成樹課程設(shè)計
- 最小生成樹課程設(shè)計
- 最小生成樹課程設(shè)計
- 最小生成樹求解課程設(shè)計報告
- 最小生成樹課程設(shè)計 (2)
- 普里姆算法生成最小生成樹課程設(shè)計
- 徐州工程學(xué)院數(shù)據(jù)結(jié)構(gòu)最小生成樹實驗文檔
- 數(shù)據(jù)結(jié)構(gòu),最小生成樹克魯斯卡爾算法的實現(xiàn)
- 課程設(shè)計---克魯斯卡爾算法求最小生成樹
- 4最小生成樹
- 4最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-- 圖的遍歷和生成樹求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-----最小套圈設(shè)計
評論
0/150
提交評論