版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《軟件認(rèn)知實(shí)踐》報(bào)告</p><p> 姓 名: 學(xué) 號(hào): </p><p> 專(zhuān) 業(yè): </p><p> 設(shè)計(jì)題目: </p><p> 指導(dǎo)教師: </p><p&g
2、t; 2013年12月30日</p><p><b> 目 錄</b></p><p> 第1章 題目概述2</p><p> 第1.1節(jié) 題目要求2</p><p> 第1.2節(jié) 主要難點(diǎn)3</p><p> 第2章 系統(tǒng)流程圖4</p><p&g
3、t; 第3章 數(shù)據(jù)結(jié)構(gòu)和算法5</p><p> 第4章 核心代碼分析6</p><p> 第5章 復(fù)雜度分析25</p><p><b> 參考文獻(xiàn)25</b></p><p><b> 題目概述</b></p><p> 第1.1節(jié) 題目要求</
4、p><p> (1)自選存儲(chǔ)結(jié)構(gòu),輸入含n個(gè)頂點(diǎn)(用字符表示頂點(diǎn))和e條邊的圖G;</p><p> (2)求每個(gè)頂點(diǎn)的度,輸出結(jié)果;</p><p> (3)指定任意頂點(diǎn)x為初始頂點(diǎn),對(duì)圖G作DFS遍歷,輸出DFS頂點(diǎn)序列(提示:使用一個(gè)棧實(shí)現(xiàn)DFS);</p><p> (4)指定任意頂點(diǎn)x為初始頂點(diǎn),對(duì)圖G作BFS遍歷,輸出BFS頂
5、點(diǎn)序列(提示:使用一個(gè)隊(duì)列實(shí)現(xiàn)BFS);</p><p> (5)輸入頂點(diǎn)x,查找圖G:若存在含x的頂點(diǎn),則刪除該結(jié)點(diǎn)及與之相關(guān)連的邊,并作DFS遍歷(執(zhí)行操作3);否則輸出信 息“無(wú)x”;</p><p> (6)判斷圖G是否是連通圖,輸出信息“YES”/“NO”;</p><p> (7)如果選用的存儲(chǔ)結(jié)構(gòu)是鄰接矩陣,則用鄰接矩陣的信息生成圖G的鄰接表,即
6、復(fù)制圖G,然再執(zhí)行操作(2);反之亦然。</p><p> 第1.2節(jié) 主要難點(diǎn)</p><p> (1)自選存儲(chǔ)結(jié)構(gòu)創(chuàng)建一個(gè)圖:通過(guò)用戶從鍵盤(pán)敲入的兩個(gè)數(shù)值分別確定圖的頂點(diǎn)數(shù)和邊數(shù),選擇鄰接矩陣存儲(chǔ)結(jié)構(gòu)將圖的結(jié)點(diǎn)信息存儲(chǔ)在一個(gè)順序表中,圖的邊信息存儲(chǔ)在一個(gè)二維數(shù)組中。</p><p> (2)求每個(gè)頂點(diǎn)的度:</p><p> 1.
7、鄰接矩陣存儲(chǔ)結(jié)構(gòu)下求每個(gè)頂點(diǎn)的度:利用圖的鄰接矩陣,每個(gè)頂點(diǎn)所在行和所在列的邊的權(quán)值如果存在則該頂點(diǎn)的度+1,依次算出每個(gè)頂點(diǎn)的度,并且記錄在一個(gè)數(shù)組中輸出。</p><p> 2.鄰接表存儲(chǔ)結(jié)構(gòu)下求每個(gè)頂點(diǎn)的度:定義一個(gè)鄰接邊指針循環(huán)指向頂點(diǎn)的鄰接邊單鏈表頭結(jié)點(diǎn),當(dāng)結(jié)點(diǎn)不空時(shí),該頂點(diǎn)的出度+1,鄰接邊弧頭結(jié)點(diǎn)的入度+1,依次求出每個(gè)頂點(diǎn)的出度和入度之和就為該頂點(diǎn)的度。</p><p>
8、 (3)圖的深度優(yōu)先遍歷:采取鄰接矩陣結(jié)構(gòu),指定任意頂點(diǎn)x為初始頂點(diǎn)</p><p> 1.訪問(wèn)結(jié)點(diǎn)v并標(biāo)記結(jié)點(diǎn)v已訪問(wèn);</p><p> 2.查找結(jié)點(diǎn)v的第一個(gè)鄰接結(jié)點(diǎn)w;</p><p> 3.若結(jié)點(diǎn)v的鄰接結(jié)點(diǎn)w存在,則繼續(xù)執(zhí)行,否則算法結(jié)束;</p><p> 4.若結(jié)點(diǎn)w尚未被訪問(wèn),則遞歸訪問(wèn)結(jié)點(diǎn)w;</p>
9、<p> 5.查找結(jié)點(diǎn)v的w鄰接結(jié)點(diǎn)的下一個(gè)鄰接結(jié)點(diǎn)w,轉(zhuǎn)到步驟3。</p><p> (4)圖的廣度優(yōu)先遍歷:采取鄰接矩陣結(jié)構(gòu),指定任意頂點(diǎn)x為初始頂點(diǎn),利用順序循環(huán)隊(duì)列以保持訪問(wèn)過(guò)的結(jié)點(diǎn)的順序</p><p> 1.首先訪問(wèn)初始結(jié)點(diǎn)v并標(biāo)記結(jié)點(diǎn)v為已訪問(wèn);</p><p><b> 2.結(jié)點(diǎn)v入隊(duì)列;</b></
10、p><p> 3.當(dāng)隊(duì)列非空時(shí)則繼續(xù)執(zhí)行,否則算法結(jié)束;</p><p> 4.出隊(duì)列取得隊(duì)頭結(jié)點(diǎn)u;</p><p> 5.查找u的第一個(gè)鄰接結(jié)點(diǎn)w;</p><p> 6.若u的鄰接結(jié)點(diǎn)w不存在則轉(zhuǎn)到步驟3,否則循環(huán)執(zhí)行下列步驟:</p><p> 6.1若結(jié)點(diǎn)w尚未被訪問(wèn),則訪問(wèn)結(jié)點(diǎn)w并標(biāo)記結(jié)點(diǎn)w為已訪問(wèn);
11、</p><p> 6.2結(jié)點(diǎn)w入隊(duì)列;</p><p> 6.3查找結(jié)點(diǎn)u的w鄰接結(jié)點(diǎn)的下一個(gè)鄰接結(jié)點(diǎn)w,轉(zhuǎn)到步驟6 。</p><p> (5)判斷有向圖的強(qiáng)連通性:采取鄰接表結(jié)構(gòu),在圖中尋找一個(gè)包含所有頂點(diǎn)且首尾相連的環(huán),若這樣的環(huán)存在,則該圖為強(qiáng)連通圖,否則不為強(qiáng)連通圖。</p><p> (6)用鄰接矩陣的信息生成鄰接表:定
12、義一個(gè)鄰接表的邊信息結(jié)構(gòu)體,將鄰接矩陣的邊信息轉(zhuǎn)換成鄰接表的邊信息存儲(chǔ)到鄰接邊的單鏈表中。</p><p><b> 第二章 系統(tǒng)流程圖</b></p><p><b> 數(shù)據(jù)結(jié)構(gòu)和算法</b></p><p> (1)有向圖頂點(diǎn)的數(shù)據(jù)類(lèi)型DataType 定義如下:</p><p> ty
13、pedef int DataType ;</p><p> (2)鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義如下:</p><p> typedef struct</p><p><b> {</b></p><p> SeqList Vertices; </p><p> int edge[Ma
14、xVertices][MaxVertices];</p><p> int numOfEdges; </p><p> }AdjMGraph; </p><p> (3)鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p> typedef struct</p><p><b> {<
15、;/b></p><p><b> int row; </b></p><p><b> int col; </b></p><p> int weight; </p><p> }RowColWeight; </p><p> (4)鄰接表存儲(chǔ)結(jié)構(gòu)下圖的
16、結(jié)構(gòu)體定義如下:</p><p> typedef struct Node </p><p><b> {</b></p><p> int dest; </p><p> struct Node *next; </p><p><b> }Edge; </b>
17、;</p><p> typedef struct</p><p><b> {</b></p><p> DataType data; </p><p> int sorce; </p><p> Edge *adj; </p><p> }AdjLH
18、eight; </p><p> typedef struct</p><p><b> {</b></p><p> AdjLHeight a[MaxVertices]; </p><p> int numOfVerts; </p><p> int numOfEdges; &l
19、t;/p><p> }AdjLGraph; </p><p> (5)鄰接表存儲(chǔ)結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p> typedef struct</p><p><b> {</b></p><p> int row; </p><p> int
20、 col; </p><p> }RowCol; </p><p> (6)順序循環(huán)隊(duì)列的結(jié)構(gòu)體定義如下:</p><p> typedef struct </p><p><b> {</b></p><p> DataType queue[MaxQueueSize];</p
21、><p><b> int rear;</b></p><p> int front;</p><p> int count;</p><p> }SeqCQueue;</p><p> (7)順序表的結(jié)構(gòu)體定義如下:</p><p> typedef struct
22、</p><p><b> {</b></p><p> DataType list[MaxSize];</p><p><b> int size;</b></p><p><b> }SeqList;</b></p><p> 第四章 核心
23、代碼分析</p><p> 源程序存放在八個(gè)文件夾中,文件SeqList.h是順序表的結(jié)構(gòu)體定義和操作函數(shù),文件SeqCQueue.h是順序循環(huán)隊(duì)列的結(jié)構(gòu)體定義和操作函數(shù),文件AdjMGraph.h是鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義和操作函數(shù),文件AdjMGraphCreate.h是鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的創(chuàng)建函數(shù),文件AdjLGraph.h是鄰接表存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義和操作函數(shù),文件AdjLGraphCre
24、ate.h是鄰接表存儲(chǔ)結(jié)構(gòu)下圖的創(chuàng)建函數(shù),文件AdjMGraphTraverse.h是鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷操作函數(shù),文件圖的基本操作與實(shí)現(xiàn).c是主函數(shù)。</p><p> (1)/* 文件SeqList.h */</p><p> typedef struct</p><p><b> {</b></p&
25、gt;<p> DataType list[MaxSize];</p><p><b> int size;</b></p><p><b> }SeqList;</b></p><p> void ListInitiate(SeqList *L)</p><p><b&
26、gt; {</b></p><p> L->size=0;</p><p><b> }</b></p><p> int ListLength(SeqList L)</p><p><b> {</b></p><p> return L.si
27、ze;</p><p><b> }</b></p><p> int ListInsert(SeqList *L,int i,DataType x)</p><p><b> {</b></p><p><b> int j;</b></p><p
28、> if(L->size>=MaxSize)</p><p><b> {</b></p><p> printf("數(shù)組已滿無(wú)法插入!\n");</p><p><b> return 0;</b></p><p><b> }</b
29、></p><p> else if(i<0||i>L->size)</p><p><b> {</b></p><p> printf("參數(shù)不合法!\n");</p><p><b> return 0;</b></p><
30、;p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(j=L->size;j>i;i--)L->list[j]=L->list[j-1];</p><p>
31、 L->list[i]=x;</p><p> L->size++;</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> int Lis
32、tDelete(SeqList *L,int i,DataType *x)</p><p><b> {</b></p><p><b> int j;</b></p><p> if(L->size<=0)</p><p><b> {</b></p
33、><p> printf("順序表已空無(wú)數(shù)據(jù)元素可刪!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p> else if(i<0||i>L->size-1)</p><
34、p><b> {</b></p><p> printf("參數(shù)i不合法!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> else</b>
35、</p><p><b> {</b></p><p> *x=L->list[i];</p><p> for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];</p><p> L->size--;</p><
36、;p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> int ListGet(SeqList L,int i,DataType *x)</p><p><b> {&l
37、t;/b></p><p> if(i<0||i>L.size-1)</p><p><b> {</b></p><p> printf("參數(shù)i不合法!\n");</p><p><b> return 0;</b></p><p
38、><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> *x=L.list[i];</p><p><b> return 1;</b></p><p&
39、gt;<b> }</b></p><p><b> }</b></p><p> (2)/* 文件SeqCQueue.h */</p><p> typedef struct </p><p><b> {</b></p><p> Dat
40、aType queue[MaxQueueSize];</p><p><b> int rear;</b></p><p> int front;</p><p> int count;</p><p> }SeqCQueue;</p><p> void QueueInitiate(S
41、eqCQueue *Q)</p><p><b> {</b></p><p> Q->rear=0;</p><p> Q->front =0;</p><p> Q->count =0;</p><p><b> }</b></p>
42、<p> int QueueNotEmpty(SeqCQueue Q)</p><p><b> {</b></p><p> if(Q.count !=0) return 1;</p><p> else return 0;</p><p><b> }</b></
43、p><p> int QueueAppend(SeqCQueue *Q,DataType x)</p><p><b> {</b></p><p> if(Q->count>0&&Q->rear==Q->front)</p><p><b> {</b>
44、</p><p> printf("隊(duì)列已滿無(wú)法插入!");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> else </b></p><p><b
45、> {</b></p><p> Q->queue [Q->rear]=x;</p><p> Q->rear =(Q->rear +1)%MaxQueueSize;</p><p> Q->count ++;</p><p><b> return 1;</b>
46、</p><p><b> }</b></p><p><b> }</b></p><p> int QueueDelete(SeqCQueue *Q,DataType *d)</p><p><b> {</b></p><p> if(Q
47、->count ==0)</p><p><b> {</b></p><p> printf("隊(duì)列已空無(wú)數(shù)據(jù)出隊(duì)列!\n");</p><p><b> return 0;</b></p><p><b> }</b></p>
48、<p><b> else</b></p><p><b> {</b></p><p> *d=Q->queue[Q->front];</p><p> Q->front=(Q->front+1)%MaxQueueSize;</p><p> Q-&g
49、t;count --;</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> int QueueGet(SeqCQueue Q,DataType*d)</p>&
50、lt;p><b> {</b></p><p> if(Q.count ==0)</p><p><b> {</b></p><p> printf("隊(duì)列已空無(wú)數(shù)據(jù)出隊(duì)列!\n");</p><p><b> return 0;</b>&
51、lt;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> *d=Q.queue [Q.front ];</p><p><b> return 1;<
52、;/b></p><p><b> }</b></p><p><b> }</b></p><p> (3)/* 文件AdjMGraph.h*/</p><p> #include"SeqList.h"</p><p> typedef
53、struct</p><p><b> {</b></p><p> SeqList Vertices; //存放結(jié)點(diǎn)的順序表</p><p> int edge[MaxVertices][MaxVertices]; //存放邊的鄰接矩陣</p><p> int numOfEdges; //邊的條數(shù)<
54、;/p><p> }AdjMGraph; //邊的結(jié)構(gòu)體定義</p><p> void Initiate(AdjMGraph *G,int n) //初始化</p><p><b> {</b></p><p><b> int i,j;</b></p><p>
55、 for(i=0;i<n;i++)</p><p> for(j=0;j<n;j++)</p><p><b> {</b></p><p><b> if(i==j)</b></p><p> G->edge[i][j]=0;</p><p>&
56、lt;b> else</b></p><p> G->edge[i][j]=MaxWeight;</p><p><b> }</b></p><p> G->numOfEdges=0; //邊的條數(shù)置為0</p><p> ListInitiate(&G->V
57、ertices); //順序表初始化</p><p><b> }</b></p><p> void InsertVertex(AdjMGraph *G,DataType vertex) //在圖G中插入結(jié)點(diǎn)vertex</p><p><b> {</b></p><p> List
58、Insert(&G->Vertices,G->Vertices.size,vertex); //順序表尾插入</p><p><b> }</b></p><p> void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)</p><p> //在圖G中插入邊<
59、;v1,v2>,邊<v1,v2>的權(quán)為weight</p><p><b> {</b></p><p> if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size)</p><p><b> {</b><
60、;/p><p> printf("參數(shù)v1或v2越界出錯(cuò)!\n");</p><p><b> exit(1);</b></p><p><b> }</b></p><p> G->edge[v1][v2]=weight;</p><p>
61、G->numOfEdges++;</p><p><b> }</b></p><p> void DeleteEdge(AdjMGraph *G,int v1,int v2) //在圖中刪除邊<v1,v2></p><p><b> {</b></p><p> if(
62、v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size||v1==v2)</p><p><b> {</b></p><p> printf("參數(shù)v1或v2越界出錯(cuò)!\n");</p><p><b> exit(1);
63、</b></p><p><b> }</b></p><p> if(G->edge[v1][v2]==MaxWeight||v1==v2)</p><p><b> {</b></p><p> printf("該邊不存在!\n");</p&g
64、t;<p><b> exit(0);</b></p><p><b> }</b></p><p> G->edge[v1][v2]=MaxWeight;</p><p> G->numOfEdges--;</p><p><b> }</b&g
65、t;</p><p> void DeleteVerten(AdjMGraph *G,int v) //刪除結(jié)點(diǎn)v</p><p><b> {</b></p><p> int n=ListLength(G->Vertices),i,j; </p><p> DataType x;</p>
66、<p> for(i=0;i<n;i++) //計(jì)算刪除后的邊數(shù)</p><p><b> {</b></p><p> for(j=0;j<n;j++)</p><p> if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i
67、][j]<MaxWeight)</p><p> G->numOfEdges--; //計(jì)算被刪除邊</p><p><b> }</b></p><p> for(i=v;i<n;i++) //刪除第v行</p><p><b> {</b></p>&
68、lt;p> for(j=0;j<n;j++)</p><p> G->edge[i][j]=G->edge[i+1][j];</p><p><b> }</b></p><p> for(i=0;i<n;i++) //刪除第v列</p><p><b> {</
69、b></p><p> for(j=v;j<n;j++)</p><p> G->edge[i][j]=G->edge[i][j+1];</p><p><b> }</b></p><p> ListDelete(&G->Vertices,v,&x); //刪除結(jié)
70、點(diǎn)v</p><p><b> }</b></p><p> int GetFistVex(AdjMGraph *G,int v) </p><p> //在圖G中尋找序號(hào)為v的結(jié)點(diǎn)的第一個(gè)鄰接結(jié)點(diǎn)</p><p> //如果這樣的鄰接結(jié)點(diǎn)存在,返回該鄰接結(jié)點(diǎn)的序號(hào);否則,返回-1</p><
71、;p><b> {</b></p><p><b> int col;</b></p><p> if(v<0||v>G->Vertices.size)</p><p><b> {</b></p><p> printf("參數(shù)v1
72、越界出錯(cuò)!\n");</p><p><b> exit(1);</b></p><p><b> }</b></p><p> for(col=0;col<G->Vertices.size;col++)</p><p> if(G->edge[v][col]&g
73、t;0&&G->edge[v][col]<MaxWeight)return col;</p><p> return -1;</p><p><b> }</b></p><p> int GetNextVex(AdjMGraph*G,int v1,int v2)</p><p> /
74、/在圖中尋找v1結(jié)點(diǎn)的鄰接結(jié)點(diǎn)v2的下一個(gè)鄰接結(jié)點(diǎn)</p><p> //如果這樣的結(jié)點(diǎn)存在,返回該鄰接結(jié)點(diǎn)的序號(hào);否則,返回-1</p><p> //v1和v2都是相應(yīng)結(jié)點(diǎn)的序號(hào)</p><p><b> {</b></p><p><b> int col;</b></p>
75、<p> if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size)</p><p><b> {</b></p><p> printf("參數(shù)v1或v2越界出錯(cuò)!\n");</p><p> exit(1);
76、 </p><p><b> }</b></p><p> for(col=v2+1;col<G->Vertices.size;col++)</p><p> if(G->edge[v1][col]>0&&G->edge[v1][col]<MaxWeight)return col;&
77、lt;/p><p> return -1;</p><p><b> }</b></p><p> //輸出圖G的鄰接矩陣</p><p> void Print(AdjMGraph *G) </p><p><b> {</b></p><p&g
78、t;<b> int i,j;</b></p><p> for(i=0;i<G->Vertices.size;i++)</p><p><b> {</b></p><p> for(j=0;j<G->Vertices.size;j++)</p><p> pri
79、ntf("%6d ",G->edge[i][j]);</p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> //鄰接矩陣存儲(chǔ)結(jié)構(gòu)下求出每個(gè)頂點(diǎn)的度并輸出<
80、/p><p> void MVertices(AdjMGraph *G,DataType a[]) </p><p><b> {</b></p><p> int i,j,m;</p><p> DataType b[MaxVertices];//用數(shù)組b[]記錄相應(yīng)結(jié)點(diǎn)的度</p><p&g
81、t; for(i=0;i<G->Vertices.size;i++)</p><p> b[i]=0; //置0</p><p> printf("鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的頂點(diǎn)的度為:\n");</p><p> for(m=0;m<G->Vertices.size;m++) //求出每個(gè)結(jié)點(diǎn)的度</p&g
82、t;<p><b> {</b></p><p> for(i=0;i<G->Vertices.size;i++)</p><p> for(j=0;j<G->Vertices.size;j++)</p><p><b> {</b></p><p>
83、 if(i==m&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight)</p><p> //求出鄰接矩陣第i行權(quán)值存在的邊的個(gè)數(shù),當(dāng)邊<m,j>存在時(shí),b[m]加1</p><p><b> b[m]++;</b></p><p> if
84、(j==m&&i!=m&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight)</p><p> //求出鄰接矩陣第j列權(quán)值存在的邊的個(gè)數(shù),當(dāng)邊<i,m>存在時(shí),b[m]加1</p><p><b> b[m]++;</b></p>&l
85、t;p><b> }</b></p><p> printf("頂點(diǎn)%d的度為:%d\n",a[m],b[m]);</p><p><b> }</b></p><p><b> }</b></p><p> //查找圖G中是否存在點(diǎn)v<
86、;/p><p> int ChaZhao(AdjMGraph *G,int v) </p><p><b> {</b></p><p> if(0<=v&&v<G->Vertices.size)</p><p><b> {</b></p>&
87、lt;p> printf("存在頂點(diǎn)%d\n",v);</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b
88、></p><p> printf("不存在頂點(diǎn)%d\n",v);</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> /
89、/刪除查找到的結(jié)點(diǎn)v并刪除該結(jié)點(diǎn)及與之相關(guān)的邊</p><p> void MDelete(AdjMGraph *G,int v)</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=0;i<G->Vertices.
90、size;i++)</p><p><b> {</b></p><p> if(G->edge[v][i]>0&&G->edge[v][i]<MaxWeight)</p><p> //當(dāng)鄰接矩陣的第v行有邊<v,i>存在時(shí),刪除邊<v,i></p><
91、p> DeleteEdge(G,v,i);</p><p> if(G->edge[i][v]>0&&G->edge[i][v]<MaxWeight)</p><p> //當(dāng)鄰接矩陣的第j行有邊<i,v>存在時(shí),刪除邊<i,v></p><p> DeleteEdge(G,i,v);&l
92、t;/p><p><b> }</b></p><p> DeleteVerten(G,v);//刪除結(jié)點(diǎn)v</p><p><b> }</b></p><p> (4)/* 文件AdjMGraphCreate.h */</p><p> typedef struct
93、</p><p><b> {</b></p><p> int row; //行下標(biāo)</p><p> int col; //列下標(biāo)</p><p> int weight; //權(quán)值</p><p> }RowColWeight; //邊信息結(jié)構(gòu)體定義</p>
94、<p> void CreatGraph(AdjMGraph *G,DataType v[],int n,RowColWeight E[],int e)</p><p> //在圖G中插入n個(gè)結(jié)點(diǎn)信息v和e條邊信息E</p><p><b> {</b></p><p><b> int i,k;</b>
95、</p><p> Initiate(G,n); //結(jié)點(diǎn)順序表初始化</p><p> for(i=0;i<n;i++)</p><p> InsertVertex(G,v[i]); //結(jié)點(diǎn)插入</p><p> for(k=0;k<e;k++)</p><p> InsertEdge(G
96、,E[k].row,E[k].col,E[k].weight); //邊插入</p><p><b> }</b></p><p> (5)/* 文件AdjLGraph.h */</p><p> //鄰接表的存儲(chǔ)結(jié)構(gòu)</p><p> typedef struct Node </p><
97、p><b> {</b></p><p> int dest; //鄰接邊的弧頭結(jié)點(diǎn)序號(hào)</p><p> struct Node *next; </p><p> }Edge; //鄰接邊單鏈表的結(jié)點(diǎn)結(jié)構(gòu)體</p><p> typedef struct</p><p>&
98、lt;b> {</b></p><p> DataType data; //結(jié)點(diǎn)數(shù)據(jù)元素 </p><p> int sorce; //鄰接邊的弧尾結(jié)點(diǎn)序號(hào)</p><p> Edge *adj; //鄰接邊的頭指針</p><p> }AdjLHeight; //數(shù)組的數(shù)據(jù)元素類(lèi)型結(jié)構(gòu)體</p>
99、;<p> typedef struct</p><p><b> {</b></p><p> AdjLHeight a[MaxVertices]; //鄰接表數(shù)組</p><p> int numOfVerts; //結(jié)點(diǎn)個(gè)數(shù)</p><p> int numOfEdges; //邊個(gè)數(shù)
100、</p><p> }AdjLGraph; //鄰接表結(jié)構(gòu)體</p><p><b> //初始化操作函數(shù)</b></p><p> void LAdjInitiate(AdjLGraph *G)</p><p><b> {</b></p><p><b&g
101、t; int i;</b></p><p> G->numOfVerts=0;</p><p> G->numOfEdges=0;</p><p> for(i=0;i<MaxVertices;i++)</p><p><b> {</b></p><p>
102、 G->a[i].sorce=i;</p><p> G->a[i].adj=NULL;</p><p><b> }</b></p><p><b> }</b></p><p><b> //撤銷(xiāo)操作函數(shù)</b></p><p>
103、; void LAdjDestroy(AdjLGraph *G)</p><p> //撤銷(xiāo)圖G中的所有鄰接邊單鏈表</p><p><b> {</b></p><p><b> int i;</b></p><p> Edge *p,*q;</p><p>
104、for(i=0;i<G->numOfVerts;i++)</p><p><b> {</b></p><p> p=G->a[i].adj;</p><p> while(p!=NULL)</p><p><b> {</b></p><p>
105、q=p->next;</p><p><b> free(p);</b></p><p><b> p=q;</b></p><p><b> }</b></p><p><b> }</b></p><p><
106、b> }</b></p><p> //插入結(jié)點(diǎn)操作函數(shù)</p><p> void LInsertVertex(AdjLGraph *G,int i,DataType vertex)</p><p> //在圖G中的第i(0<=i<MaxVertices)個(gè)位置插入結(jié)點(diǎn)數(shù)據(jù)元素vertex</p><p&g
107、t;<b> {</b></p><p> if(i>=0&&i<MaxVertices)</p><p><b> {</b></p><p> G->a[i].data=vertex; //存儲(chǔ)結(jié)點(diǎn)數(shù)據(jù)元素vertex</p><p> G->
108、numOfVerts++; //個(gè)數(shù)加1</p><p><b> }</b></p><p><b> else</b></p><p> printf("結(jié)點(diǎn)越界");</p><p><b> }</b></p><
109、;p><b> //插入邊操作函數(shù)</b></p><p> void LInsertEdge(AdjLGraph *G,int v1,int v2)</p><p> //在圖G中加入邊<v1,v2>的信息</p><p><b> {</b></p><p> Edg
110、e *p; //定義一個(gè)鄰接邊指針</p><p> if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts)</p><p><b> {</b></p><p> printf("參數(shù)v1或v2越界出錯(cuò)");</p>
111、<p><b> exit(0);</b></p><p><b> }</b></p><p> p=(Edge *)malloc(sizeof(Edge)); //申請(qǐng)鄰接邊單鏈表結(jié)點(diǎn)空間</p><p> p->dest=v2; //置鄰接邊弧頭序號(hào)</p><p&g
112、t; p->next=G->a[v1].adj; //新結(jié)點(diǎn)插入單鏈表的表頭</p><p> G->a[v1].adj=p; //頭指針指向新的單鏈表表頭</p><p> G->numOfEdges++; //邊數(shù)個(gè)數(shù)加1</p><p><b> } </b></p><p>
113、<b> //刪除邊操作函數(shù)</b></p><p> void LDeleteEdge(AdjLGraph *G,int v1,int v2)</p><p> //刪除圖G中的邊<v1,v2>信息</p><p><b> {</b></p><p> Edge *curr
114、,*pre;</p><p> if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts)</p><p><b> {</b></p><p> printf("參數(shù)v1或v2越界出錯(cuò)!");</p><p>&
115、lt;b> exit(0);</b></p><p><b> }</b></p><p><b> pre=NULL;</b></p><p> curr=G->a[v1].adj;</p><p> while(curr!=NULL&&curr-
116、>dest!=v2)</p><p> //在v1結(jié)點(diǎn)的鄰接邊單鏈表中查找v2結(jié)點(diǎn)</p><p><b> {</b></p><p><b> pre=curr;</b></p><p> curr=curr->next;</p><p><b&
117、gt; }</b></p><p> //刪除表示鄰接邊<v1,v2>的結(jié)點(diǎn)</p><p> if(curr!=NULL&&curr->dest==v2&&pre==NULL)</p><p> //當(dāng)鄰接邊<v1,v2>的結(jié)點(diǎn)是單鏈表的第一個(gè)結(jié)點(diǎn)時(shí)</p><p
118、><b> {</b></p><p> G->a[v1].adj=curr->next;</p><p> free(curr);</p><p> G->numOfEdges--;</p><p><b> }</b></p><p>
119、 else if(curr!=NULL&&curr->dest==v2&&pre!=NULL)</p><p> //當(dāng)鄰接邊<v1,v2>的結(jié)點(diǎn)不是單鏈表的第一個(gè)結(jié)點(diǎn)時(shí)</p><p><b> {</b></p><p> pre->next=curr->next;<
120、;/p><p> free(curr);</p><p> G->numOfEdges--;</p><p><b> }</b></p><p><b> else</b></p><p> //當(dāng)鄰接邊<v1,v2>結(jié)點(diǎn)不存在時(shí)</p>
121、<p> printf("邊<v1,v2>不存在時(shí)");</p><p><b> }</b></p><p> //取第一個(gè)鄰接結(jié)點(diǎn)</p><p> int LGetFirstVex(AdjLGraph *G,int v)</p><p> //取圖G中結(jié)點(diǎn)v的
122、第一個(gè)鄰接結(jié)點(diǎn)</p><p> //取到時(shí)返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào),否則返回-1</p><p><b> {</b></p><p><b> Edge *p;</b></p><p> if(v<0||v>G->numOfVerts)</p><p
123、><b> {</b></p><p> printf("參數(shù)v1或v2越界出錯(cuò)!");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> p=G->a[v].adj;</
124、p><p> if(p!=NULL)</p><p> return p->dest; //返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào)</p><p><b> else</b></p><p> return -1; //返回-1</p><p><b> }</b><
125、/p><p> //取下一個(gè)鄰接結(jié)點(diǎn)</p><p> int LGetNextVex(AdjLGraph *G,int v1,int v2)</p><p> //取圖G中結(jié)點(diǎn)v1的鄰接結(jié)點(diǎn)v2的下一個(gè)鄰接結(jié)點(diǎn)</p><p> //取到時(shí)返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào),否則返回-1</p><p><b>
126、 {</b></p><p><b> Edge *p;</b></p><p> if(v1<0||v1>G->numOfVerts||v2<0||v2>G->numOfVerts)</p><p><b> {</b></p><p>
127、printf("參數(shù)v1或v2越界出錯(cuò)!");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> p=G->a[v1].adj;</p><p> while(p!=NULL) //尋找結(jié)點(diǎn)v1的鄰接結(jié)點(diǎn)v
128、2</p><p><b> {</b></p><p> if(p->dest!=v2)</p><p><b> {</b></p><p> p=p->next;</p><p><b> continue;</b></
129、p><p><b> }</b></p><p><b> else</b></p><p><b> break;</b></p><p><b> }</b></p><p> p=p->next; //p指向鄰接
130、結(jié)點(diǎn)v2的下一個(gè)鄰接結(jié)點(diǎn)</p><p> if(p!=NULL)</p><p> return p->dest; //返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào)</p><p><b> else</b></p><p> return -1; //返回-1</p><p><b>
131、 }</b></p><p> //鄰接表存儲(chǔ)下求每個(gè)頂點(diǎn)的度并輸出結(jié)果</p><p> void LVertices(AdjLGraph *G,DataType a[])</p><p><b> {</b></p><p> printf("鄰接表存儲(chǔ)結(jié)構(gòu)下的圖的頂點(diǎn)的度為:\n&q
132、uot;);</p><p> int OutDegree[MaxVertices],InDegree[MaxVertices];//定義一個(gè)出度和入度的數(shù)組</p><p><b> int i;</b></p><p> for(i=0;i<G->numOfVerts;i++) //首先將出度和入度數(shù)組的每個(gè)成員都置0&
133、lt;/p><p><b> {</b></p><p> OutDegree[i]=0;</p><p> InDegree[i]=0;</p><p><b> }</b></p><p> Edge *p; //定義一個(gè)鄰接邊指針</p><
134、p> for(i=0;i<G->numOfVerts;i++)</p><p><b> {</b></p><p> p=G->a[i].adj; //指針指向a[i]的鄰接邊單鏈表頭結(jié)點(diǎn)</p><p> while(p!=NULL)//當(dāng)p所指向的鄰接邊結(jié)點(diǎn)不空時(shí)</p><p>
135、<b> {</b></p><p> OutDegree[i]++; //出度加1</p><p> InDegree[p->dest]++; //鄰接邊弧頭結(jié)點(diǎn)的入度加1</p><p> p=p->next; //p指向下一個(gè)鄰接邊結(jié)點(diǎn)</p><p><b> }</b>
136、;</p><p><b> }</b></p><p> for(i=0;i<G->numOfVerts;i++) //輸出每個(gè)結(jié)點(diǎn)的度</p><p><b> {</b></p><p> printf("頂點(diǎn)%d的度為:",a[i]);</p&g
137、t;<p> printf("%d",OutDegree[i]+InDegree[i]); //每個(gè)結(jié)點(diǎn)的度即出度與入度相加的和</p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p
138、><p> //判斷有向圖G是否為強(qiáng)連通圖</p><p> int LianTong(AdjLGraph *G,DataType a[]) </p><p><b> {</b></p><p> int i,b[MaxVertices],k=0;</p><p> for(i=0;i&l
139、t;G->numOfVerts;i++)</p><p><b> b[i]=0;</b></p><p> Edge *q,*p; //定義一個(gè)鄰接邊指針</p><p> for(i=0;i<G->numOfVerts;i++)</p><p><b> {</b>&
140、lt;/p><p> q=G->a[i].adj;</p><p> while(q!=NULL)</p><p><b> {</b></p><p><b> b[i]++;</b></p><p> q=q->next;</p><
141、p><b> }</b></p><p><b> }</b></p><p> for(i=0;i<G->numOfVerts;i++)</p><p><b> {</b></p><p> if(b[i]==1)</p><
142、p><b> k++;</b></p><p><b> }</b></p><p> p=G->a[G->numOfVerts-1].adj;</p><p> if(k==G->numOfVerts&&p->dest==a[0])</p><p&
143、gt;<b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> (6)/* 文件AdjLGraphCreate.
144、h */</p><p> typedef struct</p><p><b> {</b></p><p> int row; //行下標(biāo)</p><p> int col; //列下標(biāo)</p><p> }RowCol; //邊信息結(jié)構(gòu)體定義</p><p
145、> void CreatLGraph(AdjLGraph *G,DataType v[],int n,RowCol d[],int e)</p><p><b> {</b></p><p><b> int i,k;</b></p><p> LAdjInitiate(G);</p><
146、p> for(i=0;i<n;i++)</p><p> LInsertVertex(G,i,v[i]);</p><p> for(k=0;k<e;k++)</p><p> LInsertEdge(G,d[k].row,d[k].col);</p><p><b> }</b></p
147、><p> (7)/* 文件AdjMGraphTraverse.h */</p><p> void Visit(DataType item)</p><p><b> {</b></p><p> printf("%d ",item);</p><p><b>
148、 }</b></p><p> void DepthFSearch(AdjMGraph G,int v,int visited[],void Visit(DataType item))</p><p> //連通圖G以v為初始結(jié)點(diǎn)的訪問(wèn)操作為Visit()的深度優(yōu)先遍歷</p><p> //數(shù)組visited標(biāo)記了相應(yīng)結(jié)點(diǎn)是否已訪問(wèn)過(guò),0表示未
149、訪問(wèn),1表示已訪問(wèn)</p><p><b> {</b></p><p><b> int w;</b></p><p> Visit(G.Vertices.list[v]); //訪問(wèn)結(jié)點(diǎn)v</p><p> visited[v]=1; //置已訪問(wèn)標(biāo)記</p><
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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í)現(xiàn)的課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---skiplist基本操作
- 對(duì)于串及其基本操作的課程設(shè)計(jì)
- 課程設(shè)計(jì)--靜態(tài)查找的實(shí)現(xiàn)操作
- 串的存儲(chǔ)表示及基本操作_課程設(shè)計(jì)
- 數(shù)據(jù)庫(kù)課程設(shè)計(jì)---串的基本操作
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---進(jìn)程調(diào)度的模擬實(shí)現(xiàn)
- 課程設(shè)計(jì)--《哈希表的操作》設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告---圖的算法實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 《matlab課程設(shè)計(jì)》報(bào)告-matlab的基本運(yùn)算與繪圖
- 操作系統(tǒng)課程設(shè)計(jì)-- geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 二叉樹(shù)的基本操作課程設(shè)計(jì)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 課程設(shè)計(jì)報(bào)告---排序算法的實(shí)現(xiàn)與比較
- 文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告-操作系統(tǒng)模擬實(shí)現(xiàn)
- 課程設(shè)計(jì)--實(shí)現(xiàn)字符串的多種操作
- 課程設(shè)計(jì)報(bào)告--校園導(dǎo)游系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論