版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三、图的遍历操作一、 目的掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。二、 要求采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。三、 DFS和BFS 的基本思想深度优先搜索法DFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后选择一个与Vo相邻且没被访问过的顶点Vi访问,再从Vi出发选择一个与Vi相邻且没被访问过的顶点Vj访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则回退到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点W
2、,从W出发按同样方法向前遍历。直到图中所有的顶点都被访问。广度优先算法BFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后访问与Vo相邻的所有未被访问过的顶点V1,V2,Vt;再依次访问与V1,V2,Vt相邻的起且未被访问过的的所有顶点。如此继续,直到访问完图中的所有顶点。四、 示例程序1 邻接矩阵作为存储结构的程序示例#include"stdio.h"#include"stdlib.h"#define MaxVertexNum 100 /定义最大顶点数typedef struct char vexsMaxVertexNum; /顶点表 int
3、 edgesMaxVertexNumMaxVertexNum; /邻接矩阵,可看作边表 int n,e; /图中的顶点数n和边数eMGraph; /用邻接矩阵表示的图的类型/=建立邻接矩阵=void CreatMGraph(MGraph *G) int i,j,k; char a; printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d,%d",&G->n,&G->e); /输入顶点数和边数 scanf("%c",&a); printf(&
4、quot;Input Vertex string:"); for(i=0;i<G->n;i+) scanf("%c",&a); G->vexsi=a; /读入顶点信息,建立顶点表 for(i=0;i<G->n;i+)for(j=0;j<G->n;j+)G->edgesij=0; /初始化邻接矩阵 printf("Input edges,Creat Adjacency Matrixn"); for(k=0;k<G->e;k+) /读入e条边,建立邻接矩阵 scanf("
5、%d%d",&i,&j); /输入边(Vi,Vj)的顶点序号 G->edgesij=1; G->edgesji=1; /若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 /=定义标志向量,为全局变量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(MGraph *G,int i) /以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵 int j; printf("%c",G->ve
6、xsi); /访问顶点Vi visitedi=TRUE; /置已访问标志 for(j=0;j<G->n;j+) /依次搜索Vi的邻接点if(G->edgesij=1 && ! visitedj) DFSM(G,j); /(Vi,Vj)E,且Vj未访问过,故Vj为新出发点void DFS(MGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FALSE; /标志向量初始化 for(i=0;i<G->n;i+)if(!visitedi) /Vi未访问过 DFSM(G,i); /以Vi为源点开始DFS搜索/
7、=BFS:广度优先遍历=void BFS(MGraph *G,int k) /以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索 int i,j,f=0,r=0; int cqMaxVertexNum; /定义队列 for(i=0;i<G->n;i+)visitedi=FALSE; /标志向量初始化 for(i=0;i<G->n;i+)cqi=-1; /队列初始化 printf("%c",G->vexsk); /访问源点Vk visitedk=TRUE; cqr=k; /Vk已访问,将其入队。注意,实际上是将其序号入队 while(cqf!=-
8、1) /队非空则执行 i=cqf; f=f+1; /Vf出队 for(j=0;j<G->n;j+) /依次Vi的邻接点Vj if(G->edgesij=1 && !visitedj) /Vj未访问 printf("%c",G->vexsj); /访问Vj visitedj=TRUE; r=r+1; cqr=j; /访问过Vj入队 /=main=void main() int i; MGraph *G; G=(MGraph *)malloc(sizeof(MGraph); /为图G申请内存空间 CreatMGraph(G); /建立邻接
9、矩阵 printf("Print Graph DFS: "); DFS(G); /深度优先遍历 printf("n"); printf("Print Graph BFS: "); BFS(G,3); /以序号为3的顶点开始广度优先遍历 printf("n");执行顺序:V6V4V5V7V2V3V1V0Vo图G的示例Input VertexNum(n) and EdgesNum(e): 8,9Input Vertex string: 01234567Input edges,Creat Adjacency Matrix
10、0 10 21 31 42 52 63 74 75 6Print Graph DFS:01374256Print Graph BFS:317042562 邻接链表作为存储结构程序示例#include"stdio.h"#include"stdlib.h"#define MaxVertexNum 50 /定义最大顶点数typedef struct node /边表结点 int adjvex; /邻接点域 struct node *next; /链域EdgeNode;typedef struct vnode /顶点表结点 char vertex; /顶点域 E
11、dgeNode *firstedge; /边表头指针VertexNode;typedef VertexNode AdjListMaxVertexNum; /AdjList是邻接表类型typedef struct AdjList adjlist; /邻接表 int n,e; /图中当前顶点数和边数 ALGraph; /图类型/=建立图的邻接表=void CreatALGraph(ALGraph *G) int i,j,k; char a; EdgeNode *s; /定义边表结点 printf("Input VertexNum(n) and EdgesNum(e): ");
12、scanf("%d,%d",&G->n,&G->e); /读入顶点数和边数 scanf("%c",&a); printf("Input Vertex string:"); for(i=0;i<G->n;i+) /建立边表 scanf("%c",&a);G->adjlisti.vertex=a; /读入顶点信息G->adjlisti.firstedge=NULL; /边表置为空表 printf("Input edges,Creat Adja
13、cency Listn"); for(k=0;k<G->e;k+) /建立边表 scanf("%d%d",&i,&j); /读入边(Vi,Vj)的顶点对序号s=(EdgeNode *)malloc(sizeof(EdgeNode); /生成边表结点s->adjvex=j; /邻接点序号为js->next=G->adjlisti.firstedge;G->adjlisti.firstedge=s; /将新结点*S插入顶点Vi的边表头部s=(EdgeNode *)malloc(sizeof(EdgeNode); s-
14、>adjvex=i; /邻接点序号为is->next=G->adjlistj.firstedge; G->adjlistj.firstedge=s; /将新结点*S插入顶点Vj的边表头部 /=定义标志向量,为全局变量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(ALGraph *G,int i) /以Vi为出发点对邻接链表表示的图G进行DFS搜索 EdgeNode *p; printf("%c",G->adjlist
15、i.vertex); /访问顶点Vi visitedi=TRUE; /标记Vi已访问 p=G->adjlisti.firstedge; /取Vi边表的头指针 while(p) /依次搜索Vi的邻接点Vj,这里j=p->adjvexif(! visitedp->adjvex) /若Vj尚未被访问 DFSM(G,p->adjvex); /则以Vj为出发点向纵深搜索p=p->next; /找Vi的下一个邻接点 void DFS(ALGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FALSE; /标志向量初始化 for(
16、i=0;i<G->n;i+)if(!visitedi) /Vi未访问过 DFSM(G,i); /以Vi为源点开始DFS搜索/=BFS:广度优先遍历=void BFS(ALGraph *G,int k) /以Vk为源点对用邻接链表表示的图G进行广度优先搜索 int i,f=0,r=0; EdgeNode *p; int cqMaxVertexNum; /定义FIFO队列 for(i=0;i<G->n;i+)visitedi=FALSE; /标志向量初始化 for(i=0;i<=G->n;i+)cqi=-1; /初始化标志向量 printf("%c&q
17、uot;,G->adjlistk.vertex); /访问源点Vk visitedk=TRUE; cqr=k; /Vk已访问,将其入队。注意,实际上是将其序号入队 while(cqf!=-1) 队列非空则执行i=cqf; f=f+1; /Vi出队p=G->adjlisti.firstedge; /取Vi的边表头指针while(p) /依次搜索Vi的邻接点Vj(令p->adjvex=j) if(!visitedp->adjvex) /若Vj未访问过printf("%c",G->adjlistp->adjvex.vertex); /访问Vjv
18、isitedp->adjvex=TRUE;r=r+1; cqr=p->adjvex; /访问过的Vj入队 p=p->next; /找Vi的下一个邻接点 /endwhile/=主函数=void main() int i; ALGraph *G; G=(ALGraph *)malloc(sizeof(ALGraph); CreatALGraph(G); printf("Print Graph DFS: "); DFS(G); printf("n"); printf("Print Graph BFS: "); BFS(G,
19、3); printf("n");执行顺序:Input VertexNum(n) and EdgesNum(e): 8,9Input Vertex string: 01234567V6V4V5V7V2V3V1V0Vo图G的示例Input edges,Creat Adjacency List0 10 21 31 42 52 63 74 75 6Print Graph DFS:02651473Print Graph BFS:37140265五、 修改后的代码1邻接矩阵作为存储结构的程序#include"stdio.h"#include"stdlib.
20、h"#define MaxVertexNum 100 /定义最大顶点数typedef struct char vexsMaxVertexNum; /顶点表 int edgesMaxVertexNumMaxVertexNum; /邻接矩阵,可看作边表 int n,e; /图中的顶点数n和边数eMGraph; /用邻接矩阵表示的图的类型/=建立邻接矩阵=void CreatMGraph(MGraph *G) int i,j,k; char a; printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d
21、,%d",&G->n,&G->e); /输入顶点数和边数 scanf("%c",&a); printf("Input Vertex string:"); for(i=0;i<G->n;i+) scanf("%c",&a); G->vexsi=a; /读入顶点信息,建立顶点表 for(i=0;i<G->n;i+)for(j=0;j<G->n;j+)G->edgesij=0; /初始化邻接矩阵 printf("Input edg
22、es,Creat Adjacency Matrixn"); for(k=0;k<G->e;k+) /读入e条边,建立邻接矩阵 scanf("%d%d",&i,&j); /输入边(Vi,Vj)的顶点序号 G->edgesij=1; G->edgesji=1; /若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 /=定义标志向量,为全局变量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(MGrap
23、h *G,int i) /以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵 int j; printf("%c",G->vexsi); /访问顶点Vi visitedi=TRUE; /置已访问标志 for(j=0;j<G->n;j+) /依次搜索Vi的邻接点if(G->edgesij=1 && ! visitedj) DFSM(G,j); /(Vi,Vj)E,且Vj未访问过,故Vj为新出发点void DFS(MGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FA
24、LSE; /标志向量初始化 for(i=0;i<G->n;i+)if(!visitedi) /Vi未访问过 DFSM(G,i); /以Vi为源点开始DFS搜索/=BFS:广度优先遍历=void BFS(MGraph *G,int k) /以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索 int i,j,f=0,r=0; int cqMaxVertexNum; /定义队列 for(i=0;i<G->n;i+)visitedi=FALSE; /标志向量初始化 for(i=0;i<G->n;i+)cqi=-1; /队列初始化 printf("%c&qu
25、ot;,G->vexsk); /访问源点Vk visitedk=TRUE; cqr=k; /Vk已访问,将其入队。注意,实际上是将其序号入队 while(cqf!=-1) /队非空则执行 i=cqf; f=f+1; /Vf出队 for(j=0;j<G->n;j+) /依次Vi的邻接点Vj if(G->edgesij=1 && !visitedj) /Vj未访问 printf("%c",G->vexsj); /访问Vj visitedj=TRUE; r=r+1; cqr=j; /访问过Vj入队 /=main=void main()
26、 MGraph *G; G=(MGraph *)malloc(sizeof(MGraph); /为图G申请内存空间 CreatMGraph(G); /建立邻接矩阵 printf("Print Graph DFS: "); DFS(G); /深度优先遍历 printf("n"); printf("Print Graph BFS: "); BFS(G,3); /以序号为3的顶点开始广度优先遍历 printf("n");2邻接链表作为存储结构程序#include"stdio.h"#include&qu
27、ot;stdlib.h"#define MaxVertexNum 50 /定义最大顶点数typedef struct node /边表结点 int adjvex; /邻接点域 struct node *next; /链域EdgeNode;typedef struct vnode /顶点表结点 char vertex; /顶点域 EdgeNode *firstedge; /边表头指针VertexNode;typedef VertexNode AdjListMaxVertexNum; /AdjList是邻接表类型typedef struct AdjList adjlist; /邻接表 i
28、nt n,e; /图中当前顶点数和边数 ALGraph; /图类型/=建立图的邻接表=void CreatALGraph(ALGraph *G) int i,j,k; char a; EdgeNode *s; /定义边表结点 printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d,%d",&G->n,&G->e); /读入顶点数和边数 scanf("%c",&a); printf("Input Vertex string:&quo
29、t;); for(i=0;i<G->n;i+) /建立边表 scanf("%c",&a);G->adjlisti.vertex=a; /读入顶点信息G->adjlisti.firstedge=NULL; /边表置为空表 printf("Input edges,Creat Adjacency Listn"); for(k=0;k<G->e;k+) /建立边表 scanf("%d%d",&i,&j); /读入边(Vi,Vj)的顶点对序号s=(EdgeNode *)malloc(s
30、izeof(EdgeNode); /生成边表结点s->adjvex=j; /邻接点序号为js->next=G->adjlisti.firstedge;G->adjlisti.firstedge=s; /将新结点*S插入顶点Vi的边表头部s=(EdgeNode *)malloc(sizeof(EdgeNode); s->adjvex=i; /邻接点序号为is->next=G->adjlistj.firstedge; G->adjlistj.firstedge=s; /将新结点*S插入顶点Vj的边表头部 /=定义标志向量,为全局变量=typedef
31、enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(ALGraph *G,int i) /以Vi为出发点对邻接链表表示的图G进行DFS搜索 EdgeNode *p; printf("%c",G->adjlisti.vertex); /访问顶点Vi visitedi=TRUE; /标记Vi已访问 p=G->adjlisti.firstedge; /取Vi边表的头指针 while(p) /依次搜索Vi的邻接点Vj,这里j=p->adjvexif(! vis
32、itedp->adjvex) /若Vj尚未被访问 DFSM(G,p->adjvex); /则以Vj为出发点向纵深搜索p=p->next; /找Vi的下一个邻接点 void DFS(ALGraph *G) int i; for(i=0;i<G->n;i+)visitedi=FALSE; /标志向量初始化 for(i=0;i<G->n;i+)if(!visitedi) /Vi未访问过 DFSM(G,i); /以Vi为源点开始DFS搜索DFSM(G,i);/=BFS:广度优先遍历=void BFS(ALGraph *G,int k) /以Vk为源点对用邻接链表表示的图G进行广度优先搜索 int i,f=0,r=0; EdgeNode *p; int cqMaxVerte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 骨髓穿刺选择题集及参考答案
- 2026秋小学花城版音乐三年级上册(新教材)教学计划
- 2026年绿色生产与环境保护政策测试
- 2026年心理调适能力测评试卷
- 2026年火灾逃生知识测试卷
- 医疗翻译测评试题及对应答案
- 2026年会计电算化基础实操测试卷
- 2026年金融法规与政策应用能力测试卷
- 2026年制冷与空调技术实操考核习题
- 2026年山西省人教版七年级语文上册第10单元课后练习题
- 2026邢台银行招聘笔试备考题库及答案详解
- 高处施工作业风险防控专项方案
- 2025年成都七初锦城初一入学语文分班考试真题含答案
- 2026-2030中国DJ设备行业市场发展趋势与前景展望战略分析研究报告
- 2026年电子商务投资合作合同模板(风险共担)
- 2026中国机场助航灯光系统节能改造市场潜力与投资价值评估
- 2026年高考语文真题全国一卷文言文逐句注解+翻译(含课内拓展+文言现象)
- 2026年消防继续教育题目考前冲刺练习题【必考】附答案详解
- 深入学习生态环境法典
- 国家基层全科常见疾病诊疗指南(2023版)
- 2026年乌鲁木齐一中分班测试题及答案
评论
0/150
提交评论