版權(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ù)渑判?、關(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 班主任心理健康與壓力管理的培訓(xùn)總結(jié)
- 公交掃惡除霸承諾書范本
- 2025-2030全球船用防火窗行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國運動刺激療法行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國矩形橋式起重機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球便攜式鼻腔沖洗器行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球農(nóng)用氧化亞銅行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國鋼制螺旋錐齒輪行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國戶外電氣箱行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球軸承精密滾珠行業(yè)調(diào)研及趨勢分析報告
- 蛋糕店服務(wù)員勞動合同
- 土地買賣合同參考模板
- 2025高考數(shù)學(xué)二輪復(fù)習(xí)-專題一-微專題10-同構(gòu)函數(shù)問題-專項訓(xùn)練【含答案】
- 2025年天津市政建設(shè)集團(tuán)招聘筆試參考題庫含答案解析
- 2024-2030年中國烘焙食品行業(yè)運營效益及營銷前景預(yù)測報告
- 2025年上半年水利部長江水利委員會事業(yè)單位招聘68人(湖北武漢)重點基礎(chǔ)提升(共500題)附帶答案詳解
- 寧德時代筆試題庫
- 五年級下冊北京版英語單詞
- 康復(fù)醫(yī)院患者隱私保護(hù)管理制度
- 新課標(biāo)I、Ⅱ卷 (2024-2020) 近五年高考英語真題滿分作文
- 浙江省嘉興市2023-2024學(xué)年六年級(上)期末數(shù)學(xué)試卷
評論
0/150
提交評論