1、实现图的遍历算法实验报告实现图的遍历算法实验报告一 实验题目: 实现图的遍历算法二 实验要求: 2.1:(1)建立如图(p126 8.1)所示的有向图 G 的邻接矩阵,并输出之(2)由有向图G的邻接矩阵产生邻接表,并输出之(3)再由(2)的邻接表产生对应的邻接矩阵,并输出之2.2 (1)输出如图8.1所示的有向图G从顶点0开始的深度优先遍历序 列(递归算法)(2)输出如图8.1所示的有向图G从顶点0开始的深度优先遍历序 列(非递归算法)(3)输出如图8.1所示的有向图G从顶点0开始的广度优先遍历序 列三 实验内容:3.1 图的抽象数据类型:ADT Graph数据对象V:V是具有相同特性的数据元
2、素的集合,称为顶点集。数据关系R: R=VRVR=|v,wV且P(v,w),表示从v到w的弧,谓词P(v,w)定义了弧的意义或信息基本操作:CreateGraph( &G, V, VR )初始条件:V是图的顶点集,VR是图中弧的集合。操作结果:按V和VR的定义构造图G。DestroyGraph( &G )初始条件:图G存在。操作结果:销毁图G。LocateVex( G, u )初始条件:图G存在,u和G中顶点有相同特征。操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其它信息。GetVex( G, v )初始条件:图G存在,v是G中某个顶点。操作结果:返回v的值。PutVex( &
3、G, v, value )初始条件:图G存在,v是G中某个顶点。操作结果:对v赋值value。FirstAdjVex( G, v )初始条件:图G存在,v是G中某个顶点。操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。NextAdjVex( G, v, w )初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接点,则返回“空”。InsertVex( &G, v )初始条件:图G存在,v和图中顶点有相同特征。操作结果:在图G中增添新顶点v。DeleteVex( &G, v )初始条件:图G存在,v
4、是G中某个顶点。操作结果:删除G中顶点v及其相关的弧。InsertArc( &G, v, w )初始条件:图G存在,v和w是G中两个顶点。操作结果:在G中增添弧,若G是无向的,则还增添对称弧。DeleteArc( &G, v, w )初始条件:图G存在,v和w是G中两个顶点。操作结果:在G中删除弧,若G是无向的,则还删除对称弧。DFSTraverse( G, Visit() )初始条件:图G存在,Visit是顶点的应用函数。操作结果:对图进行深度优先遍历。在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。BFSTraverse( G, Visit() )
5、初始条件:图G存在,Visit是顶点的应用函数。操作结果:对图进行广度优先遍历。在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。ADT Graph3.2存储结构的定义;#define maxx 100#define inf 32767int vismaxx=0;/ 邻接矩阵typedef struct int no; /顶点编号 int info; VertexType; /顶点类型typedef struct int edgesmaxxmaxx; int n, e; VertexType vexsmaxx; MGraph;/ 邻接表typedef s
6、truct ANode / 边的结构定义 int adjvex; / 边的终点位置 struct ANode *nextarc; /指向下一条边的指针 int info; /权值 ArcNode;typedef struct Vnode / 表头定义 int data; /顶点信息 ArcNode *firstarc; /指向第一条边VNode;typedef VNode AdjListmaxx;typedef struct AdjList adjlist; / 邻接表 int n, e; / 顶点数 n , 边数 eALGraph;3.3基本操作实现:void DispMat1( MGrap
7、h g) int i, j; for(i = 0;i g.n; +i) for(j = 0;j g.n; +j) if(g.edgesij = inf) printf(%3s,); else printf(%3d,g.edgesij); printf(n); void MatTolist(MGraph g, ALGraph *&G) int i, j; ArcNode *p; G = (ALGraph *)malloc(sizeof(ALGraph); for(i = 0;i adjlisti.firstarc = NULL; for(i = 0;i = 0; -j) if(g.edgesij
8、 != 0&g.edgesij != inf) p = (ArcNode *)malloc(sizeof(ArcNode); p-adjvex = j; p-info = g.edgesij; p-nextarc = G-adjlisti.firstarc; G-adjlisti.firstarc = p; G-n = g.n; G-e = g.e;void DispAdj1(ALGraph *G) int i; ArcNode *p; for(i = 0;i n; +i) p = G-adjlisti.firstarc; printf(%3d:, i); while(p!=NULL) pri
9、ntf(%3d(%d),p-adjvex,p-info); p=p-nextarc; printf(n); 3.4解题思路:1.深度优先遍历(递归):用标记的方法,记录被访问过的节点,查找未访问点,并从未访问点开始进行递归。2.深度优先遍历(非递归):用栈模拟递归算法3.广度优先遍历:用循环队列储存当前节点可访问点,并进行标记。再从队列中取出所有节点进行搜索未访问节点,如是循环,直到队列为空。3.5解题过程:实验源代码如下:3.5.1图的遍历的算法#include #include #define maxx 100#define inf 32767int vismaxx=0;/ 邻接矩阵typ
10、edef struct int no; /顶点编号 int info; VertexType; /顶点类型typedef struct int edgesmaxxmaxx; int n, e; VertexType vexsmaxx; MGraph;/ 邻接表typedef struct ANode / 边的结构定义 int adjvex; / 边的终点位置 struct ANode *nextarc; /指向下一条边的指针 int info; /权值 ArcNode;typedef struct Vnode / 表头定义 int data; /顶点信息 ArcNode *firstarc;
11、/指向第一条边VNode;typedef VNode AdjListmaxx;typedef struct AdjList adjlist; / 邻接表 int n, e; / 顶点数 n , 边数 eALGraph;void DispMat1( MGraph g) int i, j; for(i = 0;i g.n; +i) for(j = 0;j g.n; +j) if(g.edgesij = inf) printf(%3s,); else printf(%3d,g.edgesij); printf(n); void MatTolist(MGraph g, ALGraph *&G) int
12、 i, j; ArcNode *p; G = (ALGraph *)malloc(sizeof(ALGraph); for(i = 0;i adjlisti.firstarc = NULL; for(i = 0;i = 0; -j) if(g.edgesij != 0&g.edgesij != inf) p = (ArcNode *)malloc(sizeof(ArcNode); p-adjvex = j; p-info = g.edgesij; p-nextarc = G-adjlisti.firstarc; G-adjlisti.firstarc = p; G-n = g.n; G-e =
13、 g.e;void DispAdj1(ALGraph *G) int i; ArcNode *p; for(i = 0;i n; +i) p = G-adjlisti.firstarc; printf(%3d:, i); while(p!=NULL) printf(%3d(%d),p-adjvex,p-info); p=p-nextarc; printf(n); void DFS(ALGraph *G, int v) ArcNode *p; visv = 1; printf(%3d,v); p = G-adjlistv.firstarc; while(p!=NULL) if(visp-adjv
14、ex = 0) DFS(G,p-adjvex); p = p-nextarc; void DFS1(ALGraph *G, int v) ArcNode *p; ArcNode *stmaxx; int top = -1, w, i; for(i = 0;i n; +i) visi = 0; printf(%3d,v); visv = 1; top+; sttop = G-adjlistv.firstarc; while(top-1) p=sttop-; while(p!=NULL) w = p-adjvex; if(visw = 0) printf(%3d,w); visw = 1; top
15、+; sttop = G-adjlistw.firstarc; break; p = p-nextarc; printf(n);void BFS(ALGraph *G, int v) int i, w; ArcNode *p; int queuemaxx,front = 0,rear = 0; for(i = 0;i n; +i) visi = 0; printf(%3d,v); visv = 1; rear = (rear + 1)%maxx; queuerear = v; while(front != rear) front = (front + 1) % maxx; w = queuef
16、ront; p = G-adjlistw.firstarc; while(p != NULL) if(visp-adjvex = 0) printf(%3d,p-adjvex); visp-adjvex = 1; rear = (rear + 1)%maxx; queuerear = p-adjvex; p=p-nextarc; printf(n);int main() int i, j; int Amaxx6 = 0,5,inf,7,inf,inf, inf,0,4,inf,inf,inf, 8,inf,0,inf,inf,9, inf,inf,5,0,inf,6, inf,inf,inf,
17、5,0,inf, 3,inf,inf,inf,1,0 ; MGraph g, g1; ALGraph *G; g.n = 6; g.e = 10; for(i = 0;i g.n; +i) for(j = 0;j g.n ; +j) g.edgesij = Aij; printf(有向图 G 邻接矩阵:n); DispMat1(g); G = (ALGraph *)malloc(sizeof(ALGraph); printf(图 G 的邻接矩阵转换成邻接表:n); MatTolist(g,G); DispAdj1(G); printf(从顶点 0 开始的DFS(递归算法):n); DFS(G,0); printf(n); printf(从顶点 0 开始的DFS(非递归算法):n); DFS1(G,0); printf(从顶点 0 开始的BFS(非递归算法):n); BFS(G,0); printf(n); return 0;四 实验结果:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1