版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 設(shè)計(jì)題目: 圖的基本操作與實(shí)現(xiàn)</p><p> 專 業(yè) </p><p> 班 級(jí) </p><p> 學(xué)
2、 生 </p><p> 學(xué) 號(hào) </p><p> 指導(dǎo)教師 </p><p> 起止時(shí)間 </p><p><b> 年 學(xué)期</b></p><p><b> 目
3、錄</b></p><p> 1.問題描述:實(shí)現(xiàn)圖的一些基本操作3</p><p><b> 2.基本要求:3</b></p><p> (2)求每個(gè)頂點(diǎn)的度,輸出結(jié)果;3</p><p><b> 3.測試數(shù)據(jù):3</b></p><p><
4、;b> 4.算法思想:3</b></p><p> (1)自選存儲(chǔ)結(jié)構(gòu)創(chuàng)建一個(gè)圖:3</p><p> (2)求每個(gè)頂點(diǎn)的度:3</p><p> (3)圖的深度優(yōu)先遍歷:4</p><p> (4)圖的廣度優(yōu)先遍歷:4</p><p> (5)判斷有向圖的強(qiáng)連通性:4<
5、/p><p> (6)用鄰接矩陣的信息生成鄰接表:4</p><p><b> 6.數(shù)據(jù)結(jié)構(gòu):5</b></p><p><b> 7.功能模塊圖7</b></p><p><b> 8.源程序:8</b></p><p> 9.心得體會(huì):
6、28</p><p> 1.問題描述:實(shí)現(xiàn)圖的一些基本操作</p><p><b> 2.基本要求:</b></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)
7、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頂點(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);否則輸出信 息“無x”;</p><
8、;p> (6)判斷圖G是否是連通圖,輸出信息“YES”/“NO”;</p><p> (7)如果選用的存儲(chǔ)結(jié)構(gòu)是鄰接矩陣,則用鄰接矩陣的信息生成圖G的鄰接表,即復(fù)制圖G,然再執(zhí)行操作(2);反之亦然。</p><p><b> 3.測試數(shù)據(jù):</b></p><p> 有向圖的頂點(diǎn)數(shù)n和有向圖的邊數(shù)e由用戶從鍵盤敲入</p&
9、gt;<p><b> 4.算法思想:</b></p><p> (1)自選存儲(chǔ)結(jié)構(gòu)創(chuàng)建一個(gè)圖:通過用戶從鍵盤敲入的兩個(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.鄰接矩陣存儲(chǔ)結(jié)構(gòu)下求每
10、個(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> (3)圖的深度優(yōu)先
11、遍歷:采取鄰接矩陣結(jié)構(gòu),指定任意頂點(diǎn)x為初始頂點(diǎn)</p><p> 1.訪問結(jié)點(diǎn)v并標(biāo)記結(jié)點(diǎn)v已訪問;</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尚未被訪問,則遞歸訪問結(jié)點(diǎn)w;</p><p>
12、 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ì)列以保持訪問過的結(jié)點(diǎn)的順序</p><p> 1.首先訪問初始結(jié)點(diǎn)v并標(biāo)記結(jié)點(diǎn)v為已訪問;</p><p><b> 2.結(jié)點(diǎn)v入隊(duì)列;</b></p><
13、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尚未被訪問,則訪問結(jié)點(diǎn)w并標(biāo)記結(jié)點(diǎn)w為已訪問;</p>
14、<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)用鄰接矩陣的信息生成鄰接表:定義一個(gè)鄰接表的邊信息結(jié)
15、構(gòu)體,將鄰接矩陣的邊信息轉(zhuǎn)換成鄰接表的邊信息存儲(chǔ)到鄰接邊的單鏈表中。</p><p><b> 5.模塊劃分:</b></p><p> mian():主函數(shù)模塊。在主函數(shù)模塊中調(diào)用以下函數(shù):</p><p> void CreatGraph(AdjMGraph *G,DataType v[],int n,RowColWeight E[]
16、,int e):創(chuàng)建一個(gè)鄰接矩陣存儲(chǔ)結(jié)構(gòu)的圖;</p><p> void Print(AdjMGraph *G):輸出圖的鄰接矩陣;</p><p> void MVertices(AdjMGraph *G,DataType a[]):求出鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的每個(gè)頂點(diǎn)的度;</p><p> void CreatLGraph(AdjLGraph *G,Da
17、taType v[],int n,RowCol d[],int e):用鄰接矩陣的信息生成鄰接表;</p><p> void LVertices(AdjLGraph *G,DataType a[]):求出鄰接表存儲(chǔ)結(jié)構(gòu)下圖的每個(gè)頂點(diǎn)的度;</p><p> int LianTong(AdjLGraph *G,DataType a[]):判斷有向圖的強(qiáng)連通性;</p>&
18、lt;p> void DepthFirstSearch(AdjMGraph G,void Visit(DataType item)):對(duì)圖作DFS遍歷,輸出DFS頂點(diǎn)序列;</p><p> void BroadFirstSearch(AdjMGraph G,void Visit(DataType item)):對(duì)圖作BFS遍歷,輸出BFS頂點(diǎn)序列;</p><p> int
19、ChaZhao(AdjMGraph *G,int v):查找頂點(diǎn)v;</p><p> void MDelete(AdjMGraph *G,int v):刪除查找到的結(jié)點(diǎn)v并刪除該結(jié)點(diǎn)及與之相關(guān)的邊;</p><p><b> 6.數(shù)據(jù)結(jié)構(gòu):</b></p><p> (1)有向圖頂點(diǎn)的數(shù)據(jù)類型DataType 定義如下:</p&g
20、t;<p> typedef int DataType ;</p><p> (2)鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義如下:</p><p> typedef struct</p><p><b> {</b></p><p> SeqList Vertices; //存放結(jié)點(diǎn)的順序表</p&
21、gt;<p> int edge[MaxVertices][MaxVertices]; //存放邊的鄰接矩陣</p><p> int numOfEdges; //邊的條數(shù)</p><p> }AdjMGraph; //邊的結(jié)構(gòu)體定義</p><p> (3)鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p&g
22、t; typedef struct</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é)
23、構(gòu)體定義</p><p> (4)鄰接表存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義如下:</p><p> typedef struct Node </p><p><b> {</b></p><p> int dest; //鄰接邊的弧頭結(jié)點(diǎn)序號(hào)</p><p> struct Node *nex
24、t; </p><p> }Edge; //鄰接邊單鏈表的結(jié)點(diǎn)結(jié)構(gòu)體</p><p> typedef struct</p><p><b> {</b></p><p> DataType data; //結(jié)點(diǎn)數(shù)據(jù)元素 </p><p> int sorce; //鄰接邊的弧尾結(jié)
25、點(diǎn)序號(hào)</p><p> Edge *adj; //鄰接邊的頭指針</p><p> }AdjLHeight; //數(shù)組的數(shù)據(jù)元素類型結(jié)構(gòu)體</p><p> typedef struct</p><p><b> {</b></p><p> AdjLHeight a[MaxVert
26、ices]; //鄰接表數(shù)組</p><p> int numOfVerts; //結(jié)點(diǎn)個(gè)數(shù)</p><p> int numOfEdges; //邊個(gè)數(shù)</p><p> }AdjLGraph; //鄰接表結(jié)構(gòu)體</p><p> (5)鄰接表存儲(chǔ)結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p>
27、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> (6)順序循環(huán)隊(duì)列的結(jié)構(gòu)體定義如下:<
28、;/p><p> typedef struct </p><p><b> {</b></p><p> DataType queue[MaxQueueSize];</p><p><b> int rear;</b></p><p> int front;</p
29、><p> int count;</p><p> }SeqCQueue;</p><p> (7)順序表的結(jié)構(gòu)體定義如下:</p><p> typedef struct</p><p><b> {</b></p><p> DataType list[MaxS
30、ize];</p><p><b> int size;</b></p><p><b> }SeqList;</b></p><p><b> 7.功能模塊圖:</b></p><p><b> 8.源程序:</b></p><
31、;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ù),文件AdjLGraphCreate.h是鄰接表存儲(chǔ)結(jié)構(gòu)下圖的創(chuàng)建函
32、數(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><p> Dat
33、aType list[MaxSize];</p><p><b> int size;</b></p><p><b> }SeqList;</b></p><p> void ListInitiate(SeqList *L)</p><p><b> {</b><
34、;/p><p> L->size=0;</p><p><b> }</b></p><p> int ListLength(SeqList L)</p><p><b> {</b></p><p> return L.size;</p><
35、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> if(L->size
36、>=MaxSize)</p><p><b> {</b></p><p> printf("數(shù)組已滿無法插入!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><
37、;p> else if(i<0||i>L->size)</p><p><b> {</b></p><p> printf("參數(shù)不合法!\n");</p><p><b> return 0;</b></p><p><b> }&
38、lt;/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> L->list[i]=x;&l
39、t;/p><p> L->size++;</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> int ListDelete(SeqList *L,
40、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><p> pr
41、intf("順序表已空無數(shù)據(jù)元素可刪!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p> else if(i<0||i>L->size-1)</p><p><b> {&l
42、t;/b></p><p> printf("參數(shù)i不合法!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> else</b></p><p&g
43、t;<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><p><b> re
44、turn 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> int ListGet(SeqList L,int i,DataType *x)</p><p><b> {</b></p>
45、<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><b> }<
46、;/b></p><p><b> else</b></p><p><b> {</b></p><p> *x=L.list[i];</p><p><b> return 1;</b></p><p><b> }<
47、/b></p><p><b> }</b></p><p> (2)/* 文件SeqCQueue.h */</p><p> typedef struct </p><p><b> {</b></p><p> DataType queue[MaxQueu
48、eSize];</p><p><b> int rear;</b></p><p> int front;</p><p> int count;</p><p> }SeqCQueue;</p><p> void QueueInitiate(SeqCQueue *Q)</p&
49、gt;<p><b> {</b></p><p> Q->rear=0;</p><p> Q->front =0;</p><p> Q->count =0;</p><p><b> }</b></p><p> int Qu
50、eueNotEmpty(SeqCQueue Q)</p><p><b> {</b></p><p> if(Q.count !=0) return 1;</p><p> else return 0;</p><p><b> }</b></p><p> i
51、nt QueueAppend(SeqCQueue *Q,DataType x)</p><p><b> {</b></p><p> if(Q->count>0&&Q->rear==Q->front)</p><p><b> {</b></p><p&g
52、t; printf("隊(duì)列已滿無法插入!");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b>&l
53、t;/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></p><p&g
54、t;<b> }</b></p><p><b> }</b></p><p> int QueueDelete(SeqCQueue *Q,DataType *d)</p><p><b> {</b></p><p> if(Q->count ==0)<
55、/p><p><b> {</b></p><p> printf("隊(duì)列已空無數(shù)據(jù)出隊(duì)列!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b>
56、 else</b></p><p><b> {</b></p><p> *d=Q->queue[Q->front];</p><p> Q->front=(Q->front+1)%MaxQueueSize;</p><p> Q->count --;</p&g
57、t;<p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> int QueueGet(SeqCQueue Q,DataType*d)</p><p><b>
58、{</b></p><p> if(Q.count ==0)</p><p><b> {</b></p><p> printf("隊(duì)列已空無數(shù)據(jù)出隊(duì)列!\n");</p><p><b> return 0;</b></p><p>
59、;<b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> *d=Q.queue [Q.front ];</p><p><b> return 1;</b></p>
60、<p><b> }</b></p><p><b> }</b></p><p> (3)/* 文件AdjMGraph.h*/</p><p> #include"SeqList.h"</p><p> typedef struct</p>&
61、lt;p><b> {</b></p><p> SeqList Vertices; //存放結(jié)點(diǎn)的順序表</p><p> int edge[MaxVertices][MaxVertices]; //存放邊的鄰接矩陣</p><p> int numOfEdges; //邊的條數(shù)</p><p>
62、 }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> for(i=0;i<n;i+
63、+)</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><b> else</
64、b></p><p> G->edge[i][j]=MaxWeight;</p><p><b> }</b></p><p> G->numOfEdges=0; //邊的條數(shù)置為0</p><p> ListInitiate(&G->Vertices); //順序表初始化
65、</p><p><b> }</b></p><p> void InsertVertex(AdjMGraph *G,DataType vertex) //在圖G中插入結(jié)點(diǎn)vertex</p><p><b> {</b></p><p> ListInsert(&G->V
66、ertices,G->Vertices.size,vertex); //順序表尾插入</p><p><b> }</b></p><p> void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)</p><p> //在圖G中插入邊<v1,v2>,邊<v1,
67、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></p><p>
68、 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> G->numOfEdges++;
69、</p><p><b> }</b></p><p> void DeleteEdge(AdjMGraph *G,int v1,int v2) //在圖中刪除邊<v1,v2></p><p><b> {</b></p><p> if(v1<0||v1>G-&g
70、t;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);</b></p>
71、;<p><b> }</b></p><p> if(G->edge[v1][v2]==MaxWeight||v1==v2)</p><p><b> {</b></p><p> printf("該邊不存在!\n");</p><p><b&
72、gt; exit(0);</b></p><p><b> }</b></p><p> G->edge[v1][v2]=MaxWeight;</p><p> G->numOfEdges--;</p><p><b> }</b></p><p
73、> 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><p> for(i=
74、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][j]<MaxWeight)&
75、lt;/p><p> G->numOfEdges--; //計(jì)算被刪除邊</p><p><b> }</b></p><p> for(i=v;i<n;i++) //刪除第v行</p><p><b> {</b></p><p> for(j=0;j
76、<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> {</b></p>&l
77、t;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é)點(diǎn)v</p><p
78、><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><p><b> {&
79、lt;/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越界出錯(cuò)!\n");<
80、/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]>0&&G->
81、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> //在圖中尋找v1結(jié)點(diǎn)的鄰接結(jié)點(diǎn)v2的下
82、一個(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><p> if(v1&
83、lt;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); </p><
84、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;</p><p>
85、; return -1;</p><p><b> }</b></p><p> //輸出圖G的鄰接矩陣</p><p> void Print(AdjMGraph *G) </p><p><b> {</b></p><p><b> int i,
86、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> printf("%6d "
87、;,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)的度并輸出</p><p>
88、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> for(i=0;i<G-
89、>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><p><b&
90、gt; {</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> if(i==m&&G
91、->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(j==m&&i!=m
92、&&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><p><b> }
93、</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</p><p>
94、 int ChaZhao(AdjMGraph *G,int v) </p><p><b> {</b></p><p> if(0<=v&&v<G->Vertices.size)</p><p><b> {</b></p><p> printf(&q
95、uot;存在頂點(diǎn)%d\n",v);</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><
96、;p> printf("不存在頂點(diǎn)%d\n",v);</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> //刪除查找到的結(jié)點(diǎn)v并刪除該結(jié)點(diǎn)及與之
97、相關(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.size;i++)</p>
98、<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><p> DeleteEdge(G
99、,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);</p><p>
100、<b> }</b></p><p> DeleteVerten(G,v);//刪除結(jié)點(diǎn)v</p><p><b> }</b></p><p> (4)/* 文件AdjMGraphCreate.h */</p><p> typedef struct</p><p&g
101、t;<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><p> void Cre
102、atGraph(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></p><p&g
103、t; 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,E[k].row,E[k].col,
104、E[k].weight); //邊插入</p><p><b> }</b></p><p> (5)/* 文件AdjLGraph.h */</p><p> //鄰接表的存儲(chǔ)結(jié)構(gòu)</p><p> typedef struct Node </p><p><b> {&l
105、t;/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><b> {</b&g
106、t;</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ù)元素類型結(jié)構(gòu)體</p><p> typed
107、ef 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ù)</p><p&g
108、t; }AdjLGraph; //鄰接表結(jié)構(gòu)體</p><p><b> //初始化操作函數(shù)</b></p><p> void LAdjInitiate(AdjLGraph *G)</p><p><b> {</b></p><p><b> int i;</b>
109、;</p><p> G->numOfVerts=0;</p><p> G->numOfEdges=0;</p><p> for(i=0;i<MaxVertices;i++)</p><p><b> {</b></p><p> G->a[i].sorce=
110、i;</p><p> G->a[i].adj=NULL;</p><p><b> }</b></p><p><b> }</b></p><p><b> //撤銷操作函數(shù)</b></p><p> void LAdjDestroy
111、(AdjLGraph *G)</p><p> //撤銷圖G中的所有鄰接邊單鏈表</p><p><b> {</b></p><p><b> int i;</b></p><p> Edge *p,*q;</p><p> for(i=0;i<G->
112、numOfVerts;i++)</p><p><b> {</b></p><p> p=G->a[i].adj;</p><p> while(p!=NULL)</p><p><b> {</b></p><p> q=p->next;</p
113、><p><b> free(p);</b></p><p><b> p=q;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&
114、lt;/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><b> {</
115、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->numOfVerts++;
116、//個(gè)數(shù)加1</p><p><b> }</b></p><p><b> else</b></p><p> printf("結(jié)點(diǎn)越界");</p><p><b> }</b></p><p><b> //
117、插入邊操作函數(shù)</b></p><p> void LInsertEdge(AdjLGraph *G,int v1,int v2)</p><p> //在圖G中加入邊<v1,v2>的信息</p><p><b> {</b></p><p> Edge *p; //定義一個(gè)鄰接邊指針&
118、lt;/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><b>
119、 exit(0);</b></p><p><b> }</b></p><p> p=(Edge *)malloc(sizeof(Edge)); //申請鄰接邊單鏈表結(jié)點(diǎn)空間</p><p> p->dest=v2; //置鄰接邊弧頭序號(hào)</p><p> p->next=G-&g
120、t;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><b> //刪除邊操作函
121、數(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,*pre;</p>&
122、lt;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><b> exit(0);&
123、lt;/b></p><p><b> }</b></p><p><b> pre=NULL;</b></p><p> curr=G->a[v1].adj;</p><p> while(curr!=NULL&&curr->dest!=v2)</p
124、><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> }</b><
125、;/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><b> {<
126、;/b></p><p> G->a[v1].adj=curr->next;</p><p> free(curr);</p><p> G->numOfEdges--;</p><p><b> }</b></p><p> else if(curr!=NULL
127、&&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;</p><p>
128、 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><p> printf
129、("邊<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的第一個(gè)鄰接結(jié)點(diǎn)</p>
130、<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><b> {<
131、;/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;</p><p> i
132、f(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></p><p>
133、//取下一個(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> {</b></p
134、><p><b> Edge *p;</b></p><p> if(v1<0||v1>G->numOfVerts||v2<0||v2>G->numOfVerts)</p><p><b> {</b></p><p> printf("參數(shù)v1或v
135、2越界出錯(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)v2</p><p&
136、gt;<b> {</b></p><p> if(p->dest!=v2)</p><p><b> {</b></p><p> p=p->next;</p><p><b> continue;</b></p><p><
137、;b> }</b></p><p><b> else</b></p><p><b> break;</b></p><p><b> }</b></p><p> p=p->next; //p指向鄰接結(jié)點(diǎn)v2的下一個(gè)鄰接結(jié)點(diǎn)</p&
138、gt;<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></p
139、><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");</p>&
140、lt;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</p><p>
141、;<b> {</b></p><p> OutDegree[i]=0;</p><p> InDegree[i]=0;</p><p><b> }</b></p><p> Edge *p; //定義一個(gè)鄰接邊指針</p><p> for(i=0;i<
142、;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><b> {</b&
143、gt;</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></p><p&
144、gt;<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><p> prin
145、tf("%d",OutDegree[i]+InDegree[i]); //每個(gè)結(jié)點(diǎn)的度即出度與入度相加的和</p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> //
146、判斷有向圖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<G->numOfVerts;
147、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></p><p>
148、; 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><p><b> }&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(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ù)庫課程設(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è)計(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)論