C++图的创建与遍历实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五图的遍历及其应用实现一、实验目的
1.熟悉图常用的存储结构。
2.掌握在图的邻接矩阵和邻接表两种结构上实现图的两种遍历方法实现。
3.会用图的遍历解决简单的实际问题。
二、需求分析
很多问题都是建立在图的遍历的基础上实现的,所以必须有一个程序能够实现将图进行广度和深度遍历,必须对图的所有节点进行访问。
以无向图为例,以无向图的邻接表和邻接矩阵为存储结构,分别实现对图进行广度和深度遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应的生成树的边集。
三、实验内容
[题目一] :从键盘上输入图的顶点和边的信息,建立图的邻接表存储结构,然后以深度优先搜索和广度优先搜索遍历该图,并输出起对应的遍历序列. 试设计程序实现上述图的类型定义和基本操作,完成上述功能。该程序包括图类型以及每一种操作的具体的函数定义和主函数。
提示:
输入示例
上图的顶点和边的信息输入数据为:
5 7 DG
A B C D E
AB AE BC CD DA DB EC
四、结构算法模块:
typedef struct ArcNode//定义邻接表结构
{
int adjvex;//该弧所指向的顶点的位置
struct ArcNode *nextarc;//指向下一条弧的指针
}ArcNode;
typedef struct VNode//定义顶点结构类型
{
char data;//存放顶点信息
ArcNode *firstarc;//指向第一条依附于该定点的指针
}VNode,Adjlist[MAX_VEX_NUM];
typedef struct ALGraph
{
Adjlist vertices;
int vexnum;
int arcnum;
}ALGraph;
五、相关函数设计
Create_DG(ALGraph &G)//创建一个有向图图的邻接链表表示DFSTraverse(ALGraph G,int vex)//对图G做深度优先遍历BFSTraverse(ALGraph G)//有向图的广度遍历,从第v个顶点出发,v为顶点下标
locatevex(ALGraph G,char v)//图的基本操作,寻找顶点位置的下标DFS(ALGraph G,int v)//从第v个顶点出发递归地深度优先遍历图G
六、程序流程图
七、运行结果截图
最初程序运行界面如下:
输入图的先相关信息后运行结果(其中深度优先遍历的起点选择的是字符所在序列的序号,且0是起点),一下是深度优先遍历时选择不同的起点所出现的最终运行结果:
程序源代码:
//图的邻接表表示:
#include
#include
#include
using namespace std;
# define MAX_VEX_NUM 20//宏定义数组最大
int visited[MAX_VEX_NUM];//设置标志数组
queue
typedef struct ArcNode//定义邻接表结构
{
int adjvex;//该弧所指向的顶点的位置
struct ArcNode *nextarc;//指向下一条弧的指针
}ArcNode;
typedef struct VNode//定义顶点结构类型
{
char data;//存放顶点信息
ArcNode *firstarc;//指向第一条依附于该定点的指针}VNode,Adjlist[MAX_VEX_NUM];
typedef struct ALGraph
Adjlist vertices;
int vexnum;
int arcnum;
}ALGraph;
ALGraph G;//申明一个无向图的邻接矩阵类型
int locatevex(ALGraph G,char v)//图的基本操作,寻找顶点位置的下标
{
int i=0;
while(i i++; if(i return i; } void Create_DG(ALGraph &G)//创建一个有向图图的邻接链表表示 { cout<<"请输入图的顶点数和弧数:"< cin>>G.vexnum; cin>>G.arcnum; char v1; char v2; int v1locate; int v2locate; ArcNode * p; cout<<"输入图的顶点信息"< for(int i=0;i { cin>>G.vertices[i].data;//输入顶点值 G.vertices[i].firstarc=NULL;//初始化指针 } cout<<"请输入从起点到终点的一条弧所对应的顶点"< for(int k=1;k<=G.arcnum;k++)//输入各弧并创建十字链表 { cin>>v1>>v2;//输入一条弧的起点和终点 v1locate=locatevex(G,v1);//确定v1在图G中位置 v2locate=locatevex(G,v2);//确定v2在图G中位