版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《數(shù)據(jù)結(jié)構(gòu)與算法》課程設(shè)計(jì)報(bào)告</p><p> 題目:prim算法 </p><p><b> 五.算法設(shè)計(jì)</b></p><p><b> 程序流程圖</b></p><p> 算法用到的抽象數(shù)據(jù)類型定
2、義:</p><p> 1.ADT Graph{</p><p> 數(shù)據(jù)對(duì)象V:V是具有相同特性的數(shù)據(jù)元素的集合,成為頂點(diǎn)集。</p><p> 數(shù)據(jù)關(guān)系R:R={VR}</p><p> VR={<v,w>|v,w屬于V且P(v,w)表示從v到w的弧,謂詞p(v,w)定義了弧<v,w>的意義或信息}</
3、p><p><b> 基本操作:</b></p><p> LocateVex(G,u);初始條件:圖G存在,u和G頂點(diǎn)有相同特征。操作結(jié)果:若G中存在頂點(diǎn)u,則返回頂點(diǎn)在圖中位置;否則返回其他信息。</p><p> DestroyGrapch(&G);初始條件:圖G存在。操作結(jié)果:銷毀圖G。</p><
4、p> GetVex(G,v);初始條件:圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果:返回v的值。</p><p> PutVex(&G,v,value);初始條件:圖G存在,V是G中某個(gè)頂點(diǎn)。操作結(jié)果:對(duì)v賦值value。</p><p> FirstAdjVex(G,v);初始條件:圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果:返回v的第一個(gè)鄰接頂點(diǎn)。若頂點(diǎn)在G中沒有鄰
5、接頂點(diǎn),則返回“空”。</p><p> NextAdjVex(G,v,w);初始條件:圖G存在,v是G中某個(gè)頂點(diǎn),w是v的鄰接頂點(diǎn)。操作結(jié)果:返回v的下一個(gè)鄰接頂點(diǎn)。若w是v的最后一個(gè)鄰接頂點(diǎn),則返回“空”。</p><p> IsertVex(&G,v);初始條件:圖G存在v和圖中頂點(diǎn)有相同特征。操作結(jié)果:在圖G中增添新頂點(diǎn)v。</p><p&g
6、t; DeleteVex(&G,v);初始條件:圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果:刪除G中頂點(diǎn)v及其相關(guān)的弧。</p><p> InsertArc(&G,v,w);初始條件:圖G存在,v和w是G中兩個(gè)頂點(diǎn)。操作結(jié)果:在G中增添弧<v,w>,若G是無向的,則還增添對(duì)稱弧<w,v>。</p><p> DeleteArc(&G
7、,v,w);初始條件:圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果:在G中刪除弧<v,w>,若G是無向的,則還刪除對(duì)稱弧<w,v>。</p><p> DFSTraverse(G,Visit());初始條件:圖G存在,在Visit是頂點(diǎn)的應(yīng)用函數(shù)。操作結(jié)果:對(duì)圖進(jìn)行深度優(yōu)先遍歷。在遍歷過程中對(duì)每個(gè)頂點(diǎn)調(diào)用函數(shù)Visit一次且僅一次。一旦visit()失敗,則操作失敗。</p>
8、<p> BFSTraverse(G,Visit());初始條件:圖G存在,在Visit是頂點(diǎn)的應(yīng)用函數(shù)。操作結(jié)果:對(duì)圖進(jìn)行深度優(yōu)先遍歷。在遍歷過程中對(duì)每個(gè)頂點(diǎn)調(diào)用函數(shù)Visit一次且僅一次。一旦visit()失敗,則操作失敗。</p><p> }ADT Graph</p><p> 算法中函數(shù)編號(hào)及功能要求:</p><p> int
9、LocateVex(MGraph G,VertexType u):初始條件:圖G存在,u和G中頂點(diǎn)有相同特征,操作結(jié)果:若G中存在頂點(diǎn)u,則返回該頂點(diǎn)在圖中位置;否則返回-1。</p><p> Status CreateFAG(MGraph *G):采用數(shù)組(鄰接矩陣)表示法,由文件構(gòu)造沒有相關(guān)信息的無向圖G。</p><p> Status CreateDG(MGraph *G):
10、采用數(shù)組(鄰接矩陣)表示法,構(gòu)造有向圖G。</p><p> Status CreateDN(MGraph *G):采用數(shù)組(鄰接矩陣)表示法,構(gòu)造有向網(wǎng)G。</p><p> Status CreateAG(MGraph *G):采用數(shù)組(鄰接矩陣)表示法,構(gòu)造無向圖G。</p><p> Status CreateAN(MGraph *G):采用數(shù)組(鄰接
11、矩陣)表示法,構(gòu)造無向網(wǎng)G。</p><p> Status CreateGraph(MGraph *G):采用數(shù)組(鄰接矩陣)表示法,構(gòu)造圖G。</p><p> void DestroyGraph(MGraph *G):初始條件: 圖G存在。操作結(jié)果: 銷毀圖G</p><p> Status PutVex(MGraph *G,VertexType v,V
12、ertexType value):初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果: 對(duì)v賦新值value。</p><p> int FirstAdjVex(MGraph G,VertexType v):初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn),操作結(jié)果: 返回v的第一個(gè)鄰接頂點(diǎn)的序號(hào)。若頂點(diǎn)在G中沒有鄰接頂點(diǎn),則返回-1。</p><p> int NextAdjVex(MGraph
13、 G,VertexType v,VertexType w):初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn),w是v的鄰接頂點(diǎn),操作結(jié)果: 返回v的(相對(duì)于w的)下一個(gè)鄰接頂點(diǎn)的序號(hào),若w是v的最后一個(gè)鄰接頂點(diǎn),則返回-1。</p><p> void InsertVex(MGraph *G,VertexType v):初始條件: 圖G存在,v和圖G中頂點(diǎn)有相同特征,操作結(jié)果: 在圖G中增添新頂點(diǎn)v(不增添與頂點(diǎn)相關(guān)的弧
14、,留待InsertArc()去做)。</p><p> Status DeleteVex(MGraph *G,VertexType v):初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果: 刪除G中頂點(diǎn)v及其相關(guān)的弧。</p><p> Status InsertArc(MGraph *G,VertexType v,VertexType w):初始條件: 圖G存在,v和W是G中兩個(gè)頂點(diǎn)
15、,操作結(jié)果: 在G中增添弧<v,w>,若G是無向的,則還增添對(duì)稱弧<w,v>。</p><p> Status DeleteArc(MGraph *G,VertexType v,VertexType w):初始條件: 圖G存在,v和w是G中兩個(gè)頂點(diǎn),操作結(jié)果: 在G中刪除弧<v,w>,若G是無向的,則還刪除對(duì)稱弧<w,v>。</p><p>
16、; void DFS(MGraph G,int v):從第v個(gè)頂點(diǎn)出發(fā)遞歸地深度優(yōu)先遍歷圖G。</p><p> void DFSTraverse(MGraph G,Status(*Visit)(VertexType)):初始條件: 圖G存在,Visit是頂點(diǎn)的應(yīng)用函數(shù)。操作結(jié)果: 從第1個(gè)頂點(diǎn)起,深度優(yōu)先遍歷圖G,并對(duì)每個(gè)頂點(diǎn)調(diào)用函數(shù)Visit,一次且僅一次。一旦Visit()失敗,則操作失敗。</p
17、><p> Status InitQueue(LinkQueue *Q):構(gòu)造一個(gè)空隊(duì)列Q,</p><p> Status DestroyQueue(LinkQueue *Q):銷毀隊(duì)列Q(無論空否均可)。</p><p> Status ClearQueue(LinkQueue *Q):將Q清為空隊(duì)列。</p><p> Status
18、 QueueEmpty(LinkQueue Q):若Q為空隊(duì)列,則返回TRUE,否則返回FALSE。</p><p> int QueueLength(LinkQueue Q):求隊(duì)列的長(zhǎng)度。</p><p> Status GetHead_Q(LinkQueue Q,QElemType :若隊(duì)列不空,則用e返回Q的隊(duì)頭元素,并返回OK,否則返回ERROR。</p>&l
19、t;p> Status EnQueue(LinkQueue *Q,QElemType e):插入元素e為Q的新的隊(duì)尾元素。</p><p> Status DeQueue(LinkQueue *Q,QElemType *e):若隊(duì)列不空,刪除Q的隊(duì)頭元素,用e返回其值,并返回OK,否則返回ERROR。</p><p> Status QueueTraverse(LinkQueu
20、e Q,void(*vi)(QElemType)):從隊(duì)頭到隊(duì)尾依次對(duì)隊(duì)列Q中每個(gè)元素調(diào)用函數(shù)vi()。一旦vi失敗,則操作失敗。</p><p> void BFSTraverse(MGraph G,Status(*Visit)(VertexType)):初始條件: 圖G存在,Visit是頂點(diǎn)的應(yīng)用函數(shù)。操作結(jié)果: 從第1個(gè)頂點(diǎn)起,按廣度優(yōu)先非遞歸遍歷圖G,并對(duì)每個(gè)頂點(diǎn)調(diào)用函數(shù),Visit一次且僅一次。一旦V
21、isit()失敗,則操作失敗,使用輔助隊(duì)列Q和訪問標(biāo)志數(shù)組visited。</p><p> void Display(MGraph G):輸出鄰接矩陣G。</p><p> int minimum(minside SZ,MGraph G):求closedge.lowcost的最小正值。</p><p> void MiniSpanTree_PRIM(MGra
22、ph G,VertexType u):用普里姆算法從第u個(gè)頂點(diǎn)出發(fā)構(gòu)造網(wǎng)G的最小生成樹T,輸出T的各條邊。</p><p> 函數(shù)之間的調(diào)用關(guān)系(子程序編號(hào)見上):</p><p> 主函數(shù)可調(diào)用子程序6,30</p><p> 子程序2可調(diào)用子程序1</p><p> 子程序3可調(diào)用子程序1</p><p>
23、 子程序4可調(diào)用子程序1</p><p> 子程序5可調(diào)用子程序1</p><p> 子程序6可調(diào)用子程序1</p><p> 子程序7可調(diào)用子程序3,4,5,6</p><p> 子程序9可調(diào)用子程序1</p><p> 子程序10可調(diào)用子程序1</p><p> 子程序11可調(diào)
24、用子程序1</p><p> 子程序13可調(diào)用子程序1</p><p> 子程序14可調(diào)用子程序1</p><p> 子程序15可調(diào)用子程序1</p><p> 子程序27可調(diào)用子程序24,25</p><p> 六.C語言實(shí)現(xiàn)的程序清單</p><p> /* 實(shí)現(xiàn)算法7.9的程序
25、 */</p><p> /////////////////////////////</p><p> #include<string.h></p><p> #include<ctype.h></p><p> #include<malloc.h> /* malloc()等 */</p>
26、;<p> #include<limits.h> /* INT_MAX等 */</p><p> #include<stdio.h> /* EOF(=^Z或F6),NULL */</p><p> #include<stdlib.h> /* atoi() */</p><p> #include<io.
27、h> /* eof() */</p><p> #include<math.h> /* floor(),ceil(),abs() */</p><p> #include<process.h> /* exit() */</p><p> /* 函數(shù)結(jié)果狀態(tài)代碼 */</p><p> #define TR
28、UE 1</p><p> #define FALSE 0</p><p> #define OK 1</p><p> #define ERROR 0</p><p> #define INFEASIBLE -1</p><p> /* #define OVERFLOW -2 因?yàn)樵趍ath.h中已定義OV
29、ERFLOW的值為3,故去掉此行 */</p><p> typedef int Status; /* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */</p><p> typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE */</p><p> typedef int VRType;</
30、p><p> typedef char InfoType;</p><p> #define MAX_NAME 3 /* 頂點(diǎn)字符串的最大長(zhǎng)度+1 */</p><p> #define MAX_INFO 20 /* 相關(guān)信息字符串的最大長(zhǎng)度+1 */</p><p> typedef char VertexType[MAX_NAME];
31、</p><p> ////////////////////////////////////</p><p> /* 圖的數(shù)組(鄰接矩陣)存儲(chǔ)表示 */</p><p> #define INFINITY INT_MAX /* 用整型最大值代替∞ */</p><p> #define MAX_VERTEX_NUM 20 /* 最大頂
32、點(diǎn)個(gè)數(shù) */</p><p> typedef enum{DG,DN,AG,AN}GraphKind; /* {有向圖,有向網(wǎng),無向圖,無向網(wǎng)} */</p><p> typedef struct</p><p><b> {</b></p><p> VRType adj; /* 頂點(diǎn)關(guān)系類型。對(duì)無權(quán)圖,用1
33、(是)或0(否)表示相鄰否; */</p><p> /* 對(duì)帶權(quán)圖,c則為權(quán)值類型 */</p><p> InfoType *info; /* 該弧相關(guān)信息的指針(可無) */</p><p> }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];</p><p> typedef
34、 struct</p><p><b> {</b></p><p> VertexType vexs[MAX_VERTEX_NUM]; /* 頂點(diǎn)向量 */</p><p> AdjMatrix arcs; /* 鄰接矩陣 */</p><p> int vexnum,arcnum; /* 圖的當(dāng)前頂點(diǎn)數(shù)和弧數(shù)
35、 */</p><p> GraphKind kind; /* 圖的種類標(biāo)志 */</p><p><b> }MGraph;</b></p><p> /////////////////////////</p><p> /* bo7-1.c 圖的數(shù)組(鄰接矩陣)存儲(chǔ)(存儲(chǔ)結(jié)構(gòu)由c7-1.h定義)的基本操作(2
36、0個(gè)) */</p><p> int LocateVex(MGraph G,VertexType u)</p><p> { /* 初始條件:圖G存在,u和G中頂點(diǎn)有相同特征 */</p><p> /* 操作結(jié)果:若G中存在頂點(diǎn)u,則返回該頂點(diǎn)在圖中位置;否則返回-1 */</p><p><b> int i;<
37、/b></p><p> for(i=0;i<G.vexnum;++i)</p><p> if(strcmp(u,G.vexs[i])==0)</p><p><b> return i;</b></p><p> return -1;</p><p><b>
38、}</b></p><p> Status CreateFAG(MGraph *G)</p><p> { /* 采用數(shù)組(鄰接矩陣)表示法,由文件構(gòu)造沒有相關(guān)信息的無向圖G */</p><p> int i,j,k;</p><p> char filename[13];</p><p> V
39、ertexType va,vb;</p><p> FILE *graphlist;</p><p> printf("請(qǐng)輸入數(shù)據(jù)文件名(f7-1.dat):");</p><p> scanf("%s",filename);</p><p> graphlist=fopen(filename,
40、"r");</p><p> fscanf(graphlist,"%d",&(*G).vexnum);</p><p> fscanf(graphlist,"%d",&(*G).arcnum);</p><p> for(i=0;i<(*G).vexnum;++i) /* 構(gòu)造頂
41、點(diǎn)向量 */</p><p> fscanf(graphlist,"%s",(*G).vexs[i]);</p><p> for(i=0;i<(*G).vexnum;++i) /* 初始化鄰接矩陣 */</p><p> for(j=0;j<(*G).vexnum;++j)</p><p><b&
42、gt; {</b></p><p> (*G).arcs[i][j].adj=0; /* 圖 */</p><p> (*G).arcs[i][j].info=NULL; /* 沒有相關(guān)信息 */</p><p><b> }</b></p><p> for(k=0;k<(*G).arcnu
43、m;++k)</p><p><b> {</b></p><p> fscanf(graphlist,"%s%s",va,vb);</p><p> i=LocateVex(*G,va);</p><p> j=LocateVex(*G,vb);</p><p>
44、(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=1; /* 無向圖 */</p><p><b> }</b></p><p> fclose(graphlist);</p><p> (*G).kind=AG;</p><p> return OK;</p><
45、;p><b> }</b></p><p> Status CreateDG(MGraph *G)</p><p> { /* 采用數(shù)組(鄰接矩陣)表示法,構(gòu)造有向圖G */</p><p> int i,j,k,l,IncInfo;</p><p> char s[MAX_INFO],*info;<
46、;/p><p> VertexType va,vb;</p><p> printf("請(qǐng)輸入有向圖G的頂點(diǎn)數(shù),弧數(shù),弧是否含其它信息(是:1,否:0): ");</p><p> scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);</p&
47、gt;<p> printf("請(qǐng)輸入%d個(gè)頂點(diǎn)的值(<%d個(gè)字符):\n",(*G).vexnum,MAX_NAME);</p><p> for(i=0;i<(*G).vexnum;++i) /* 構(gòu)造頂點(diǎn)向量 */</p><p> scanf("%s",(*G).vexs[i]);</p><
48、;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[i][j].adj=0; /* 圖 */</p><p>
49、 (*G).arcs[i][j].info=NULL;</p><p><b> }</b></p><p> printf("請(qǐng)輸入%d條弧的弧尾 弧頭(以空格作為間隔): \n",(*G).arcnum);</p><p> for(k=0;k<(*G).arcnum;++k)</p><
50、;p><b> {</b></p><p> scanf("%s%s%*c",va,vb); /* %*c吃掉回車符 */</p><p> i=LocateVex(*G,va);</p><p> j=LocateVex(*G,vb);</p><p> (*G).arcs[i][
51、j].adj=1; /* 有向圖 */</p><p> if(IncInfo)</p><p><b> {</b></p><p> printf("請(qǐng)輸入該弧的相關(guān)信息(<%d個(gè)字符): ",MAX_INFO);</p><p><b> gets(s);</b&g
52、t;</p><p> l=strlen(s);</p><p><b> if(l)</b></p><p><b> {</b></p><p> info=(char*)malloc((l+1)*sizeof(char));</p><p> strcpy(i
53、nfo,s);</p><p> (*G).arcs[i][j].info=info; /* 有向 */</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> (*G
54、).kind=DG;</p><p> return OK;</p><p><b> }</b></p><p> Status CreateDN(MGraph *G)</p><p> { /* 采用數(shù)組(鄰接矩陣)表示法,構(gòu)造有向網(wǎng)G */</p><p> int i,j,k,w
55、,IncInfo;</p><p> char s[MAX_INFO],*info;</p><p> VertexType va,vb;</p><p> printf("請(qǐng)輸入有向網(wǎng)G的頂點(diǎn)數(shù),弧數(shù),弧是否含其它信息(是:1,否:0): ");</p><p> scanf("%d,%d,%d&quo
56、t;,&(*G).vexnum,&(*G).arcnum,&IncInfo);</p><p> printf("請(qǐng)輸入%d個(gè)頂點(diǎn)的值(<%d個(gè)字符):\n",(*G).vexnum,MAX_NAME);</p><p> for(i=0;i<(*G).vexnum;++i) /* 構(gòu)造頂點(diǎn)向量 */</p><
57、;p> scanf("%s",(*G).vexs[i]);</p><p> for(i=0;i<(*G).vexnum;++i) /* 初始化鄰接矩陣 */</p><p> for(j=0;j<(*G).vexnum;++j)</p><p><b> {</b></p><
58、p> (*G).arcs[i][j].adj=INFINITY; /* 網(wǎng) */</p><p> (*G).arcs[i][j].info=NULL;</p><p><b> }</b></p><p> printf("請(qǐng)輸入%d條弧的弧尾 弧頭 權(quán)值(以空格作為間隔): \n",(*G).arcnum)
59、;</p><p> for(k=0;k<(*G).arcnum;++k)</p><p><b> {</b></p><p> scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回車符 */</p><p> i=LocateVex(*G,va);&
60、lt;/p><p> j=LocateVex(*G,vb);</p><p> (*G).arcs[i][j].adj=w; /* 有向網(wǎng) */</p><p> if(IncInfo)</p><p><b> {</b></p><p> printf("請(qǐng)輸入該弧的相關(guān)信息(
61、<%d個(gè)字符): ",MAX_INFO);</p><p><b> gets(s);</b></p><p> w=strlen(s);</p><p><b> if(w)</b></p><p><b> {</b></p><
62、p> info=(char*)malloc((w+1)*sizeof(char));</p><p> strcpy(info,s);</p><p> (*G).arcs[i][j].info=info; /* 有向 */</p><p><b> }</b></p><p><b> }&l
63、t;/b></p><p><b> }</b></p><p> (*G).kind=DN;</p><p> return OK;</p><p><b> }</b></p><p> Status CreateAG(MGraph *G)</p&g
64、t;<p> { /* 采用數(shù)組(鄰接矩陣)表示法,構(gòu)造無向圖G */</p><p> int i,j,k,l,IncInfo;</p><p> char s[MAX_INFO],*info;</p><p> VertexType va,vb;</p><p> printf("請(qǐng)輸入無向圖G的頂點(diǎn)數(shù),
65、邊數(shù),邊是否含其它信息(是:1,否:0): ");</p><p> scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);</p><p> printf("請(qǐng)輸入%d個(gè)頂點(diǎn)的值(<%d個(gè)字符):\n",(*G).vexnum,MAX_NAME);<
66、;/p><p> for(i=0;i<(*G).vexnum;++i) /* 構(gòu)造頂點(diǎn)向量 */</p><p> scanf("%s",(*G).vexs[i]);</p><p> for(i=0;i<(*G).vexnum;++i) /* 初始化鄰接矩陣 */</p><p> for(j=0;j&l
67、t;(*G).vexnum;++j)</p><p><b> {</b></p><p> (*G).arcs[i][j].adj=0; /* 圖 */</p><p> (*G).arcs[i][j].info=NULL;</p><p><b> }</b></p>&l
68、t;p> printf("請(qǐng)輸入%d條邊的頂點(diǎn)1 頂點(diǎn)2(以空格作為間隔): \n",(*G).arcnum);</p><p> for(k=0;k<(*G).arcnum;++k)</p><p><b> {</b></p><p> scanf("%s%s%*c",va,vb)
69、; /* %*c吃掉回車符 */</p><p> i=LocateVex(*G,va);</p><p> j=LocateVex(*G,vb);</p><p> (*G).arcs[i][j].adj=(*G).arcs[j][i].adj=1; /* 無向圖 */</p><p> if(IncInfo)</p>
70、<p><b> {</b></p><p> printf("請(qǐng)輸入該邊的相關(guān)信息(<%d個(gè)字符): ",MAX_INFO);</p><p><b> gets(s);</b></p><p> l=strlen(s);</p><p><b&
71、gt; if(l)</b></p><p><b> {</b></p><p> info=(char*)malloc((l+1)*sizeof(char));</p><p> strcpy(info,s);</p><p> (*G).arcs[i][j].info=(*G).arcs[j][
72、i].info=info; /* 無向 */</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> (*G).kind=AG;</p><p> return OK;
73、</p><p><b> }</b></p><p> Status CreateAN(MGraph *G)</p><p> { /* 采用數(shù)組(鄰接矩陣)表示法,構(gòu)造無向網(wǎng)G。算法7.2 */</p><p> int i,j,k,w,IncInfo;</p><p> char
74、s[MAX_INFO],*info;</p><p> VertexType va,vb;</p><p> printf("請(qǐng)輸入無向網(wǎng)G的頂點(diǎn)數(shù),邊數(shù),邊是否含其它信息(是:1,否:0): ");</p><p> scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,
75、&IncInfo);</p><p> printf("請(qǐng)輸入%d個(gè)頂點(diǎn)的值(<%d個(gè)字符):\n",(*G).vexnum,MAX_NAME);</p><p> for(i=0;i<(*G).vexnum;++i) /* 構(gòu)造頂點(diǎn)向量 */</p><p> scanf("%s",(*G).vex
76、s[i]);</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[i][j].adj=INFINITY;
77、/* 網(wǎng) */</p><p> (*G).arcs[i][j].info=NULL;</p><p><b> }</b></p><p> printf("請(qǐng)輸入%d條邊的頂點(diǎn)1 頂點(diǎn)2 權(quán)值(以空格作為間隔): \n",(*G).arcnum);</p><p> for(k=0;k&l
78、t;(*G).arcnum;++k)</p><p><b> {</b></p><p> scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回車符 */</p><p> i=LocateVex(*G,va);</p><p> j=LocateVex(*G
79、,vb);</p><p> (*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w; /* 無向 */</p><p> if(IncInfo)</p><p><b> {</b></p><p> printf("請(qǐng)輸入該邊的相關(guān)信息(<%d個(gè)字符): "
80、;,MAX_INFO);</p><p><b> gets(s);</b></p><p> w=strlen(s);</p><p><b> if(w)</b></p><p><b> {</b></p><p> info=(char
81、*)malloc((w+1)*sizeof(char));</p><p> strcpy(info,s);</p><p> (*G).arcs[i][j].info=(*G).arcs[j][i].info=info; /* 無向 */</p><p><b> }</b></p><p><b>
82、 }</b></p><p><b> }</b></p><p> (*G).kind=AN;</p><p> return OK;</p><p><b> }</b></p><p> Status CreateGraph(MGraph *G)&
83、lt;/p><p> { /* 采用數(shù)組(鄰接矩陣)表示法,構(gòu)造圖G。算法7.1 */</p><p> printf("請(qǐng)輸入圖G的類型(有向圖:0,有向網(wǎng):1,無向圖:2,無向網(wǎng):3): ");</p><p> scanf("%d",&(*G).kind);</p><p> swit
84、ch((*G).kind)</p><p><b> {</b></p><p> case DG: return CreateDG(G); /* 構(gòu)造有向圖 */</p><p> case DN: return CreateDN(G); /* 構(gòu)造有向網(wǎng) */</p><p> case AG: return
85、 CreateAG(G); /* 構(gòu)造無向圖 */</p><p> case AN: return CreateAN(G); /* 構(gòu)造無向網(wǎng) */</p><p> default: return ERROR;</p><p><b> }</b></p><p><b> }</b>&
86、lt;/p><p> void DestroyGraph(MGraph *G)</p><p> { /* 初始條件: 圖G存在。操作結(jié)果: 銷毀圖G */</p><p><b> int i,j;</b></p><p> if((*G).kind<2) /* 有向 */</p><p&
87、gt; for(i=0;i<(*G).vexnum;i++) /* 釋放弧的相關(guān)信息(如果有的話) */</p><p><b> {</b></p><p> for(j=0;j<(*G).vexnum;j++)</p><p> if((*G).arcs[i][j].adj==1&&(*G).kind==
88、0||(*G).arcs[i][j].adj!=INFINITY&&(*G).kind==1) /* 有向圖的弧||有向網(wǎng)的弧 */</p><p> if((*G).arcs[i][j].info) /* 有相關(guān)信息 */</p><p><b> {</b></p><p> free((*G).arcs[i][j].
89、info);</p><p> (*G).arcs[i][j].info=NULL;</p><p><b> }</b></p><p><b> }</b></p><p> else /* 無向 */</p><p> for(i=0;i<(*G).ve
90、xnum;i++) /* 釋放邊的相關(guān)信息(如果有的話) */</p><p> for(j=i+1;j<(*G).vexnum;j++)</p><p> if((*G).arcs[i][j].adj==1&&(*G).kind==2||(*G).arcs[i][j].adj!=INFINITY&&(*G).kind==3) /* 無向圖的邊||
91、無向網(wǎng)的邊 */</p><p> if((*G).arcs[i][j].info) /* 有相關(guān)信息 */</p><p><b> {</b></p><p> free((*G).arcs[i][j].info);</p><p> (*G).arcs[i][j].info=(*G).arcs[j][i].
92、info=NULL;</p><p><b> }</b></p><p> (*G).vexnum=0;</p><p> (*G).arcnum=0;</p><p><b> }</b></p><p> VertexType* GetVex(MGraph G
93、,int v)</p><p> { /* 初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn)的序號(hào)。操作結(jié)果: 返回v的值 */</p><p> if(v>=G.vexnum||v<0)</p><p> exit(ERROR);</p><p> return &G.vexs[v];</p><p&g
94、t;<b> }</b></p><p> Status PutVex(MGraph *G,VertexType v,VertexType value)</p><p> { /* 初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果: 對(duì)v賦新值value */</p><p><b> int k;</b><
95、/p><p> k=LocateVex(*G,v); /* k為頂點(diǎn)v在圖G中的序號(hào) */</p><p><b> if(k<0)</b></p><p> return ERROR;</p><p> strcpy((*G).vexs[k],value);</p><p> ret
96、urn OK;</p><p><b> }</b></p><p> int FirstAdjVex(MGraph G,VertexType v)</p><p> { /* 初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn) */</p><p> /* 操作結(jié)果: 返回v的第一個(gè)鄰接頂點(diǎn)的序號(hào)。若頂點(diǎn)在G中沒有鄰接頂點(diǎn)
97、,則返回-1 */</p><p> int i,j=0,k;</p><p> k=LocateVex(G,v); /* k為頂點(diǎn)v在圖G中的序號(hào) */</p><p> if(G.kind==DN||G.kind==AN) /* 網(wǎng) */</p><p> j=INFINITY;</p><p> for
98、(i=0;i<G.vexnum;i++)</p><p> if(G.arcs[k][i].adj!=j)</p><p><b> return i;</b></p><p> return -1;</p><p><b> }</b></p><p> i
99、nt NextAdjVex(MGraph G,VertexType v,VertexType w)</p><p> { /* 初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn),w是v的鄰接頂點(diǎn) */</p><p> /* 操作結(jié)果: 返回v的(相對(duì)于w的)下一個(gè)鄰接頂點(diǎn)的序號(hào), */</p><p> /* 若w是v的最后一個(gè)鄰接頂點(diǎn),則返回-1
100、 */</p><p> int i,j=0,k1,k2;</p><p> k1=LocateVex(G,v); /* k1為頂點(diǎn)v在圖G中的序號(hào) */</p><p> k2=LocateVex(G,w); /* k2為頂點(diǎn)w在圖G中的序號(hào) */</p><p> if(G.kind==DN||G.kind==AN) /* 網(wǎng) *
101、/</p><p> j=INFINITY;</p><p> for(i=k2+1;i<G.vexnum;i++)</p><p> if(G.arcs[k1][i].adj!=j)</p><p><b> return i;</b></p><p> return -1;&l
102、t;/p><p><b> }</b></p><p> void InsertVex(MGraph *G,VertexType v)</p><p> { /* 初始條件: 圖G存在,v和圖G中頂點(diǎn)有相同特征 */</p><p> /* 操作結(jié)果: 在圖G中增添新頂點(diǎn)v(不增添與頂點(diǎn)相關(guān)的弧,留待InsertAr
103、c()去做) */</p><p><b> int i;</b></p><p> strcpy((*G).vexs[(*G).vexnum],v); /* 構(gòu)造新頂點(diǎn)向量 */</p><p> for(i=0;i<=(*G).vexnum;i++)</p><p><b> {</b&
104、gt;</p><p> if((*G).kind%2) /* 網(wǎng) */</p><p><b> {</b></p><p> (*G).arcs[(*G).vexnum][i].adj=INFINITY; /* 初始化該行鄰接矩陣的值(無邊或弧) */</p><p> (*G).arcs[i][(*G).v
105、exnum].adj=INFINITY; /* 初始化該列鄰接矩陣的值(無邊或弧) */</p><p><b> }</b></p><p> else /* 圖 */</p><p><b> {</b></p><p> (*G).arcs[(*G).vexnum][i].adj=0;
106、 /* 初始化該行鄰接矩陣的值(無邊或弧) */</p><p> (*G).arcs[i][(*G).vexnum].adj=0; /* 初始化該列鄰接矩陣的值(無邊或弧) */</p><p><b> }</b></p><p> (*G).arcs[(*G).vexnum][i].info=NULL; /* 初始化相關(guān)信息指針 *
107、/</p><p> (*G).arcs[i][(*G).vexnum].info=NULL;</p><p><b> }</b></p><p> (*G).vexnum+=1; /* 圖G的頂點(diǎn)數(shù)加1 */</p><p><b> }</b></p><p>
108、 Status DeleteVex(MGraph *G,VertexType v)</p><p> { /* 初始條件: 圖G存在,v是G中某個(gè)頂點(diǎn)。操作結(jié)果: 刪除G中頂點(diǎn)v及其相關(guān)的弧 */</p><p> int i,j,k;</p><p> VRType m=0;</p><p> k=LocateVex(*G,v);
109、 /* k為待刪除頂點(diǎn)v的序號(hào) */</p><p> if(k<0) /* v不是圖G的頂點(diǎn) */</p><p> return ERROR;</p><p> if((*G).kind==DN||(*G).kind==AN) /* 網(wǎng) */</p><p> m=INFINITY;</p><p>
110、 for(j=0;j<(*G).vexnum;j++)</p><p> if((*G).arcs[j][k].adj!=m) /* 有入弧或邊 */</p><p><b> {</b></p><p> if((*G).arcs[j][k].info) /* 有相關(guān)信息 */</p><p> fre
111、e((*G).arcs[j][k].info); /* 釋放相關(guān)信息 */</p><p> (*G).arcnum--; /* 修改弧數(shù) */</p><p><b> }</b></p><p> if((*G).kind==DG||(*G).kind==DN) /* 有向 */</p><p> for(j
112、=0;j<(*G).vexnum;j++)</p><p> if((*G).arcs[k][j].adj!=m) /* 有出弧 */</p><p><b> {</b></p><p> if((*G).arcs[k][j].info) /* 有相關(guān)信息 */</p><p> free((*G).ar
113、cs[k][j].info); /* 釋放相關(guān)信息 */</p><p> (*G).arcnum--; /* 修改弧數(shù) */</p><p><b> }</b></p><p> for(j=k+1;j<(*G).vexnum;j++) /* 序號(hào)k后面的頂點(diǎn)向量依次前移 */</p><p> str
114、cpy((*G).vexs[j-1],(*G).vexs[j]);</p><p> for(i=0;i<(*G).vexnum;i++)</p><p> for(j=k+1;j<(*G).vexnum;j++)</p><p> (*G).arcs[i][j-1]=(*G).arcs[i][j]; /* 移動(dòng)待刪除頂點(diǎn)之后的矩陣元素 */<
115、;/p><p> for(i=0;i<(*G).vexnum;i++)</p><p> for(j=k+1;j<(*G).vexnum;j++)</p><p> (*G).arcs[j-1][i]=(*G).arcs[j][i]; /* 移動(dòng)待刪除頂點(diǎn)之下的矩陣元素 */</p><p> (*G).vexnum--; /
116、* 更新圖的頂點(diǎn)數(shù) */</p><p> return OK;</p><p><b> }</b></p><p> Status InsertArc(MGraph *G,VertexType v,VertexType w)</p><p> { /* 初始條件: 圖G存在,v和W是G中兩個(gè)頂點(diǎn) */<
117、/p><p> /* 操作結(jié)果: 在G中增添弧<v,w>,若G是無向的,則還增添對(duì)稱弧<w,v> */</p><p> int i,l,v1,w1;</p><p> char *info,s[MAX_INFO];</p><p> v1=LocateVex(*G,v); /* 尾 */</p>&
118、lt;p> w1=LocateVex(*G,w); /* 頭 */</p><p> if(v1<0||w1<0)</p><p> return ERROR;</p><p> (*G).arcnum++; /* 弧或邊數(shù)加1 */</p><p> if((*G).kind%2) /* 網(wǎng) */</p&g
119、t;<p><b> {</b></p><p> printf("請(qǐng)輸入此弧或邊的權(quán)值: ");</p><p> scanf("%d",&(*G).arcs[v1][w1].adj);</p><p><b> }</b></p>&l
120、t;p> else /* 圖 */</p><p> (*G).arcs[v1][w1].adj=1;</p><p> printf("是否有該弧或邊的相關(guān)信息(0:無 1:有): ");</p><p> scanf("%d%*c",&i);</p><p><b>
121、 if(i)</b></p><p><b> {</b></p><p> printf("請(qǐng)輸入該弧或邊的相關(guān)信息(<%d個(gè)字符):",MAX_INFO);</p><p><b> gets(s);</b></p><p> l=strlen(s
122、);</p><p><b> if(l)</b></p><p><b> {</b></p><p> info=(char*)malloc((l+1)*sizeof(char));</p><p> strcpy(info,s);</p><p> (*G).
123、arcs[v1][w1].info=info;</p><p><b> }</b></p><p><b> }</b></p><p> if((*G).kind>1) /* 無向 */</p><p><b> {</b></p><p&
124、gt; (*G).arcs[w1][v1].adj=(*G).arcs[v1][w1].adj;</p><p> (*G).arcs[w1][v1].info=(*G).arcs[v1][w1].info; /* 指向同一個(gè)相關(guān)信息 */</p><p><b> }</b></p><p> return OK;</p>
125、<p><b> }</b></p><p> Status DeleteArc(MGraph *G,VertexType v,VertexType w)</p><p> { /* 初始條件: 圖G存在,v和w是G中兩個(gè)頂點(diǎn) */</p><p> /* 操作結(jié)果: 在G中刪除弧<v,w>,若G是無向的,則還
126、刪除對(duì)稱弧<w,v> */</p><p> int v1,w1;</p><p> v1=LocateVex(*G,v); /* 尾 */</p><p> w1=LocateVex(*G,w); /* 頭 */</p><p> if(v1<0||w1<0) /* v1、w1的值不合法 */</p&g
127、t;<p> return ERROR;</p><p> if((*G).kind%2==0) /* 圖 */</p><p> (*G).arcs[v1][w1].adj=0;</p><p> else /* 網(wǎng) */</p><p> (*G).arcs[v1][w1].adj=INFINITY;</p&
128、gt;<p> if((*G).arcs[v1][w1].info) /* 有其它信息 */</p><p><b> {</b></p><p> free((*G).arcs[v1][w1].info);</p><p> (*G).arcs[v1][w1].info=NULL;</p><p>
129、;<b> }</b></p><p> if((*G).kind>=2) /* 無向,刪除對(duì)稱弧<w,v> */</p><p><b> {</b></p><p> (*G).arcs[w1][v1].adj=(*G).arcs[v1][w1].adj;</p><p&g
130、t; (*G).arcs[w1][v1].info=NULL;</p><p><b> }</b></p><p> (*G).arcnum--;</p><p> return OK;</p><p><b> }</b></p><p> Boolean v
131、isited[MAX_VERTEX_NUM]; /* 訪問標(biāo)志數(shù)組(全局量) */</p><p> Status(*VisitFunc)(VertexType); /* 函數(shù)變量 */</p><p> void DFS(MGraph G,int v)</p><p> { /* 從第v個(gè)頂點(diǎn)出發(fā)遞歸地深度優(yōu)先遍歷圖G。算法7.5 */</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)及其應(yīng)用(算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---數(shù)據(jù)結(jié)構(gòu)相關(guān)算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---排序算法比較
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--- 數(shù)據(jù)結(jié)構(gòu)各章算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---迷宮算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法比較
- 算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 算法與數(shù)據(jù)結(jié)構(gòu)-課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告
- 數(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ì)
評(píng)論
0/150
提交評(píng)論