![圖的深度廣度優(yōu)先遍歷操作代碼_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/993adfc9-c111-49d1-b111-e7d689eb38bc/993adfc9-c111-49d1-b111-e7d689eb38bc1.gif)
![圖的深度廣度優(yōu)先遍歷操作代碼_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/993adfc9-c111-49d1-b111-e7d689eb38bc/993adfc9-c111-49d1-b111-e7d689eb38bc2.gif)
![圖的深度廣度優(yōu)先遍歷操作代碼_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/993adfc9-c111-49d1-b111-e7d689eb38bc/993adfc9-c111-49d1-b111-e7d689eb38bc3.gif)
![圖的深度廣度優(yōu)先遍歷操作代碼_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/993adfc9-c111-49d1-b111-e7d689eb38bc/993adfc9-c111-49d1-b111-e7d689eb38bc4.gif)
![圖的深度廣度優(yōu)先遍歷操作代碼_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/993adfc9-c111-49d1-b111-e7d689eb38bc/993adfc9-c111-49d1-b111-e7d689eb38bc5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、實驗?zāi)康?掌握圖的各種存儲結(jié)構(gòu),特別要熟練掌握鄰接矩陣和鄰接表存儲結(jié)構(gòu);2遍歷是圖各種應(yīng)用的算法的基礎(chǔ),要熟練掌握圖的深度優(yōu)先遍歷和寬度優(yōu)先遍歷算法,復(fù)習(xí)棧和隊列的應(yīng)用;3掌握圖的各種應(yīng)用的算法:圖的連通性、連通分量和最小生成樹、拓?fù)渑判颉㈥P(guān)鍵路徑。二、實驗內(nèi)容實驗內(nèi)容1*圖的遍歷問題描述許多涉及圖上操作的算法都是以圖的遍歷為基礎(chǔ)的。寫一個程序,演示在連通無向圖上遍歷全部頂點?;疽蠼D的鄰接表的存儲結(jié)構(gòu),實現(xiàn)無向圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷。以用戶指定的頂點為起點,分別輸出每種遍歷下的頂點訪問序列。實現(xiàn)提示設(shè)圖的頂點不超過30個,每個頂點用一個編號表示(如果一個圖有N個頂點,則它們
2、的編號分別為1,2,N)。通過輸入圖的全部邊輸入一個圖,每條邊是兩個頂點編號對,可以對邊依附頂點編號的輸入順序作出限制(例如從小到大)。編程思路 首先圖的創(chuàng)建,采用鄰接表建立,逆向插入到單鏈表中,特別注意無向是對稱插入結(jié)點,且要把輸入的字符在頂點數(shù)組中定位(LocateVex(Graph G,char *name),以便后來的遍歷操作,深度遍歷算法采用遞歸調(diào)用,其中最主要的是NextAdjVex(Graph G, int v, int w) ;FirstAdjVex()函數(shù)的書寫,依次遞歸下去,廣度遍歷用隊列的輔助。程序代碼 頭文件:#include<stdio.h>#includ
3、e<stdlib.h>#define MAX_VERTEX_NUM 30#define MAX_QUEUE_NUMBER 30#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status;typedef int InfoType;typedef int Status;/* 定義弧的結(jié)構(gòu)*/typedef struct ArcNode int adjvex; /*該邊所指向的頂點的位置*/ struct ArcNode
4、 *nextarc; /*指向下一條邊的指針*/ InfoType info; /*該弧相關(guān)信息的指針*/ArcNode; /*定義頂點的結(jié)構(gòu)*/typedef struct VNode char data40; /*頂點信息*/ ArcNode *firstarc; /*指向第一條依附該頂點的弧的指針*/VNode,AdjListMAX_VERTEX_NUM;/*定義圖的結(jié)構(gòu)*/typedef struct AdjList vertices; int vexnum,arcnum; /*圖的當(dāng)前頂點數(shù)和弧數(shù)*/ int kind; /*圖的類型標(biāo)志*/Graph;/*定義隊列的結(jié)構(gòu)*/type
5、def structint *elem;int front, rear;Queue;/*功能選擇*/void MenuSelect(int w);/*頂點定位*/int LocateVex(Graph G,char *name);/*創(chuàng)建無向圖*/void CreateGraph(Graph &G);/*求第一個頂點*/int FirstAdjVex(Graph G, int v);/*求下一個頂點*/int NextAdjVex(Graph G, int v, int w);/*深度遞歸*/void DFS(Graph G, int v) ;/*深度遍歷*/void DFSTrave
6、l(Graph G,int v);/*廣度遍歷*/void BFSTraverse(Graph G,char *name);/*初始化隊列*/Status InitQueue(Queue &Q);/*判空*/Status EmptyQueue(Queue Q);/*進(jìn)隊*/Status EnQueue(Queue &Q, int e);/*出隊*/Status DeQueue(Queue &Q, int &e);實現(xiàn)文件:#include <stdio.h>#include"malloc.h"#include "tuhe
7、ad.h"#include "stdlib.h"#include "string.h"bool visitedMAX_VERTEX_NUM;/* 頂點定位 */int LocateVex(Graph G,char *name)int i;for(i=1;i<=G.vexnum;i+) /從1號位置開始存儲if(strcmp(name,G.verticesi.data)=0) /相等則找到,返回位序return i;return -1;/* 創(chuàng)建無向圖 */void CreateGraph(Graph &G)ArcNode *p;c
8、har name110,name210;int i,j,k;printf(" 請輸入頂點數(shù),按回車鍵結(jié)束:");scanf("%d",&G.vexnum); printf(" 請輸入弧數(shù),按回車鍵結(jié)束:");scanf("%d",&G.arcnum);printf(" 請依次輸入頂點名(用空格分開且字符小于10),按回車鍵結(jié)束:n"); printf(" ");for(i=1;i<=G.vexnum;i+) /從1號位置開始存儲 scanf("
9、%s",G.verticesi.data); /從一號位置開始初始化G.verticesi.firstarc=NULL; printf("nnnn"); printf(" 輸入小提示n"); printf(" &&&&1 為避免輸入遺漏,最好從選擇任意一點,輸入所有相鄰邊n"); printf(" &&&&2 輸入邊時格式(用空格分開,即格式為頂點(空格)頂點(空格))n"); printf(" 輸入小提示nnnn");f
10、or(k=0;k<G.arcnum;k+)printf("請輸入相鄰的兩個頂點,按回車鍵結(jié)束:");scanf("%s%s",name1,name2);i=LocateVex(G,name1); /返回位序j=LocateVex(G,name2); p=(ArcNode *)malloc(sizeof(ArcNode); /申請邊節(jié)點p->adjvex=j; /插入到鄰接表中,注意此處為逆向插入到單鏈表中 p->nextarc=G.verticesi.firstarc;G.verticesi.firstarc=p; /無向圖,注意是對稱
11、插入結(jié)點 p=(ArcNode *)malloc(sizeof(ArcNode); p->adjvex=i; p->nextarc=G.verticesj.firstarc;G.verticesj.firstarc=p; /* 求第一個頂點 */ int FirstAdjVex(Graph G, int v) ArcNode *p; if(v>=1 && v<=G.vexnum) p=G.verticesv.firstarc; if(p->nextarc=NULL) return 0; else return (p->nextarc->
12、adjvex); /返回第一個頂點字符 return -1; /* 求下一個頂點 */int NextAdjVex(Graph G, int v, int w) /在圖G中尋找第v個頂點的相對于w的下一個鄰接頂點 ArcNode *p; if(v>=1 && v<=G.vexnum && w>=1 && w<=G.vexnum) p=G.verticesv.firstarc; while(p->adjvex!=w) p=p->nextarc; /在頂點v的弧鏈中找到頂點w if(p->nextarc!=N
13、ULL) return 0; /若已是最后一個頂點,返回0 else return(p->nextarc->adjvex); /返回下一個鄰接頂點的序號 return -1;/* 深度遞歸 */void DFS(Graph G, int v) int w; ArcNode *p; visitedv=1; printf("%s ",G.verticesv.data); /訪問第v個頂點 p=G.verticesv.firstarc; /p為依附頂點的第一條邊 while (p!=NULL) w=p->adjvex; if(visitedw=0) DFS(G,
14、w); p=p->nextarc; /下移指針 /* 深度遍歷 */void DFSTravel(Graph G,int v)for(int i=1;i<=G.vexnum;i+) visitedi=0; int w; ArcNode *p; visitedv=1; printf("%s ",G.verticesv.data); /訪問第v個頂點 p=G.verticesv.firstarc; while (p!=NULL) w=p->adjvex; if(visitedw=0) DFS(G,w); p=p->nextarc; /* 初始化隊列 */
15、 Status InitQueue(Queue &Q)Q.elem = new intMAX_QUEUE_NUMBER;Q.front = Q.rear = 0; return OK;Status EmptyQueue(Queue Q)if(Q.front=Q.rear)return 0;else return 1;/* 進(jìn)隊列 */Status EnQueue(Queue &Q, int e)if(Q.rear + 1)%MAX_QUEUE_NUMBER != Q.front)Q.elemQ.rear = e;else;Q.rear = (Q.rear + 1)%MAX_QU
16、EUE_NUMBER; return OK; /* 出隊列 */Status DeQueue(Queue &Q, int &e)if(Q.rear != Q.front)e = Q.elemQ.front;else ;Q.front = (Q.front+1)%MAX_QUEUE_NUMBER; return OK;/* 廣度遍歷 */void BFSTraverse(Graph G,char *name)ArcNode *p;int v,w,u,k=0; Queue Q;int visited20;for(v=1;v<=G.vexnum;v+) /初始化visitedv
17、=0;InitQueue(Q);for(v=LocateVex(G,name);k!=2;v=(v+1)%(G.vexnum-1) /v為輸入的字符轉(zhuǎn)化的位序if(v+1=LocateVex(G,name) /從v開始走完圖的所有頂點k+;if(visitedv=0)visitedv=1;printf("%s ",G.verticesv.data); /訪問第v個頂點 EnQueue(Q,v); / 進(jìn)隊 while(EmptyQueue(Q)!=0)DeQueue(Q,u); /出隊p=G.verticesu.firstarc;while(p!=NULL)w=p->
18、adjvex; /p邊的下一個頂點if(visitedw=0)printf("%s ",G.verticesw.data);visitedw=1;EnQueue(Q,w);p=p->nextarc; /下移指針 主文件:#include <stdio.h>#include"malloc.h"#include "tuhead.h"#include "stdlib.h"#include "string.h"/* 界面控制 */void main() printf("n#
19、圖的遍歷 #n"); printf("n $n"); printf("n"); printf(" 1 - 圖的創(chuàng)建n"); printf(" 2 - 圖的深度優(yōu)先遍歷n"); printf(" 3 - 圖的廣度優(yōu)先遍歷n"); printf(" 0 - 退出n");printf("n$n"); printf("n"); printf("請輸入選擇的操作代碼(0-3)按回車鍵結(jié)束n"); MenuSelect(1);/* 功能選擇 */ void MenuSelect(int w) int select,done; int v; Gra
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度棒球場租賃與賽事宣傳合作合同
- 人力資源公司合作合同
- 食堂承包合同書
- 交通運輸行業(yè)智能交通出行服務(wù)平臺方案
- 服裝廠縫紉機設(shè)備買賣合同書
- 物流市場分析與規(guī)劃作業(yè)指導(dǎo)書
- 買賣房屋交接合同協(xié)議書
- 人工智能系統(tǒng)開發(fā)與部署作業(yè)指導(dǎo)書
- 帶擔(dān)保的借款合同
- 工業(yè)互聯(lián)網(wǎng)背景下智能倉儲管理解決方案
- 渤海大學(xué)《大數(shù)據(jù)分析與實踐》2023-2024學(xué)年期末試卷
- 2024版2024年《咚咚鏘》中班音樂教案
- 賽力斯招聘在線測評題
- DB61∕T 1854-2024 生態(tài)保護(hù)紅線評估調(diào)整技術(shù)規(guī)范
- GA 2139-2024警用防暴臂盾
- DL∕T 5810-2020 電化學(xué)儲能電站接入電網(wǎng)設(shè)計規(guī)范
- 人教版高中物理必修二同步練習(xí)及答案
- 《行政倫理學(xué)教程(第四版)》課件 第7、8章?行政人格、行政組織倫理
- 2023年4月自考00504藝術(shù)概論試題及答案含解析
- 美麗的大自然(教案)2023-2024學(xué)年美術(shù)一年級下冊
- 2024年低壓電工考試題庫(試題含答案)
評論
0/150
提交評論