版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)總結(jié)報告</p><p> 設(shè)計(jì)題目:以鄰接鏈表的方式確定一個無向網(wǎng)</p><p><b> 學(xué)生姓名:</b></p><p><b> 學(xué) 院:</b></p><p><b> 專 業(yè):</b></p>
2、;<p><b> 班 級:</b></p><p><b> 學(xué) 號:</b></p><p><b> 指導(dǎo)教師:</b></p><p> 年 月 日</p><p><b> 一、設(shè)計(jì)題目</b>
3、</p><p> 題目3. 以鄰接鏈表的方式確定一個無向網(wǎng),完成:</p><p> ?、沤⒉@示出它的鄰接矩陣;</p><p> ⑵對該圖進(jìn)行廣度優(yōu)先遍歷,顯示遍歷的結(jié)果,(并隨時顯示隊(duì)列的入、出情況); </p><p> ?、怯闷绽锬匪惴?gòu)造其最小生成樹,隨時顯示其構(gòu)造的過程;</p><p> ?、扔?/p>
4、克魯斯卡爾算法構(gòu)造其最小生成樹,隨時顯示其構(gòu)造的過程;</p><p> 二、運(yùn)行環(huán)境(軟、硬件環(huán)境)</p><p><b> 硬件環(huán)境:</b></p><p> CPU:1000MHz以上</p><p> 內(nèi)存:256MB以上</p><p><b> 硬盤:60G以上
5、</b></p><p><b> 軟件環(huán)境:</b></p><p> 系統(tǒng)平臺:Windows 2000 / Windows XP / Windows Vista / Windows 7 </p><p> 運(yùn)行環(huán)境:TC 3.0 / Microsoft Visual C++ 6.0</p><p&g
6、t;<b> 三、算法設(shè)計(jì)的思想</b></p><p> 存儲結(jié)構(gòu):鄰接矩陣, 鄰接表。</p><p> 遍歷方式: 廣度優(yōu)先搜索(BFS) </p><p> 實(shí)現(xiàn)最小生成樹的方式:普里姆算法(Prime算法)和克魯斯卡爾算法(kruskai算法),具體實(shí)現(xiàn)見代碼。</p><p><b> 四
7、、算法的流程圖</b></p><p> 五、算法設(shè)計(jì)分析及截圖</p><p> ?。?)鄰接表的建立.</p><p> 鄰接鏈表的頭結(jié)點(diǎn)所使用的結(jié)構(gòu)體:</p><p> typedef struct node</p><p> { int adjvex;</p><p
8、> struct node *next;</p><p><b> }JD;</b></p><p> typedef struct tnode</p><p> { int vexdata;</p><p> struct node *firstarc;</p><p>&l
9、t;b> }TD;</b></p><p> 建立某無向圖的鄰接鏈表,所用函數(shù):int crt_linklist(TD g[],int a[][M]),其中調(diào)用函數(shù)</p><p> int loc_vertex(TD g[],int vex,int n):找出邊的頭尾結(jié)點(diǎn)。主要利用for循環(huán)實(shí)現(xiàn)頂點(diǎn)和邊的輸出,在確定邊的時候,將該邊的權(quán)值取地址給a[i-1][j-
10、1]和a[j-1][i-1]。</p><p><b> 測試結(jié)果:</b></p><p><b> 鄰接表的建立:</b></p><p><b> 鄰接矩陣的建立:</b></p><p><b> ?。?)廣度優(yōu)先遍歷</b></p&g
11、t;<p> 使用void traver(TD g[],int n)函數(shù)實(shí)現(xiàn),調(diào)用函數(shù)void bfs(TD g[],int v,int visited[]):利用隊(duì)列實(shí)現(xiàn)遍歷過程,并用for循環(huán)輸出每次入隊(duì)出隊(duì)情況。</p><p><b> 測試結(jié)果:</b></p><p> ?。?)最小生成樹的方式:普里姆算法(Prime算法)</p&
12、gt;<p> . 使用函數(shù): void minispantree_PRIM(int a[][M],int n),利用鄰接矩陣實(shí)現(xiàn)</p><p><b> 測試結(jié)果:</b></p><p><b> 2---4;</b></p><p><b> 1---2;</b><
13、/p><p><b> 3---4;</b></p><p> 最小生成樹的方式:克魯斯卡爾算法(kruskai算法)</p><p> 算法思想:設(shè)N=(V,{E})是連通網(wǎng),TE是N上最小生成樹中邊的集合</p><p> 初始令U={u0},(u0V), TE=</p><p> 在所
14、有uU,vV-U的邊(u,v)E中,找一條代價最小的邊(u0,v0)</p><p> 將(u0,v0)并入集合TE,同時v0并入U</p><p> 重復(fù)上述操作直至U=V為止,則T=(V,{TE})為N的最小生成樹</p><p> 算法實(shí)現(xiàn):圖用鄰接矩陣表示</p><p> 邊的表示方式:typedef struct</
15、p><p> { int vexh,vext;</p><p> int weight;</p><p><b> int flag;</b></p><p><b> }EDGE;</b></p><p><b> 測試結(jié)果:</b></
16、p><p><b> 六、源代碼 </b></p><p> #include <stdio.h></p><p> #include<alloc.h></p><p> #define M 10</p><p> #define MAX 100</p>
17、<p> typedef struct node</p><p> { int adjvex;</p><p> struct node *next;</p><p><b> }JD;</b></p><p> typedef struct tnode</p><p>
18、; { int vexdata;</p><p> struct node *firstarc;</p><p><b> }TD;</b></p><p> typedef struct</p><p> { int data;</p><p><b> int j
19、ihe;</b></p><p><b> }VEX;</b></p><p> typedef struct</p><p> { int vexh,vext;</p><p> int weight;</p><p><b> int flag;</b&
20、gt;</p><p><b> }EDGE;</b></p><p> void minitree_KRUSKAL(void)</p><p> { int n,i,m,min,k,j;</p><p><b> VEX t[M];</b></p><p>
21、EDGE e[M];</p><p> printf("Input number of vertex and edge:");</p><p> scanf("%d,%d",&n,&m);</p><p> for(i=1;i<=n;i++)</p><p> { p
22、rintf("t[%d].data=:",i);</p><p> scanf("%d",&t[i].data);</p><p> t[i].jihe=i;</p><p><b> }</b></p><p> for(i=0;i<m;i++)</p
23、><p> { printf("vexh,vext,weight:");</p><p> scanf("%d,%d,%d",&e[i].vexh,&e[i].vext,&e[i].weight);</p><p> e[i].flag=0;</p><p><b&g
24、t; }</b></p><p><b> i=1;</b></p><p> while(i<n)</p><p> { min=MAX;</p><p> for(j=0;j<m;j++)</p><p> { if(e[j].weight<mi
25、n && e[j].flag==0)</p><p> { min=e[j].weight;</p><p><b> k=j;</b></p><p><b> }</b></p><p><b> }</b></p><p&g
26、t; printf("%d,%d :%d\n",e[k].vexh,e[k].vext,e[k].weight);</p><p> if(t[e[k].vexh].jihe!=t[e[k].vext].jihe)</p><p> { e[k].flag=1;</p><p> for(j=1;j<=n;j++)</p
27、><p> if(t[j].jihe==t[e[k].vext].jihe)</p><p> t[j].jihe=t[e[k].vexh].jihe;</p><p> t[e[k].vext].jihe=t[e[k].vexh].jihe;</p><p><b> i++;</b></p><
28、;p><b> }</b></p><p><b> else</b></p><p> e[k].flag=2;</p><p><b> }</b></p><p> for(i=0;i<m;i++)</p><p> if(
29、e[i].flag==1)</p><p> printf("%d,%d :%d\n",e[i].vexh,e[i].vext,e[i].weight);</p><p><b> }</b></p><p> void bfs(TD g[],int v,int visited[])</p><p&
30、gt; { int qu[M],i,f=0,r=0;</p><p><b> JD *p;</b></p><p> printf("%d ",v);</p><p> visited[v]=1;</p><p><b> qu[0]=v;</b></p&g
31、t;<p> while(f<=r)</p><p> { v=qu[f++];</p><p> p=g[v].firstarc;</p><p> while(p!=NULL)</p><p> { v=p->adjvex;</p><p> if(visited[v]==
32、0)</p><p> { visited[v]=1;</p><p> printf("%d ",v);</p><p> qu[++r]=v;</p><p><b> }</b></p><p> p=p->next;</p><p
33、><b> }</b></p><p><b> }</b></p><p> for(i=1;i<=r;i++)</p><p> { printf("%d ",qu[i]);</p><p> printf("\n");}</p
34、><p><b> }</b></p><p> void traver(TD g[],int n)</p><p><b> { int i;</b></p><p> static int visited[M];</p><p> for(i=1;i<=n;
35、i++)</p><p> visited[i]=0;</p><p> for(i=1;i<=n;i++)</p><p> if(visited[i]==0)</p><p> bfs(g,i,visited);</p><p><b> }</b></p>&l
36、t;p> int loc_vertex(TD g[],int vex,int n)</p><p> { int i,j;</p><p> for(i=1;i<=n;i++)</p><p> if(g[i].vexdata==vex)</p><p> return(i);</p><p>
37、; return(0);</p><p><b> }</b></p><p> int crt_linklist(TD g[],int a[][M])</p><p> { int n,e,i,j,k,vt,vh,flag;</p><p><b> JD *p;</b></p
38、><p> printf("Input flag and the number of node,arc:");</p><p> scanf("%d,%d,%d",&flag,&n,&e);</p><p> for(i=1;i<=n;i++)</p><p> {
39、printf("g[%d].vexdata=",i);</p><p> scanf("%d",&g[i].vexdata);</p><p> g[i].firstarc=NULL;</p><p><b> }</b></p><p> for(k=1;k<
40、;=e;k++)</p><p> { printf("Vt,Vh:");</p><p> scanf("%d,%d",&vt,&vh);</p><p> i=loc_vertex(g,vt,n);</p><p> j=loc_vertex(g,vh,n);</p
41、><p> printf("the right of one edge:");</p><p> scanf("%d",&a[i-1][j-1]);</p><p> a[j-1][i-1]=a[i-1][j-1];</p><p><b> if(flag)</b>&
42、lt;/p><p> { p=(JD *)malloc(sizeof(JD));</p><p> p->adjvex=j;</p><p> p->next=g[i].firstarc;</p><p> g[i].firstarc=p;</p><p><b> }</b>
43、;</p><p><b> else</b></p><p> { p=(JD *)malloc(sizeof(JD));</p><p> p->adjvex=j;</p><p> p->next=g[i].firstarc;</p><p> g[i].first
44、arc=p;</p><p> p=(JD *)malloc(sizeof(JD));</p><p> p->adjvex=i;</p><p> p->next=g[j].firstarc;</p><p> g[j].firstarc=p;</p><p><b> }</b
45、></p><p><b> }</b></p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> for(j=0;j<n;j++)</p><p><b> {</b><
46、;/p><p> printf("%-6d ",a[i][j]);</p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> return(n);&
47、lt;/p><p><b> }</b></p><p> void minispantree_PRIM(int a[][M],int n)</p><p> { int i,j,k,p,q,wm;</p><p><b> q=p=n-1;</b></p><p>
48、 a[q][q]=1;</p><p> for(k=0;k<(n-1);k++)</p><p> { wm=MAX;</p><p> for(i=0;i<n;i++)</p><p> if(a[i][i]==1)</p><p> for(j=0;j<n;j++)</p>
49、;<p> if((a[j][j]==0)&&(a[i][j]<wm))</p><p> { wm=a[i][j];</p><p><b> p=i;</b></p><p><b> q=j;</b></p><p><b> }&l
50、t;/b></p><p> a[q][q]=1;</p><p> printf("%d %d %d\n",p+1,q+1,a[p][q]);</p><p> if(p>q) a[p][q]=-a[p][q];</p><p> else a[q][p]=-a[q][p];</p&g
51、t;<p><b> }</b></p><p><b> }</b></p><p> void main()</p><p> { int n,i,j;</p><p> static inta[][M];</p><p><b>
52、TD g[M];</b></p><p> for(i=0;i<M;i++)</p><p> for(j=0;j<M;j++)</p><p> a[i][j]=MAX;</p><p> n=crt_linklist(g,a);</p><p> traver(g,n);</
53、p><p> minispantree_PRIM(a,n);</p><p> for(i=0;i<n;i++)</p><p> { for(j=0;j<n;j++)</p><p> printf("%-6d",a[i][j]);</p><p> printf("
54、\n");</p><p><b> }</b></p><p> minitree_KRUSKAL();</p><p> } </p><p><b> 七、收獲及體會</b></p><p> 在進(jìn)行這次課程設(shè)計(jì)的過程中,我真正學(xué)到了
55、教科書上所沒有或者真正用到了課本上的知識。這樣,既鞏固了舊知識,又掌握了新知識。所以,數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是我們的重中之重,是提高我們專業(yè)知識與實(shí)踐相結(jié)合的重要手段。</p><p> 這次課程設(shè)計(jì),對我進(jìn)行了結(jié)構(gòu)化程序設(shè)計(jì)的初步訓(xùn)練,培養(yǎng)了我的數(shù)據(jù)抽象能力。在實(shí)際操作過程中,遇到很多問題,通過查書,上網(wǎng)查資料,最后問老師,把問題解決,在這個過程中,把課堂上的知識很好的運(yùn)用到實(shí)際上,還通過解決問題,學(xué)習(xí)到很多課外知
56、識,引導(dǎo)和激發(fā)我對數(shù)據(jù)結(jié)構(gòu)的興趣,同時還要培養(yǎng)我搜索分析信息、查閱幫助文檔、整理經(jīng)驗(yàn)編寫文檔、合作交流的能力。</p><p> 課程設(shè)計(jì)中我遇見了一些難點(diǎn),比方說 輸入數(shù)據(jù)時錯誤的輸入可能就會讓程序崩潰,經(jīng)過仔細(xì)思考,查閱資料,請教同學(xué),最后都圓滿的解決當(dāng)然,這是我收獲比較大一點(diǎn)。除此之外,我覺得一個好程序不僅在于它的功能的實(shí)現(xiàn),更重要的是,很好的容錯能力,人機(jī)交互界面。這次課程設(shè)計(jì)由于比較簡單,時間比較充裕
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(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ì)報告--鏈表
- 實(shí)現(xiàn)兩個鏈表的合并數(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ì)---實(shí)現(xiàn)兩個鏈表的合并
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-- 循環(huán)單鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--雙向循環(huán)鏈表的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-圖的鄰接矩陣
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---城市鏈表的設(shè)計(jì)與實(shí)現(xiàn)
- 雙向循環(huán)鏈表基于鄰接表的圖的實(shí)現(xiàn)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說明書
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---鏈表的創(chuàng)建、插入、刪除、修改
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--單鏈表兩個集合相加減的算法
- 單鏈表的基本操作迷宮問題數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報告-雙鏈表創(chuàng)建與演示設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---一個銀行業(yè)務(wù)模擬的程序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--鏈表的維護(hù)與文件形式的保存
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
評論
0/150
提交評論