数据结构实验指导书实验6.docx
- 文档编号:5613418
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:17
- 大小:20.59KB
数据结构实验指导书实验6.docx
《数据结构实验指导书实验6.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书实验6.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构实验指导书实验6
实验六图的操作
一、实验目的
1.掌握图的基本存储方法:
邻接矩阵、邻接表。
2.掌握有关图的操作算法并用高级语言编程实现;
3.熟练掌握图的两种遍历方法(深度优先搜索和广度优先搜索);
4.熟练掌握求图的最小生成树的两种算法(Prim算法和Kruskal算法)。
5.掌握拓扑排序和最短路径求解方法。
6.将图的相关操作与具体问题的求解相结合。
二、预备知识
1.复习图的邻接矩阵和邻接表两种存储结构。
2.复习图的两种遍历方法(深度优先搜索和广度优先搜索)。
3.复习求图的最小生成树的两种算法。
4.复习其他与图形结构相关的理论知识。
5.C语言程序设计基础,文件的操作。
三、实验环境
1.台式计算机每人一台;
2.软件:
VisualC++6.0
四、实验要求
本实验为综合设计型实验,要求学生自己选择一个与图有关的实际应用问题,利用图的相关知识进行求解。
要求撰写实验报告,包括以下内容:
1.问题描述。
(说明要求解的问题是什么)
2.问题分析。
(分析应该用什么方法进行求解)
3.问题的求解。
(设计一个具体的待求问题)
1)具体问题的逻辑结构图。
(画出对应的有向图、无向图、有向网或无向网)
2)设计数据结构。
a)数据元素类型定义
b)图的存储结构定义
c)文件结构定义(输入、输出文件设计。
要求图的输入、输出数据均存入文本文件,此处还要给出与逻辑结构图相对应的输入文件中的数据,可截图)
3)程序结构
a)函数说明
b)函数实现
c)主函数
4)程序运行结果
a)运行结果界面截图
b)输出文本文件内容截图
4.简要给出所编写程序中算法的时间复杂度分析结果。
5.简要给出算法设计小结和心得。
关于图的应用可以考虑如下问题:
(1)网络架设问题:
若要在n个城市之间建设通讯网络,如何以最低的经济代价建设这个通讯网络?
提示:
该问题只需要架设n-1条线路即可,是一个网的最小生成树问题。
可以考虑利用Prim算法或Kruskal算法求出网的最小生成树,并且将最小生成树中的各条边以及他们的权值及各边权值之和(最小代价)保存到一个文本文件。
(2)课程设置问题:
已知某专业的课程之间的关系,试为该专业的学生设计教学计划,使他们能在最短时间内修完所有课程。
提示:
可以利用对有向图进行拓扑排序的方法来处理。
可用文本文件存储有向图的数据,作为输入数据。
将分析的结果存入另外一个文本文件。
(3)交通网问题:
设计一个交通指南系统,指导咨询者以最低的代价从甲地到乙地。
提示:
交通网可以用带权有向网络来表示。
顶点表示城市,边表示两个城市有路连通,边上的权值可以表示两城市之间的距离、交通费或花费的时间,可以参考求最短路径的佛洛伊德(Floyd)算法。
(4)其他与图有关的问题的求解。
附:
参考程序1:
图的邻接矩阵存储结构实现及深度优先搜索
//-------------------------Graph1.cpp-------------------------
//图的邻接矩阵存储结构实现及深度优先搜索
//本程序实现了有向图、有向网、无向图、无向网邻接矩阵的建立算法
//并实现了输出邻接矩阵、求顶点的度、图的深度优先搜索等算法。
#include
#include
#include
#include
#include
#defineNULL0
//1.1图的邻接矩阵存储结构定义
typedefintVRType;//顶点关系类型
typedefcharVertexType;//顶点类型
typedefcharInfoType;//边或弧所代表的信息类型
#defineINFINITY1000//最大值∞
#defineMAX_VERTEX_NUM20//最大顶点数
typedefenum{DG,DN,AG,AN}GraphKind;
//{有向图,有向网,无向图,无向网}
typedefstructArc{
VRTypeadj;//VRType是顶点关系类型。
对图而言,是int型,
//用1或0表示是否相邻;对网络而言,则为权值的类型
InfoType*info;//指向边或弧所代表的信息的指针
}Arc,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct{
VertexTypevertex[MAX_VERTEX_NUM];//顶点数组,
//VertexType为顶点类型
AdjMatrixarcs;//邻接矩阵
intvexnum,arcnum;//顶点数、弧(边)数
GraphKindkind;//图的种类
}Graph;
//1.2基本操作的说明
voidCreateAG(Graph&G);//建立无向图的邻接矩阵
voidCreateDG(Graph&G);//建立有向图的邻接矩阵
voidCreateAN(Graph&G);//建立无向网的邻接矩阵
voidCreateDN(Graph&G);//建立有向网的邻接矩阵
voidPrintGraph(GraphG);//输出图的邻接矩阵
intDegree(GraphG,inti);//求图G中下标为i的顶点的度
voidDFS(GraphG,intv);//从顶点v出发深度优先搜索
voidDFSTraverse(GraphG);//图G的深度优先搜索(DFS)
voidVisit(GraphG,intv);//访问顶点v
intFirstAdjVex(GraphG,intv);//查找v的第一个邻接顶点
intNextAdjVex(GraphG,intv,intw);//查找v的在w之后的下一个邻接顶点
//1.3基本操作的实现
//1.3.1建立无向图的邻接矩阵
voidCreateAG(Graph&G){
inti,j,k,n,e;
InfoType*info=NULL;
cout<<"请输入无向图G的顶点个数和边数:
";
cin>>n>>e;
G.vexnum=n;//顶点个数
G.arcnum=e;//边数
G.kind=AG;//图的种类
cout< "< for(i=0;i for(i=0;i for(j=0;j {//邻接矩阵的初始化 G.arcs[i][j].adj=0; G.arcs[i][j].info=NULL; } cout<<"请输入"< "< for(k=0;k { //cin>>i>>j>>info;//输入边(i,j)和所代表的信息 cin>>i>>j; G.arcs[i][j].adj=G.arcs[j][i].adj=1; //G.arcs[i][j].info=G.arcs[j][i].info=info; } } //1.3.2建立有向图的邻接矩阵 voidCreateDG(Graph&G){ inti,j,k,n,e; InfoType*info=NULL; cout<<"请输入有向图G的顶点个数和边数: "; cin>>n>>e; G.vexnum=n;//顶点个数 G.arcnum=e;//边数 G.kind=DG;//图的种类 cout<<"请输入顶点序列以构造顶点向量: "< for(i=0;i for(i=0;i for(j=0;j { //邻接矩阵的初始化 G.arcs[i][j].adj=0; G.arcs[i][j].info=NULL; } cout<<"请输入"< "< for(k=0;k { //cin>>i>>j>>info;//输入边(i,j)和所代表的信息 cin>>i>>j; G.arcs[i][j].adj=1; //G.arcs[i][j].info=info; } } //1.3.3建立无向网的邻接矩阵 voidCreateAN(Graph&G){ inti,j,k,w,n,e; InfoType*info=NULL; cout<<"请输入无向网G的顶点个数和边数: "; cin>>n>>e; G.vexnum=n;//顶点个数 G.arcnum=e;//边数 G.kind=AN;//图的种类 cout<<"请输入顶点序列以构造顶点向量: "< for(i=0;i for(i=0;i for(j=0;j { //邻接矩阵的初始化 G.arcs[i][j].adj=INFINITY; G.arcs[i][j].info=NULL; } cout< "< for(k=0;k { //cin>>i>>j>>w>>info;//输入边(i,j)、权值w和所代表的信息 cin>>i>>j>>w; //G.arcs[i][j]=G.arcs[j][i]={w,info}; G.arcs[i][j].adj=G.arcs[j][i].adj=w; //G.arcs[i][j].info=G.arcs[j][i].info=info; } } //1.3.4建立有向网的邻接矩阵 voidCreateDN(Graph&G){ inti,j,k,w,n,e; InfoType*info=NULL; cout<<"请输入有向网G的顶点个数和边数: "; cin>>n>>e; G.vexnum=n;//顶点个数 G.arcnum=e;//边数 G.kind=DN;//图的种类 cout< "< for(i=0;i for(i=0;i for(j=0;j { //邻接矩阵的初始化 G.arcs[i][j].adj=INFINITY; G.arcs[i][j].info=NULL; } cout< "< for(k=0;k { //cin>>i>>j>>w>>info;//输入边(i,j)、权值w和所代表的信息 cin>>i>>j>>w; G.arcs[i][j].adj=w; G.arcs[i][j].info=info; } } //1.3.5输出图的邻接矩阵 voidPrintGraph(GraphG) { inti,j; switch(G.kind) { caseAG: printf("图G为无向图\n");break; caseDG: printf("图G为有向图\n");break; caseAN: printf("图G为无向网\n");break; caseDN: printf("图G为有向网\n");break; } printf("该图的顶点个数为: G.vexnum=%d,边数为: G.arcnum=%d.\n",G.vexnum,G.arcnum); printf("该图的顶点序列为: \n"); for(i=0;i cout< cout< printf("该图的邻接矩阵为: \n"); for(i=0;i { for(j=0;j { if(G.arcs[i][j].adj==INFINITY)//无穷大 cout< elsecout< } cout< } } //1.3.6求图G中下标为i的顶点的度 intDegree(GraphG,inti) { intj,d=0,din=0,dout=0; switch(G.kind) { caseAG: for(j=0;j d+=G.arcs[i][j].adj; break; caseDG: for(j=0;j dout+=G.arcs[i][j].adj;//出度 for(j=0;j din+=G.arcs[j][i].adj;//入度 d=dout+din; break; caseAN: for(j=0;j if(G.arcs[i][j].adj! =INFINITY)d++; break; caseDN: for(j=0;j if(G.arcs[i][j].adj! =INFINITY)dout++;//出度 for(j=0;j if(G.arcs[j][i].adj! =INFINITY)din++;//入度 d=dout+din; break;break; } if(G.kind==DG||G.kind==DN) printf("\n顶点%d的入度为: %d,出度为: %d,度为: %d.\n",i,din,dout,d); elseprintf("\n顶点%d的度为: %d.\n",i,d); returnd; } boolvisited[MAX_VERTEX_NUM]; //1.3.7访问顶点v(在邻接矩阵存储结构中) voidVisit(GraphG,intv) {if(v visited[v]) //cout< printf("%3c",G.vertex[v]); } //1.3.8查找v的第一个邻接顶点(在邻接矩阵存储结构中) intFirstAdjVex(GraphG,intv) {inti; if(G.kind==AG||G.kind==DG) for(i=0;i if(G.arcs[v][i].adj==1&&! visited[i])break; if(G.kind==AN||G.kind==DN) for(i=0;i if(G.arcs[v][i].adj! =INFINITY&&! visited[i])break; if(i==G.vexnum)i=-1;//没有第一个邻接点的标志 returni; } //1.3.9查找v的在w之后的下一个邻接顶点 intNextAdjVex(GraphG,intv,intw) {inti; if(G.kind==AG||G.kind==DG) for(i=w+1;i if(G.arcs[v][i].adj==1&&! visited[i])break; if(G.kind==AN||G.kind==DN) for(i=w+1;i if(G.arcs[v][i].adj! =INFINITY&&! visited[i])break; if(i==G.vexnum)i=-1;//没有下一个邻接点的标志 returni; } //1.3.10从顶点v出发深度优先搜索 voidDFS(GraphG,intv)//从顶点v出发 {intw; Visit(G,v);//访问顶点v //printf("%3c",G.vertex[v]); visited[v]=true; for(w=FirstAdjVex(G,v);w! =-1;w=NextAdjVex(G,v,w)) //对v的未访问的邻接点w递归调用DFS if(! visited[w])DFS(G,w); } //1.3.11图G的深度优先搜索(DFS) voidDFSTraverse(GraphG){ intv; for(v=0;v visited[v]=false;//初始化访问标志数组 for(v=0;v if(! visited[v])DFS(G,v);//对尚未访问的 //顶点调用DFS } //1.4编写主函数实现图的相关操作 voidmain() { charc; inti; GraphG; L1: printf("输入1: 建立无向图的邻接矩阵\n"); printf("输入2: 建立有向图的邻接矩阵\n"); printf("输入3: 建立无向网的邻接矩阵\n"); printf("输入4: 建立有向网的邻接矩阵\n"); printf("输入0: 退出! \n"); c=getchar(); switch(c) { case'1': CreateAG(G);break; case'2': CreateDG(G);break; case'3': CreateAN(G);break; case'4': CreateDN(G);break; case'0': exit(0); } printf("输出建立的图的邻接矩阵: \n"); PrintGraph(G);//输出图的邻接矩阵 L2: printf("请输入要求度的顶点序号(0--%d): ",G.vexnum-1); scanf("%d",&i); Degree(G,i); getchar();//读入换行符 printf("\n是否重复上述操作求其他顶点的度? (y|n)"); if(getchar()=='y')gotoL2; //{有向图,有向网,无向图,无向网} typedefstructArc{ VRTypeadj;//VRType是顶点关系类型。 对图而言,是int型, //用1或0表示是否相邻;对网络而言,则为权值的类型 InfoType*info;//指向边或弧所代表的信息的指针 }Arc,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedefstruct{ VertexTypevertex[MAX_VERTEX_NUM];//顶点数组, //VertexType为顶点类型 AdjMatrixarcs;//邻接矩阵 intvexnum,arcnum;//顶点数、弧(边)数 GraphKindkind;//图的种类 }Graph; //2.2基本操作的说明 voidCreateAN(Graph&G);//建立无向网的邻接矩阵 voidPrintAN(GraphG);//输出无向网的邻接矩阵 voidPrim(GraphG,intv);//求最小生成树——Prim算法 //2.3基本操作的实现 //2.3.1建立无向网的邻接矩阵 voidCreateAN(Graph&G){ inti,j,k,w,n,e; InfoType*info=NULL; cout<<"请输入无向网G的顶点个数和边数: "; cin>>n>>e; G.vexnum=n;//顶点个数 G.arcnum=e;//边数 G.kind=AN;//图的种类 cout<<"请输入顶点序列以构造顶点向量: "< for(i=0;i for(i=0;i for(j=0;j { //邻接矩阵的初始化 G.arcs[i][j].adj=INFINITY; G.arcs[i][j].info=NULL; } cout< "< for(k=0;k { cin>>i>>j>>w;//输入边(i,j)、权值w G.arcs[i][j].adj=G.arcs[j][i].adj=w; } } //2.3.2输出无向网的邻接矩阵 voidPrintAN(GraphG) { inti,j; if(G.kind! =AN) printf("图G不是无向网\n"); else { printf("图G为无向网\n"); printf("顶点个数为: G.vexnum=%d\n",G.vexnum); printf("边数为: G.arcnum=%d.\n",G.arcnum); printf("顶点序列G.vertex[]为: \n"); for(i=0;i cout< cout< printf("邻接矩阵G.arcs[][]为: \n"); for(i=0;i { for(j=0;j { if(G.arcs[i][j].adj==INFINITY)//无穷大 cout< elsecout< } cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书