当前位置:文档之家› 数据结构实验报告5

数据结构实验报告5

《数据结构》实验报告班级:10011006 姓名:刘恋学号:2010302521 E-mail:_1020383169@日期:12.21◎实验题目:图的结构建立和最短路径算法◎实验内容:利用邻接矩阵构造图,并求出某一顶点到其余顶点的最短路径并打印输出。

一、需求分析1、本实验中,以计算机和用户的对话形式进行。

2、程序所执行的命令有:构造顶点关系和边的存储结构;初始图的结构;详图中插入元素;查找元素在图顶点中的位置;创建邻接表;查找最短路径;输出。

3、显示界面:二概要设计为了实现上述操作,应以链栈为存储结构。

1. 基本操作:void InitGraph(MGraph *G)void InsertGreph(MGraph *G,int i,VertexType e)插入元素int LocateVex(MGraph G,VertexType v1)确定元素位置void CreatGraph(MGraph *G)构建邻接矩阵void ShortestPath(MGraph G,int v0,int **p,int *D) 查找最短路径void Print(MGraph G)输出邻接矩阵三详细设计1.元素类型,结构定义typedef struct AreCell{int adj; //权值}AreCell,**AdjMatrix;typedef struct type{char data[3];//顶点值}VertexType;typedef struct{VertexType *vexs;//顶点向量AdjMatrix arcs; //邻接矩阵int vexnum,arcnum;//定点个数,弧的条数}MGraph;2.各模块分析:(1)主函数模块int main(){MGraph G;VertexType e;int i,j;int **p;InitGraph(&G);p=(int **)malloc(G.vexnum*sizeof(int));for(i=0;i < G.vexnum;i++)p[i]=(int *)malloc(G.vexnum*sizeof(int));D=(int *)malloc(G.vexnum*sizeof(int));printf("顶点值:\n");for(i=0;i < G.vexnum;++i){//给图顶点向量赋值scanf("%s",e.data);InsertGreph(&G,i,e);}CreatGraph(&G);//构造图结构printf("邻接矩阵为:\n");Print(G);//输出临界矩阵for(i=0;i < G.vexnum;i++){ShortestPath(G,i,p,D);//调用最短函数for(j=0;j < G.vexnum;j++)if(i!=j)printf("%s到%s的最短路径为%d\n",G.vexs[i].data,G.vexs[j].data,D[j]);printf("\n\n");}getch();return 0;}(2)初始图模块;void InitGraph(MGraph *G){int i,nu,mu;printf("\n输入顶点的个数和弧的个数:");scanf("%d %d",&nu,&mu);G->arcs=(AreCell **)malloc(nu*sizeof(AreCell *));for(i=0;i < nu;i++)//分配临界矩阵空间G->arcs[i]=(AreCell *)malloc(nu*sizeof(AreCell));G->vexs=(VertexType *)malloc(nu*sizeof(VertexType));//分配顶点空间G->vexnum=nu;G->arcnum=mu;//吐得顶点数和边数}(3)元素插入模块void InsertGreph(MGraph *G,int i,VertexType e){if(i < 0||i > G->vexnum)return;strcpy(G->vexs[i].data,e.data);}(4)元素位置确定模块:int LocateVex(MGraph G,VertexType v1){//确定v1在定点中的位置int i;for(i=0;i<G.vexnum;i++)if(strcmp(v1.data,G.vexs[i].data)==0)return i;return -1;}(5)构造有向图模块;void CreatGraph(MGraph *G){ //建立有向图G的邻接矩阵存储int i,j,k,*p,w;VertexType v1,v2;p=(int *)malloc(G->vexnum*sizeof(int));for(i=0;i < 10;i++)p[i]=0;for(i=0;i < G->vexnum;i++)//初始邻接表{for(j=0;j < G->vexnum; ++j)G->arcs[i][j].adj=INFINITY;}for(k=0;k<G->arcnum;++k){printf("\n输入第%d条弧相对的两个顶点的值:\n",k+1);scanf("%s %s",v1.data,v2.data);//输入相关林的两个点值printf("输入他们的权值:");scanf("%d",&w);i=LocateVex(*G,v1);j=LocateVex(*G,v2);//用i,j来确定他们的位置G->arcs[i][j].adj=w;}}(6)求最短路径;void ShortestPath(MGraph G,int v0,int **p,int *D){//球最短路径int v,u,i,w,min;int *final;final=(int *)malloc(G.vexnum*sizeof(int));//分配空间for (v=0;v < G.vexnum;++v){//对D[v]和P[v][w]初始化final[v]=0;D[v]=G.arcs[v0][v].adj;for(w=0;w < G.vexnum;++w)p[v][w]=0;//设空路径if(D[v]< INFINITY){//v0到v有路径p[v][v0]=1;p[v][v]=1;}}D[v0]=0;final[v0]=1;//初始化,v0定点属于S集//开始主循环,每次球的v0到某个v顶点的对短距离,并加v到S集for(i=1;i<G.vexnum;i++){//直到所有节点都并入s集min=INFINITY;//当前所知离v0顶点的最短距离for (w=0;w < G.vexnum;++w){//扫描一遍D,找出此时D中的最小值if(!final[w])//w顶点在V-S 中if(D[w] < min)//w顶点离v0顶点更近{v=w;min=D[w];}}final[v]=1;//离v0顶点最近的v加入S集for(w=0;w < G.vexnum;++w){//更新当前最短路径及距离if(!final[w] && (min+G.arcs[v][w].adj < D[w])){D[w]=min+G.arcs[v][w].adj;//修改D[w]for(u=0; u < G.vexnum;u++)p[w][u]=p[v][u];p[w][w]=1;}}free(final);}}(7)输出模块:void Print(MGraph G){//输出临界矩阵int i,j;for(i=0;i < G.vexnum;i++){//对于途中的每一个节点for(j=0;j < G.vexnum;j++){if(G.arcs[i][j].adj!=INFINITY)printf("\t%d",G.arcs[i][j].adj);else{if(i==j)printf("\t0");elseprintf("\t无穷");}}printf("\n");}}三.完整程序:#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#include<conio.h>#include<limits.h>#define INFINITY INT_MAXtypedef struct AreCell{int adj; //权值}AreCell,**AdjMatrix;typedef struct type{char data[3];//顶点值}VertexType;typedef struct{VertexType *vexs;//顶点向量AdjMatrix arcs; //邻接矩阵int vexnum,arcnum;//定点个数,弧的条数}MGraph;void InitGraph(MGraph *G){//初始图int i,nu,mu;printf("\n输入顶点的个数和弧的个数:");scanf("%d %d",&nu,&mu);G->arcs=(AreCell **)malloc(nu*sizeof(AreCell *));for(i=0;i < nu;i++)//分配临界矩阵空间G->arcs[i]=(AreCell *)malloc(nu*sizeof(AreCell));G->vexs=(VertexType *)malloc(nu*sizeof(VertexType));//分配顶点空间G->vexnum=nu;G->arcnum=mu;//吐得顶点数和边数}void InsertGreph(MGraph *G,int i,VertexType e){if(i < 0||i > G->vexnum)return;strcpy(G->vexs[i].data,e.data);}int LocateVex(MGraph G,VertexType v1){//确定v1在定点中的位置int i;for(i=0;i<G.vexnum;i++)if(strcmp(v1.data,G.vexs[i].data)==0)return i;return -1;}void CreatGraph(MGraph *G){ //建立有向图G的邻接矩阵存储int i,j,k,*p,w;VertexType v1,v2;p=(int *)malloc(G->vexnum*sizeof(int));for(i=0;i < 10;i++)p[i]=0;for(i=0;i < G->vexnum;i++)//初始邻接表{for(j=0;j < G->vexnum; ++j)G->arcs[i][j].adj=INFINITY;}for(k=0;k<G->arcnum;++k){printf("\n输入第%d条弧相对的两个顶点的值:\n",k+1);scanf("%s %s",v1.data,v2.data);//输入相关林的两个点值printf("输入他们的权值:");scanf("%d",&w);i=LocateVex(*G,v1);j=LocateVex(*G,v2);//用i,j来确定他们的位置G->arcs[i][j].adj=w;}}void ShortestPath(MGraph G,int v0,int **p,int *D){//求最短路径int v,u,i,w,min;int *final;final=(int *)malloc(G.vexnum*sizeof(int));//分配空间for (v=0;v < G.vexnum;++v){//对D[v]和P[v][w]初始化final[v]=0;D[v]=G.arcs[v0][v].adj;for(w=0;w < G.vexnum;++w)p[v][w]=0;//设空路径if(D[v]< INFINITY){//v0到v有路径p[v][v0]=1;p[v][v]=1;}}D[v0]=0;final[v0]=1;//初始化,v0定点属于S集//开始主循环,每次球的v0到某个v顶点的对短距离,并加v到S集for(i=1;i<G.vexnum;i++){//直到所有节点都并入s集min=INFINITY;//当前所知离v0顶点的最短距离for (w=0;w < G.vexnum;++w){//扫描一遍D,找出此时D中的最小值if(!final[w])//w顶点在V-S 中if(D[w] < min)//w顶点离v0顶点更近{v=w;min=D[w];}}final[v]=1;//离v0顶点最近的v加入S集for(w=0;w < G.vexnum;++w){//更新当前最短路径及距离if(!final[w] && min < INFINITY && G.arcs[v][w].adj < INFINITY && (min+G.arcs[v][w].adj < D[w])){D[w]=min+G.arcs[v][w].adj;//修改D[w]for(u=0; u < G.vexnum;u++)p[w][u]=p[v][u];p[w][w]=1;}}}free(final);}void Print(MGraph G){//输出临界矩阵int i,j;for(i=0;i < G.vexnum;i++){//对于途中的每一个节点for(j=0;j < G.vexnum;j++){if(G.arcs[i][j].adj!=INFINITY)printf("\t%d",G.arcs[i][j].adj);else{if(i==j)printf("\t0");elseprintf("\t无穷");}}printf("\n");}}int main(){MGraph G;VertexType e;int i,j;int **p;int *D;InitGraph(&G);p=(int **)malloc(G.vexnum*sizeof(int));for(i=0;i < G.vexnum;i++)p[i]=(int *)malloc(G.vexnum*sizeof(int));D=(int *)malloc(G.vexnum*sizeof(int));printf("顶点值:\n");for(i=0;i < G.vexnum;++i){//给图顶点向量赋值scanf("%s",e.data);InsertGreph(&G,i,e);}CreatGraph(&G);//构造图结构printf("邻接矩阵为:\n");Print(G);//输出临界矩阵ShortestPath(G,0,p,D);//调用最短函数for(i=1;i < G.vexnum;i++)printf("%s到%s的最短路径为%d\n",G.vexs[0].data,G.vexs[i].data,D[i]);free(p);free(D);return 0;}四使用说明、测试分析及结果1.程序使用说明(1)本程序的运行环境为VC6.0。

相关主题