數(shù)據(jù)結(jié)構(gòu)圖_第1頁
數(shù)據(jù)結(jié)構(gòu)圖_第2頁
數(shù)據(jù)結(jié)構(gòu)圖_第3頁
數(shù)據(jù)結(jié)構(gòu)圖_第4頁
數(shù)據(jù)結(jié)構(gòu)圖_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-作者xxxx-日期xxxx數(shù)據(jù)結(jié)構(gòu) 圖【精品文檔】常熟理工學(xué)院數(shù)據(jù)結(jié)構(gòu)與算法實驗指導(dǎo)與報告書_2017-2018_學(xué)年 第_1_ 學(xué)期專 業(yè): 物聯(lián)網(wǎng)工程 實驗名稱: 實驗七 圖 實驗地點: N6-210 指導(dǎo)教師: 聶盼紅 計算機科學(xué)與工程學(xué)院2017實驗七 圖【實驗?zāi)康摹?、掌握圖的鄰接矩陣和鄰接表表示。2、掌握圖的深度優(yōu)先和廣度優(yōu)先搜索方法。3、掌握圖的最小生成樹Prim算法。4、掌握圖的拓撲排序算法。5、掌握圖的單源最短路徑dijkstra算法?!緦嶒瀸W(xué)時】4-6學(xué)時【實驗預(yù)習(xí)】回答以下問題:1、寫出圖7-1無向圖的鄰接矩陣表示。2、寫出圖7-2有向圖的鄰接表表示。3、寫出圖7-1的

2、深度優(yōu)先搜索序列和廣度優(yōu)先搜索序列。深度優(yōu)先搜索序列:A,C,B,D,E,F,G,H廣度優(yōu)先搜索序列:A,B,C,D,E,F,G,H,4、寫出圖7-2的拓撲序列,說明該有向圖是否有環(huán)?拓撲序列:EABCD該有向圖沒有環(huán)5、根據(jù)圖7-3,寫出其最小生成樹。圖7-3 無向帶權(quán)圖G36、根據(jù)圖7-4,求從頂點A到其他頂點的單源最短路徑。X圖7-4有向帶權(quán)圖G4單源最短路徑:=10:AC=50:AED=30:AE=60:AEDF【實驗內(nèi)容和要求】1、 編寫程序exp7_1.c,實現(xiàn)圖的鄰接矩陣存儲及圖的深度優(yōu)先搜索和廣度優(yōu)先搜索。以圖7-1的無向圖為例,補充完整程序,調(diào)試運行并寫出運行結(jié)果。運行結(jié)果:

3、(包括輸入數(shù)據(jù))exp7參考程序如下:#include#define N 20#define TRUE 1#define FALSE 0#define MAX 100int visitedN;/*訪問標志數(shù)組*/typedef struct /*輔助隊列的定義*/ int dataN; int front,rear;queue;typedef struct /*圖的鄰接矩陣表示*/ int vexnum,arcnum; char vexsN; int arcsNN;MGraph;void createGraph(MGraph *g); /*建立一個無向圖的鄰接矩陣*/void dfs(int

