实验六 图的创建及应用IWord下载.docx
- 文档编号:19497970
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:32
- 大小:113.27KB
实验六 图的创建及应用IWord下载.docx
《实验六 图的创建及应用IWord下载.docx》由会员分享,可在线阅读,更多相关《实验六 图的创建及应用IWord下载.docx(32页珍藏版)》请在冰豆网上搜索。
首先由键盘输入待创建的图的顶点数,弧数以及是否含有弧信息,然后由顶点数控制循环构造顶点向量,接着由顶点数控制循环初始化邻接矩阵(adj=0,info=NUll),再次输入弧信息,此时将输入的弧的弧头和弧尾与顶点信息进行匹配,从而确定弧在邻接矩阵中的位置(有弧时为1),如果输入的弧有信息的话,在进行有无弧的判断写邻接矩阵时进行绑定,有键盘输入即可。
邻接表结构创建图:
首先由键盘输入待创建的图的顶点数,弧数,然后由顶点数控制循环初始化顶点信息(顶点数据信息及顶点第一条弧指针(firstarc=NULL)),接着由弧数控制循环输入弧头和弧尾顶点,与之前建立的顶点信息进行匹配,从而确定弧头和弧尾的位置信息,此时生成一个弧结点类型的存储空间,采用单链表中在表头插入新结点的方法,将弧的信息插入到顶点的第一条弧之后,如同此法,对每个顶点都进行以上操作,这就建立了图的邻接表结构。
深度优先搜索判断是否存在指定位置的路径算法分析
首先判断指定的两个位置向量是否相等,如果相等,则肯定有路径相连,否则从指定的弧头结点开始搜索,将该顶点访问过的弧的访问标志置1,任何到该弧的弧头顶点进行如上操作,当搜索该顶点的所有弧都没有找到则返回0,然后返回上一顶点,对该顶点的其他弧进行访问。
当指定顶点的所有弧都被搜索访问过都没有找到,此时程序返回0。
核心程序
此程序中用到的自己编写的头文件以在下面给出,而头文件的说明则在主函数中文件包含部分的注释处,核心程序如下:
1.主函数如下:
#include"
iostream"
//输入输出流库头文件
fstream"
//文件操作流库头文件
windows.h"
//cmd窗口设置函数头文件
ADT.h"
//数据结构中相关结构体类型定义及相关数据类型定义
DataStructure_Graph.h"
//数据结构第七章图相关函数的定义及声明
usingnamespacestd;
voidmain_menu(void);
voidminor_menu1(void);
voidminor_menu2(void);
voidminor_menu3(void);
intmain(void)
{
system("
title数据结构实验实验六:
图的创建及应用(I)"
);
//设置cmd窗口标题
colorF1"
//设置控制台窗口的背景色和前景色
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<
endl<
"
cin>
ch1;
switch(ch1)
{
case'
//创建有向图
system("
CreateGraph(MG);
cout<
操作完毕!
<
endl;
pause"
continue;
}
2'
//显示图信息
DisplayGraph(MG);
3'
//返回上一界面
break;
default:
输入错误,请重新输入!
system("
break;
}
break;
}
case'
minor_menu2();
//二层菜单输入选择
//创建图信息
CreateGraph(ALG);
//显示图信息
DisplayGraph(ALG);
case'
minor_menu3();
ALGraphR_ALG;
inti,j;
//待搜索的顶点的位置
//二层菜单输入选择
//使用已创建的邻接表表示的图进行搜索
请输入待搜索的顶点v(i)顶点v(j)(以空格分隔):
cin>
i>
j;
intflag=exist_path_DFS(G,i,j);
if(flag)
cout<
搜索成功!
存在顶点v(i):
G.vertices[i].data<
顶点v(j):
G.vertices[j].data<
的路径"
else
搜索失败!
不存在顶点v(i):
到顶点v(j):
//创建新图进行搜索
CreateGraph(R_ALG);
i>
intflag=exist_path_DFS(R_ALG,i,j);
R_ALG.vertices[i].data<
R_ALG.vertices[j].data<
4'
return0;
default:
cout<
功能选择错误,请重新输入!
}
return0;
}
voidmain_menu(void)
cout<
=========================================================================="
图的创建及应用"
=========================功能选择========================>
【1】邻接矩阵表示法"
【2】邻接表表示法"
【3】基于深度优先搜索判断是否存在指定位置的路径"
【4】退出程序"
voidminor_menu1(void)
=====邻接矩阵表示法=====>
1.创建有向图"
2.显示图信息"
3.返回上一界面"
voidminor_menu2(void)
=====邻接表表示法=====>
voidminor_menu3(void)
=====基于深度优先搜索判断是否存在指定路径=====>
1.使用已创建的邻接表表示的图进行搜索判断"
2.创建新的图进行搜索判断"
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];
//顶点向量结点结构描述
AdjListvertices;
//邻接表
intvexnum,arcnum;
//图的当前顶点数和弧数
ALGraphKindkind;
//图的种类标志
}ALGraph;
//邻接表结构描述
intvisited[MAX_VERTEX_NUM];
//访问标志数组(全局量)
Status(*VisitFunc)(VertexType);
//函数变量
#endif/*ADT_H_*/
3.头文件"
中部分函数定义如下:
#include<
stdio.h>
malloc.h>
DataStructure_StackQueue.h"
//数据结构第三章栈和队列相关函数的定义及声明
/************************************************************
*功能函数声明区
************************************************************/
intLocateVex(MGraphG,VertexTypeu);
//若G中存在顶点u,则返回该顶点在图中的位置,否则返回1
StatusCreateGraph(MGraph&
G);
//采用数组(邻接矩阵)表示法,构造图G
StatusCreateDG(MGraph&
//采用数组(邻接矩阵)表示法,构造有向图G
StatusCreateDN(MGraph&
//采用数组(邻接矩阵)表示法,构造有向网G
StatusCreateUDN(MGraph&
//采用数组(邻接矩阵)表示法,构造无向图G
StatusCreateUDG(MGraph&
//采用数组(邻接矩阵)表示法,构造无向网G
StatusDestroyGraph(MGraph&
//销毁图G
StatusDisplayGraph(MGraphG);
//输出邻接矩阵表示图G
voidDFSTraverse(MGraphG,Status(*Visit)(intv));
//深度优先搜索邻接矩形表示的图G
intLocateVex(ALGraphG,VertexTypeu);
StatusCreateGraph(ALGraph&
//采用邻接表存储结构,构造没有相关信息的4种图G
StatusDestroyGraph(ALGraph&
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<
G.vexnum;
++i)
if(strcmp(u,G.vexs[i])==0)
returni;
return-1;
}//LocateVex
StatusCreateGraph(MGraph&
G)
采用数组(邻接矩阵)表示法,构造图G
图G
返回函数结果状态
G)
请输入图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
采用数组(邻接矩阵)表示法,构造有向图G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验六 图的创建及应用I 实验 创建 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)