实验六 图的创建及应用I.docx
- 文档编号:24831664
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:32
- 大小:113.72KB
实验六 图的创建及应用I.docx
《实验六 图的创建及应用I.docx》由会员分享,可在线阅读,更多相关《实验六 图的创建及应用I.docx(32页珍藏版)》请在冰豆网上搜索。
实验六图的创建及应用I
姓名
学号
实验项目
图的创建及应用(I)
实验内容
1.编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接矩阵和邻接表存储结构并输出显示。
(题集150页5.3扩充)
存储结构定义分别参见教材第161页和第163页。
2.试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。
注意:
算法中涉及的图的基本操作必须在此存储结构上实现。
(题集第49页7.27)
算法设计与程序实现:
算法分析
本次实验主函数采用循环选择结构,主函数调用自己编写的头文件DataStructure_Graph.h中的相关功能函数,完成实验要求。
主程序结构:
1、邻接矩阵表示法:
1、创建有向图;//调用CreateGraph(MG)创建有向图
2、显示图信息;//调用DisplayGraph(MG)显示图信息
3、返回上一界面;
2、邻接表表示法:
1、创建有向图;//调用CreateGraph(ALG)创建有向图
2、显示图信息;//调用DisplayGraph(ALG)显示图信息
3、返回上一界面;
3、基于深度优先搜索判断是否存在指定位置的路径:
1、使用已创建的邻接表表示的图进行搜索判断;//调用exist_path_DFS(ALG,i,j)搜索
2、创建新的图进行搜索判断;//创建新的有向图,并调用exist_path_DFS(R_ALG,i,j)搜索
3、返回上一界面;
4、退出程序
创建图的算法分析
邻接矩阵结构创建图:
首先由键盘输入待创建的图的顶点数,弧数以及是否含有弧信息,然后由顶点数控制循环构造顶点向量,接着由顶点数控制循环初始化邻接矩阵(adj=0,info=NUll),再次输入弧信息,此时将输入的弧的弧头和弧尾与顶点信息进行匹配,从而确定弧在邻接矩阵中的位置(有弧时为1),如果输入的弧有信息的话,在进行有无弧的判断写邻接矩阵时进行绑定,有键盘输入即可。
邻接表结构创建图:
首先由键盘输入待创建的图的顶点数,弧数,然后由顶点数控制循环初始化顶点信息(顶点数据信息及顶点第一条弧指针(firstarc=NULL)),接着由弧数控制循环输入弧头和弧尾顶点,与之前建立的顶点信息进行匹配,从而确定弧头和弧尾的位置信息,此时生成一个弧结点类型的存储空间,采用单链表中在表头插入新结点的方法,将弧的信息插入到顶点的第一条弧之后,如同此法,对每个顶点都进行以上操作,这就建立了图的邻接表结构。
深度优先搜索判断是否存在指定位置的路径算法分析
首先判断指定的两个位置向量是否相等,如果相等,则肯定有路径相连,否则从指定的弧头结点开始搜索,将该顶点访问过的弧的访问标志置1,任何到该弧的弧头顶点进行如上操作,当搜索该顶点的所有弧都没有找到则返回0,然后返回上一顶点,对该顶点的其他弧进行访问。
当指定顶点的所有弧都被搜索访问过都没有找到,此时程序返回0。
核心程序
此程序中用到的自己编写的头文件以在下面给出,而头文件的说明则在主函数中文件包含部分的注释处,核心程序如下:
1.主函数如下:
#include"iostream"//输入输出流库头文件
#include"fstream"//文件操作流库头文件
#include"windows.h"//cmd窗口设置函数头文件
#include"ADT.h"//数据结构中相关结构体类型定义及相关数据类型定义
#include"DataStructure_Graph.h"//数据结构第七章图相关函数的定义及声明
usingnamespacestd;
voidmain_menu(void);
voidminor_menu1(void);
voidminor_menu2(void);
voidminor_menu3(void);
intmain(void)
{
system("title数据结构实验实验六:
图的创建及应用(I)");//设置cmd窗口标题
system("colorF1");//设置控制台窗口的背景色和前景色
system("date/T");//输出当前的日期
while
(1)
{
main_menu();//主菜单显示
MGraphMG;//邻接矩阵表示图
ALGraphALG;//邻接表表示图
ALGraph&G=ALG;
charch;//主菜单输入选择
cout<<">请选择功能:
";
cin>>ch;
switch(ch)
{
case'1':
{
system("cls");
while
(1)
{
minor_menu1();//二级菜单显示
charch1;//二级菜单输入选择
cout<
";
cin>>ch1;
switch(ch1)
{
case'1':
//创建有向图
{
system("cls");
CreateGraph(MG);
cout<<"操作完毕!
"< system("pause"); system("cls"); continue; } case'2': //显示图信息 { system("cls"); DisplayGraph(MG); cout<<"操作完毕! "< system("pause"); system("cls"); continue; } case'3': //返回上一界面 { break; } default: { system("cls"); cout<<"输入错误,请重新输入! "< continue; } } system("cls"); break; } break; } case'2': { system("cls"); while (1) { minor_menu2(); charch1;//二层菜单输入选择 cout< "; cin>>ch1; switch(ch1) { case'1': //创建图信息 { system("cls"); CreateGraph(ALG); cout<<"操作完毕! "< system("pause"); system("cls"); continue; } case'2': //显示图信息 { system("cls"); DisplayGraph(ALG); cout<<"操作完毕! "< system("pause"); system("cls"); continue; } case'3': //返回上一界面 { break; } default: { system("cls"); cout<<"输入错误,请重新输入! "< continue; } } system("cls"); break; } break; } case'3': { system("cls"); while (1) { minor_menu3(); ALGraphR_ALG; inti,j;//待搜索的顶点的位置 charch1;//二层菜单输入选择 cout< "; cin>>ch1; switch(ch1) { case'1': //使用已创建的邻接表表示的图进行搜索 { system("cls"); cout<<"请输入待搜索的顶点v(i)顶点v(j)(以空格分隔): "; cin>>i>>j; intflag=exist_path_DFS(G,i,j); if(flag) cout<<"搜索成功! 存在顶点v(i): "< "< else cout<<"搜索失败! 不存在顶点v(i): "< "< cout<<"操作完毕! "< system("pause"); system("cls"); continue; } case'2': //创建新图进行搜索 { system("cls"); CreateGraph(R_ALG); cout<<"请输入待搜索的顶点v(i)顶点v(j)(以空格分隔): "; cin>>i>>j; intflag=exist_path_DFS(R_ALG,i,j); if(flag) cout<<"搜索成功! 存在顶点v(i): "< "< else cout<<"搜索失败! 不存在顶点v(i): "< "< cout<<"操作完毕! "< system("pause"); system("cls"); continue; } case'3': //返回上一界面 { break; } default: { system("cls"); cout<<"输入错误,请重新输入! "< continue; } } system("cls"); break; } break; } case'4': { return0; } default: { system("cls"); cout<<"功能选择错误,请重新输入! "< break; } } } return0; } voidmain_menu(void) { cout< cout<<"=========================================================================="< cout<<"图的创建及应用"< cout<<"<<=========================功能选择========================>>"< cout<<"【1】邻接矩阵表示法"< cout<<"【2】邻接表表示法"< cout<<"【3】基于深度优先搜索判断是否存在指定位置的路径"< cout<<"【4】退出程序"< cout<<"=========================================================================="< } voidminor_menu1(void) { cout<<"<<=====邻接矩阵表示法=====>>"< cout<<">1.创建有向图"< cout<<">2.显示图信息"< cout<<">3.返回上一界面"< } voidminor_menu2(void) { cout<<"<<=====邻接表表示法=====>>"< cout<<">1.创建有向图"< cout<<">2.显示图信息"< cout<<">3.返回上一界面"< } voidminor_menu3(void) { cout<<"<<=====基于深度优先搜索判断是否存在指定路径=====>>"< cout<<">1.使用已创建的邻接表表示的图进行搜索判断"< cout<<">2.创建新的图进行搜索判断"< cout<<">3.返回上一界面"< } 2.头文件”ADT.h”的部分程序如下: #ifndefADT_H_ #defineADT_H_ /************************图*************************/ /*------图的数组(邻接矩阵)存储表示------*/ #defineINFINITYINT_MAX//用整型最大值代替∞ #defineMAX_VERTEX_NUM20//最大顶点数 #defineMAX_NAME5//顶点字符串的最大长度+1 #defineMAX_INFO20//相关信息字符串的最大长度+1 #defineMAXSIZE100 typedefenum{MDG,MDN,UDG,UDN}MGraphKind;//有向图,有向网,无向图,无向网 typedefintVRType;//顶点关系类型,对无权图,用1或0 typedefcharInfoType;//弧信息类型 typedefcharVertexType[MAX_NAME];//顶点类型 typedefstructArcCell { VRTypeadj;//表示相邻否;对带权图,则为权值类型 InfoType*info;//弧相关信息的指针 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedefstruct { VertexTypevexs[MAX_VERTEX_NUM];//顶点向量 AdjMatrixarcs;//邻接矩阵 intvexnum,arcnum;//图的当前顶点数和弧数 MGraphKindkind;//图种类标志 }MGraph; /*------图的邻接表存储表示------*/ typedefenum{ADG,ADN,AUDG,AUDN}ALGraphKind;//{有向图,有向网,无向图,无向网} typedefstructArcNode { intadjvex;//该弧所指向的顶点的位置 structArcNode*nextarc;//指向下一条弧的指针 InfoType*info;//该弧相关信息指针 }ArcNode;//边表结点结构描述 typedefstructVNode { VertexTypedata;//顶点信息 ArcNode*firstarc;//指向第一条一幅该顶点的弧的指针 }VNode,AdjList[MAX_VERTEX_NUM];//顶点向量结点结构描述 typedefstruct { AdjListvertices;//邻接表 intvexnum,arcnum;//图的当前顶点数和弧数 ALGraphKindkind;//图的种类标志 }ALGraph;//邻接表结构描述 intvisited[MAX_VERTEX_NUM];//访问标志数组(全局量) Status(*VisitFunc)(VertexType);//函数变量 #endif/*ADT_H_*/ 3.头文件"DataStructure_Graph.h"中部分函数定义如下: #include #include #include"ADT.h" #include"DataStructure_StackQueue.h"//数据结构第三章栈和队列相关函数的定义及声明 /************************************************************ *功能函数声明区 ************************************************************/ intLocateVex(MGraphG,VertexTypeu);//若G中存在顶点u,则返回该顶点在图中的位置,否则返回1 StatusCreateGraph(MGraph&G);//采用数组(邻接矩阵)表示法,构造图G StatusCreateDG(MGraph&G);//采用数组(邻接矩阵)表示法,构造有向图G StatusCreateDN(MGraph&G);//采用数组(邻接矩阵)表示法,构造有向网G StatusCreateUDN(MGraph&G);//采用数组(邻接矩阵)表示法,构造无向图G StatusCreateUDG(MGraph&G);//采用数组(邻接矩阵)表示法,构造无向网G StatusDestroyGraph(MGraph&G);//销毁图G StatusDisplayGraph(MGraphG);//输出邻接矩阵表示图G voidDFSTraverse(MGraphG,Status(*Visit)(intv));//深度优先搜索邻接矩形表示的图G intLocateVex(ALGraphG,VertexTypeu);//若G中存在顶点u,则返回该顶点在图中的位置,否则返回1 StatusCreateGraph(ALGraph&G);//采用邻接表存储结构,构造没有相关信息的4种图G StatusDestroyGraph(ALGraph&G);//销毁图G VertexType*GetVex(ALGraphG,intv);//返回顶点v的值 intFirstAdjVex(ALGraphG,VertexTypev);//返回v的第一个邻接顶点的序号.若没有邻接顶点,返回-1 StatusDisplayGraph(ALGraphG);//输出邻接表表示图G voidDFSTraverse(ALGraphG,Status(*Visit)(intv));//深度优先搜索邻接表表示的图G intexist_path_DFS(ALGraphG,inti,intj);//判断邻接表方式存储的有向图G是否存在顶点i到j路径 /************************************************************ *功能函数定义区 ************************************************************/ /********************邻接矩阵表示********************/ /* *函数原型: intLocateVex(MGraph&G,VertexTypeu) *函数功能: 若G中存在顶点u,则返回该顶点在图中的位置,否则返回1 *入口参数: 已存在的图G,与G中顶点类型相同的顶点u *出口参数: 顶点在图中的位置,否则返回-1 */ intLocateVex(MGraphG,VertexTypeu) { inti=0; for(inti=0;i if(strcmp(u,G.vexs[i])==0) returni; return-1; }//LocateVex /* *函数原型: StatusCreateGraph(MGraph&G) *函数功能: 采用数组(邻接矩阵)表示法,构造图G *入口参数: 图G *出口参数: 返回函数结果状态 */ StatusCreateGraph(MGraph&G) { cout<<"请输入图G的类型(有向图: 0,有向网: 1,无向图: 2,无向网: 3): "; //cin>>kind; scanf_s("%d",&G.kind);//自定义输入函数,读入一个随机值 switch(G.kind) { caseMDG: returnCreateDG(G);//构造有向图G caseMDN: returnCreateDN(G);//构造有向网G caseUDG: returnCreateUDG(G);//构造无向图G caseUDN: returnCreateUDN(G);//构造无向网G default: returnERROR; } returnOK; }//CreateGraph /* *函数原型: StatusCreateDG(MGraph&G) *函数功能: 采用数组(邻接矩阵)表示法,构造有向图G *入口参数: 图G *出口参数: 返回函数结果状态
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验六 图的创建及应用I 实验 创建 应用