4、i, MGraph *g); /*從第i個頂點出發(fā)深度優(yōu)先搜索*/void tdfs(MGraph *g); /*深度優(yōu)先搜索整個圖*/void bfs(int k, MGraph *g); /*從第k個頂點廣度優(yōu)先搜索*/void tbfs(MGraph *g); /*廣度優(yōu)先搜索整個圖*/void init_visit(); /*初始化訪問標識數(shù)組*/void createGraph(MGraph *g) /*建立一個無向圖的鄰接矩陣*/ int i=0,j,e=0; char v; g-vexnum=0; g-arcnum=0; printf(n輸入頂點序列(以#結(jié)束):n); whil

5、e (v=getchar()!=#) g-vexsi=v; /*讀入頂點信息*/ i+; g-vexnum=i; /*頂點數(shù)目*/ for (i=0;ivexnum;i+) /*鄰接矩陣初始化*/ for (j=0;jvexnum;j+) g-arcsij=0;/*(1)-鄰接矩陣元素初始化為0*/ printf(n輸入邊的信息(頂點序號,頂點序號),以(-1,-1)結(jié)束:n); scanf(%d,%d,&i,&j); /*讀入邊(i,j)*/ while (i!=-1) /*讀入i為1時結(jié)束*/ g-arcsij=1;/*(2)-i,j對應(yīng)邊等于1*/ e+; scanf(%d,%d,&i,

6、&j); g-arcnum=e; /*邊數(shù)目*/* createGraph */*(3)-從第i個頂點出發(fā)深度優(yōu)先搜索,補充完整算法*/void dfs(int i, MGraph *g) int j; printf(%c,g-vexsi); visitedi=1; for(j=0;jvexnum;j+) if(g-arcsij=1)&(!visitedj) dfs(j,g);/* dfs */void tdfs(MGraph *g) /*深度優(yōu)先搜索整個圖*/ int i; printf(n從頂點%C開始深度優(yōu)先搜索序列:,g-vexs0); for (i=0;ivexnum;i+) if

7、(visitedi!=1) /*(4)-對尚未訪問過的頂點進行深度優(yōu)先搜索*/ dfs(i,g); printf(n);/*tdfs*/void bfs(int k, MGraph *g) /*從第k個頂點廣度優(yōu)先搜索*/ int i,j; queue qlist,*q; q=&qlist; q-rear=0; q-front=0; printf(%c,g-vexsk); visitedk=TRUE; q-dataq-rear=k; q-rear=(q-rear+1)%N; while (q-rear!=q-front) /*當隊列不為空,進行搜索*/ i=q-dataq-front; q-f

8、ront=(q-front+1)%N; for (j=0;jvexnum;j+) if (g-arcsij=1)&(!visitedj) printf(%c,g-vexsj); visitedj=TRUE; q-dataq-rear=j; /*(5)-剛訪問過的結(jié)點入隊*/ q-rear=(q-rear+1)%MAX; /*(6)-修改隊尾指針*/ /*bfs*/void tbfs(MGraph *g) /*廣度優(yōu)先搜索整個圖*/ int i; printf(n從頂點%C開始廣度優(yōu)先搜索序列:,g-vexs0); for (i=0;ivexnum;i+) if (visitedi!=TRUE)

9、 bfs(i,g);/*從頂點i開始廣度優(yōu)先搜索*/ printf(n);/*tbfs*/void init_visit() /*初始化訪問標識數(shù)組*/ int i; for (i=0;iN;i+) visitedi=FALSE;int main() MGraph ga; int i,j; printf(*圖鄰接矩陣存儲和圖的遍歷*n); printf(n1-輸入圖的基本信息:n); createGraph(&ga); printf(n2-無向圖的鄰接矩陣:n); for (i=0;iga.vexnum;i+) for (j=0;jga.vexnum;j+) printf(%3d,ga.arc

10、sij); printf(n); printf(n3-圖的遍歷:n); init_visit(); /*初始化訪問數(shù)組*/ tdfs(&ga); /*深度優(yōu)先搜索圖*/ init_visit(); tbfs(&ga); /*廣度優(yōu)先搜索圖*/ return 0;2、 編寫程序exp7_2.c,實現(xiàn)圖的鄰接表存儲和拓撲排序算法。以圖7-2的有向圖為例,補充完整程序,調(diào)試運行并寫出運行結(jié)果。運行結(jié)果:(包括輸入數(shù)據(jù))exp7_2.c程序代碼參考如下:#include#include#define N 20/*圖的鄰接表:鄰接鏈表結(jié)點*/typedef struct EdgeNode int adj

11、vex; /*頂點序號*/ struct EdgeNode *next; /*下一個結(jié)點的指針*/ EdgeNode;/*圖的鄰接表:鄰接表*/typedef struct VNode char data; /*頂點信息*/ int ind; /*頂點入度*/ struct EdgeNode *link; /*指向鄰接鏈表指針*/ VNode;typedef struct ALgraph /*圖的鄰接表*/ int vexnum,arcnum; /*頂點數(shù)、弧數(shù)*/ VNode adjlistN;ALGraph;void createGraph_list(ALGraph *g); /*建立有向

12、圖的鄰接表*/void topSort(ALGraph *g); /*拓撲排序*/*建立有向圖的鄰接表*/void createGraph_list(ALGraph *g) int i,j,e; char v; EdgeNode *s; i=0; e=0; printf(n輸入頂點序列(以#結(jié)束):n); while(v=getchar()!=#) g-adjlisti.data=v; /*讀入頂點信息*/ g-adjlisti.link=NULL; g-adjlisti.ind=0; i+; g-vexnum=i; /*建立鄰接鏈表*/ printf(n請輸入弧的信息(頂點序號,頂點序號),

13、以(-1,-1)結(jié)束:n); scanf(%d,%d,&i,&j); while(i!=-1) s=(struct EdgeNode*)malloc(sizeof(EdgeNode); s-adjvex=j; s-next=g-adjlisti.link; ; /*(1)s插入鏈表*/ g-adjlisti.link=s; g-adjlistj.ind+; /*(2)頂點j的入度加1*/ e+; scanf(%d,%d,&i,&j); g-arcnum=e;/*createGraph_list*/void topSort(ALGraph *g) /*拓撲排序*/ int i,j,k,top=0

14、,m=0,sN; /*m為拓撲排序輸出的結(jié)點數(shù)*/ EdgeNode *p; for(i=0; ivexnum; i+) if(!g-adjlisti.ind) /*(3)入度為0的頂點入棧*/ stop+=i; printf(n輸出拓撲序列:); while(top0) j=s-top; printf(%c,g-adjlistj.data); m+; p=g-adjlistj.link; while(p!=NULL) k=p-adjvex; g-adjlistk.ind-; /*頂點k入度減1*/ if(g-adjlistk.ind=0) /*頂點k入度為0,進棧*/ stop+=k; p=

15、p-next; printf(n共輸出%d個頂點n,m); if(mvexnum) /*(4)當輸出頂點數(shù)小于圖的頂點數(shù),表示有環(huán)*/ printf(圖中有環(huán)!); else printf(圖中無環(huán)!);/*topSort*/int main() ALGraph g; int i; EdgeNode *s; printf(*圖的鄰接表存儲結(jié)構(gòu)和拓撲排序*n); printf(n1-輸入圖的基本信息:n); createGraph_list(&g); /*創(chuàng)建圖的鄰接表存儲結(jié)構(gòu)*/ printf(n2-圖的鄰接表:); for(i=0; i%d,s-adjvex); s=s-next; prin

16、tf(n); printf(n3-根據(jù)圖的鄰接表實現(xiàn)拓撲排序:n); topSort(&g); /*進行拓撲排序*/ return 0;(3)調(diào)試下面給出的圖的信息,寫出運行結(jié)果,畫出該有向圖。ABCDEF#1,01,32,12,53,23,43,54,05,05,15,4-1,-13、編寫程序exp7_3.c,實現(xiàn)帶權(quán)圖的存儲、圖的最小生成樹及單源最短路徑算法。以圖7-3(求該圖最小生成樹)和圖7-4(求該圖的單源最短路徑)為例,補充完整程序,調(diào)試運行并寫出運行結(jié)果。運行結(jié)果:(包括輸入數(shù)據(jù))exp7_3.c程序代碼參考如下:#include #define N 20#define TRUE

17、 1#define INF 10002766 /*鄰接矩陣中的無窮大元素*/#define INFIN 10002767 /*比無窮大元素大的數(shù)*/typedef struct/*圖的鄰接矩陣表示*/ int vexnum,arcnum; char vexsN; int arcsNN;MGraph;void printPath(MGraph g, int startVex, int EndVex, int pathN); /*打印最短路徑*/void createMGraph_w(MGraph *g, int flag); /*建帶權(quán)圖的鄰接矩陣*/void prim(MGraph *g, i

18、nt u); /*求最小生成樹Prim算法,u為出發(fā)頂點*/void dijkstra(MGraph g, int v); /*dijkstra算法求單源最短路徑*/void createMGraph_w(MGraph *g, int flag)/*建帶權(quán)圖的鄰接矩陣,若flag為1則為無向圖,flag為0為有向圖*/ int i,j,w; char v; g-vexnum=0; g-arcnum=0; i=0; printf(n輸入頂點序列(以#結(jié)束):n); while(v=getchar()!=#) g-vexsi=v; /*讀入頂點信息*/ i+; g-vexnum=i; for(i=

19、0; i6; i+) /*鄰接矩陣初始化*/ for(j=0; jarcsij=INF; printf(n輸入邊的信息:(頂點,頂點,權(quán)值),以(-1,-1,-1)結(jié)束n); scanf(%d,%d,%d,&i,&j,&w); /*讀入邊(i,j,w)*/ while(i!=-1) /*讀入i為1時結(jié)束*/ g-arcsij=w; if(flag=1) g-arcsji=w; scanf(%d,%d,%d,&i,&j,&w); /*createMGraph_w*/void prim(MGraph *g, int u)/*求最小生成樹Prim算法,u為出發(fā)頂點*/ int lowcostN,cl

20、osestN,i,j,k,min; for(i=0; ivexnum; i+) /*求其他頂點到出發(fā)頂點u的權(quán)*/ lowcosti=g-arcsuj;/*(1)-頂點i到u的代價最小的邊權(quán)值*/ closesti=u; lowcostu=0; printf(n最小生成樹:n); for(i=1; ivexnum; i+) /*循環(huán)求最小生成樹中的各條邊*/ min=INFIN; for(j=0; jvexnum; j+) /*選擇得到一條代價最小的邊*/ if(lowcostj!=0&lowcostjvexsclosestk,g-vexsk,lowcostk); /*輸出該邊*/ lowco

21、stk=0; /*頂點k納入最小生成樹 */ for(j=0; jvexnum; j+) /*求其他頂點到頂點k 的權(quán)*/ if(g-arcskj!=0&g-arcskjarcskj; /*(3)-其他頂點到k的代價最小的邊權(quán)值*/ closestj=k; /*prim*/void printPath(MGraph g, int startVex, int EndVex, int pathN) int stackN,top=0; /堆棧 int i,k,j; int flagN; /輸出路徑頂點標志 k=EndVex; for (i=0;i0) /找j到k的路徑 for (i=0;i %c(%

22、d) ,g.vexsi,g.arcsji); /輸出j到k路徑頂點i flagi=1; j=i; k=stack-top; break; else if (i!=k) stacktop+=i; if (flagk=0) printf(- %c(%d),g.vexsk,g.arcsjk);void dijkstra(MGraph g, int v)/*dijkstra算法求單源最短路徑*/ int sN, pathNN,distN; int mindis,i,j,u,k; for(i=0; ig.vexnum; i+) disti=g.arcsvi; si=0; for(j=0; jg.vexn

23、um; j+) pathij=0; if(distiINF) pathiv=1; pathii=1; distv=0; sv=1; for(i=0,u=1; ig.vexnum; i+) mindis=INFIN; for(j=0; jg.vexnum; j+) if(sj=0) if(distjmindis) u=j; mindis=distj; su=1; for(j=0; jg.vexnum; j+) if(sj=0)&distu+g.arcsujdistj) distj=distu+g.arcsuj; for(k=0; k到各頂點的最短路徑n,g.vexsv); for (i=0;i頂

24、點%c:,g.vexsv,g.vexsi); if (disti=INF|disti=0) printf(無路徑); else printf(%d ,disti); printf(經(jīng)過頂點:); printPath(g,v,i,path); /輸出v到i的路徑 /*dijkstra*/int main() int select; MGraph ga; do printf(n*MENU*n); printf( 1. 圖的最小生成樹-Prim算法n); printf( 2. 圖的單源最短路徑-dijstra算法n); printf( 0. EXIT); printf(n*MENU*n); prin

25、tf(ninput choice:); scanf(%d,&select); getchar(); switch(select) case 1: printf(n1-圖的最小生成樹-Prim算法n); printf(n輸入帶權(quán)圖的基本信息:n); createMGraph_w(&ga,1); prim(&ga,0); break; case 2: printf(n2-圖的單源最短路徑-dijstra算法n); printf(n輸入帶權(quán)圖的基本信息:n); createMGraph_w(&ga,0); dijkstra(ga,0); break; default: break; while(sel

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論