1、图及其应用实验六图及其应用实验六 实验 六 图及其应用 1.目的要求:(1)通过完成本实验,掌握图的两种基本的存储结构(邻接矩阵、邻接表),以及图的基本算法实现(建立、遍历),并能运用图结构分析解决一些实际问题。(2)本实验训练的要点是:图的两种基本存储结构,及各种操作的算法实现(建立、遍历、图的典型应用)。2.实验内容:(1)建立无向图和有向图的邻接矩阵存储,计算顶点的度,并输出图的基本信息。(2)建立有向图的邻接表存储表示,并根据存储计算顶点的出度和入度,然后输出图的基本信息。(3)编写完整的程序实现 AOV网的拓扑排序。(4)编程求 AOE 网的关键路径。(5)编程实现单源点最短路径的
2、Dijkstra算法。三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)建立无向图和有向图的邻接矩阵存储,计算顶点的度,并输出图的基本信息。程序代码:头文件:#include#include#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW-1 typedef int Status;#define INIFINITY 1000#define MAX_VERTEX_NUM 20 typedef enumDG,DN,UDG,UDN GraphKind;typedef ch
3、ar VertexType;typedef struct VertexType vexsMAX_VERTEX_NUM;/顶点向量 int arcsMAX_VERTEX_NUMMAX_VERTEX_NUM;/邻接矩阵 int vexnum,arcnum;/顶点数和弧的数目 GraphKind kind;/图的种类 MGraph;int LovateVex(MGraph G,VertexType v);Status CreateUDN(MGraph&G);Status CreateDN(MGraph&G);Status CreateUDG(MGraph&G);Status CreateDG(MGr
4、aph&G);Status CreateGraph(MGraph&G);void PrintGraph(MGraph G);void GraphDegree(MGraph G);主函数:#include 1.h int main()MGraph G;CreateGraph(G);/创建图 PrintGraph(G);/输出图 GraphDegree(G);/计算图中顶点的度,并输出 printf(“n”);return 0;功能函数:int LovateVex(MGraph G,VertexType v)for(int i=0;G.vexsi!=v;i+);return i;Status Cr
5、eateUDN(MGraph&G)int i,j,k;VertexType v1,v2;int w;printf(输入图的顶点数和边数:n);scanf(“%d%d”,&G.vexnum,&G.arcnum);printf(输入图的顶点信息:n);for(i=0;iG.vexnum;i+)scanf(“%c”,&G.vexsi);for(i=0;iG.vexnum;i+)for(j=0;jG.vexnum;j+)G.arcsij=INIFINITY;printf(输入边的信息 v1,v2,wn);for(k=0;kG.arcnum;k+)scanf(“%c%c%c”,&v1,&v2,&w);i
6、=LovateVex(G,v1);j=LovateVex(G,v2);G.arcsij=w;G.arcsji=G.arcsij;/for k return OK;Status CreateDN(MGraph&G)int i,j,k;VertexType v1,v2;int w;printf(输入图的顶点数和边数:n);scanf(“%d%d”,&G.vexnum,&G.arcnum);printf(输入图的顶点信息:n);for(i=0;iG.vexnum;i+)scanf(“%c”,&G.vexsi);for(i=0;iG.vexnum;i+)for(j=0;jG.vexnum;j+)G.a
7、rcsij=INIFINITY;printf(输入边的信息 v1,v2,wn);for(k=0;kG.arcnum;k+)scanf(“%c%c%c”,&v1,&v2,&w);i=LovateVex(G,v1);j=LovateVex(G,v2);G.arcsij=w;/for k return OK;Status CreateUDG(MGraph&G)int i,j,k;VertexType v1,v2;int w;printf(输入图的顶点数和边数:n);scanf(“%d%d”,&G.vexnum,&G.arcnum);printf(输入图的顶点信息:n);for(i=0;iG.vexn
8、um;i+)scanf(“%c”,&G.vexsi);for(i=0;iG.vexnum;i+)for(j=0;jG.vexnum;j+)G.arcsij=0;printf(输入边的信息 v1,v2n);for(k=0;kG.arcnum;k+)scanf(“%c%c”,&v1,&v2);i=LovateVex(G,v1);j=LovateVex(G,v2);G.arcsij=1;G.arcsji=G.arcsij;/for k return OK;Status CreateDG(MGraph&G)int i,j,k;VertexType v1,v2;int w;printf(输入图的顶点数和
9、边数:n);scanf(“%d%d”,&G.vexnum,&G.arcnum);printf(输入图的顶点信息:n);for(i=0;iG.vexsi;for(i=0;iG.vexnum;i+)for(j=0;jG.vexnum;j+)G.arcsij=0;printf(输入边的信息 v1,v2n);for(k=0;kG.arcnum;k+)scanf(“%c%c”,&v1,&v2);i=LovateVex(G,v1);j=LovateVex(G,v2);G.arcsij=1;/for k return OK;Status CreateGraph(MGraph&G)int kind;pritn
10、f(输入图的类型:0-DG,1-DN,2-UDG,3-UDN:n);scanf(“%d”,&kind);G.kind=(GraphKind)kind;switch(G.kind)case DG:return CreateDG(G);case DN:return CreateDN(G);case UDG:return CreateUDG(G);case UDN:return CreateUDN(G);default :return ERROR;void PrintGraph(MGraph G)int i,j;printf(图的顶点数和边数:%d%dn,G.vexnum,G.arcnum);pri
11、ntf(图的顶点信息:n);for(i=0;iG.vexnum;i+)printf(“%c”,G.vexsi);printf(图的邻接矩阵:n);for(i=0;iG.vexnum;i+)printf(“n”);for(j=0;jG.vexnum;j+)if(G.arcsij=INIFINITY)printf();else printf(“%c”,G.arcsij);/for i printf(“n”);void GraphDegree(MGraph G)int indegreeMAX_VERTEX_NUM=0,outdegreeMAX_VERTEX_NUM=0;int i;switch(G.
12、kind)case DN:case DG:FindIndegree(G,indegree);for(i=0;iG.vexnum;i+)printf(“%c的出度为%dn”,G.vexsi,outdegreei);FindOutdegree(G,outdegree);for(i=0;iG.vexnum;i+)printf(“%c的出度为%dn”,G.vexsi,outdegreei);break;case UDN:case UDG:FindOutdegree(G,outdegree);for(i=0;iG.vexnum;i+)printf(“%c的度为%dn”,G.vexsi,outdegree
13、i);break;printf(“n”);运行结果:(2)建立有向图的邻接表存储表示,并根据存储计算顶点的出度和入度,然后输出图的基本信息。程序代码部分:头文件:/1.h#include#include#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW-1 typedef int Status;#define INIFINITY 1000#define MAX_VERTEX_NUM 20 typedef enumDG,DN,UDG,UDN GraphKind;typedef char VertexTy
14、pe;typedef int InfoType;typedef struct ArcNode int adjvex;InfoType weight;struct ArcNode*nextarc;ArcNode;typedef struct Vnode VertexType data;ArcNode*firstarc;VNode,AdjListMAX_VERTEX_NUM;typedef struct AdjList vertices;int vexnum,arcnum;GraphKind kind;ALGraph;int LovateVex(ALGraph G,VertexType v)Sta
15、tus CreateUDN(ALGraph&G)Status CreateGraph(ALGraph&G)void PrintGraph(ALGraph G)主函数:#include 1.h int main()ALGraph G;CreateGraph(G);/建立图 PrintGraph(G);/输出图 return 0;功能函数:int LovateVex(ALGraph G,VertexType v)for(int i=0;G.verticesi.data!=v;i+);return i;Status CreateUDN(ALGraph&G)int i,j,k;VertexType v
16、1,v2;InfoType w;ArcNode*p,*q;printf(输入图的顶点数和边数:n);scanf(“%d%d”,&G.vexnum,&G.arcnum);pritnf(输入图的顶点信息:n);for(i=0;iG.vexnum;i+)scanf(“%d”,&G.verticesi.data);G.verticesi.firstarc=NULL;printf(输入边的信息 v1,v2,weightn);for(k=0;kadjvex=j;p-weight=w;p-nextarc=G.verticesi.firstarc;G.verticesi.firstarc=p;q=(ArcNo
17、de*)malloc(sizeof(ArcNode);q-adjvex=i;q-nextarc=G.verticesj.firstarc;G.verticesj.firstarc=q;return OK;Status CreateGraph(ALGraph&G)int kind;printf(输入图的类型:0-DG,1-DN,2-UDG,3-UDN:n);scanf(“%d”,&kind);G.kind=(GraphKind)kind;switch(G.kind)/case DG:return CreateDG(G);case DN:return CreateDN(G);/case UDG:r
18、eturn CreateUDG(G);case UDN:return CreateUDN(G);default :return ERROR;void PrintGraph(ALGraph G)int i,j;ArcNode*p;printf(输入图的顶点数和边数:n);scanf(“%d%d”,&G.vexnum,&G.arcnum);pritnf(输入图的顶点信息:n);for(i=0;iG.vexnum;i+)scanf(“%d”,&G.verticesi.data);printf(图的邻接表:n);for(i=0;iadjvex;printf(“%d”,G.verticesj.data);p=p-nextarc;/while printf(“n”);/for printf(“n”);运行结果:四.实验结果的分析与评价(该部分如不够填写,请另加附页)1.图的无向和有向,边数和点数决定了存储图的方式。注:实验成绩等级分为(90100分)优,(8089分)良,(70-79 分)中,(6069 分)及格,(59 分)不及格。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1