数据结构实验报告(六)「终于解决」

数据结构实验报告(六)「终于解决」数据结构实验报告(六)一、实验名称实验六 图的实验1——图的邻接矩阵存储实现二、实验目的1、 熟练理解图的相关概念;2、 掌握图的邻接矩阵的存储方法的实现;3、 学会图的遍历算法三、实验内容1、自己确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。实现图的构造,并完成:1) 用深度优先和广度优先两种算法对图进行遍历,输出顶点序列数

大家好,欢迎来到IT知识分享网。

数据结构实验报告(六)

一、实验名称

实验六  图的实验1——图的邻接矩阵存储实现

二、 实验目的

1、  熟练理解图的相关概念;

2、  掌握图的邻接矩阵的存储方法的实现;

3、  学会图的遍历算法

三、 实验内容

1、自己确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。实现图的构造,并完成:

1)  用深度优先和广度优先两种算法对图进行遍历,输出顶点序列数据;

2)  以合理的格式,输出各个顶点的邻接点;

四、详细设计(C++)

1.算法设计

1.      对于无向图,顶点i的度等于邻接矩阵的第i行(或第i列)非零元素的个数。

2.      要判断顶点i和j之间是否存在边,只需测试邻接矩阵中相应位置的元素arc[i][j],若其值为1,则有边;否则,顶点i和j之间不存在边。

3.      找顶点i的所有邻接点,依次判别顶点i与其他顶点之间是否有边。

4.      用C++语言中的类实现基于邻接矩阵存储结构下图的抽象数据类型定义。由于图中顶点的数据类型不确定,因此采用C++的模板机制。

构造函数:

构造函数的功能是建立一个含有n个顶点e条边的图,假设建立无向图,算法用伪代码描述如下:

1.      确定图的顶点个数和边的个数;

2.      输入顶点信息存储在一维数组vertex中;

3.      初始化邻接矩阵;

4.      依次输入每条边存储在邻接矩阵arc中:

4.1输入边依附的两个顶点的编号i,j;

4.2将邻接矩阵的第i行第j列的元素值置为1;

4.3将邻接矩阵的第j行第i列的元素值置为1;

2.源程序代码

#include<iostream>
#include<stdlib.h>
using namespace std;

const int MaxSize=10;
int visited[MaxSize]={0};
template<class DataType>
class MGraph
{
public:
	MGraph(DataType a[],int n,int e);
	~MGraph(){};
	void DFSTraverse(int v);
	void BFSTraverse(int v);
	void Printvertex();
private:
	DataType vertex[MaxSize];
	int arc[MaxSize][MaxSize];
	int vertexNum,arcNum;
};

template<class DataType>
MGraph<DataType>::MGraph(DataType a[],int n,int e)
{
	int i,j,k;
	vertexNum=n,arcNum=e;
	for(i=0;i<vertexNum;i++)
		vertex[i]=a[i];
	for(i=0;i<vertexNum;i++)
		for(j=0;j<vertexNum;j++)
			arc[i][j]=0;
	for(int k=0;k<arcNum;k++)
	{
		cout<<"请输入边之间顶点的编号:";
		cin>>i>>j;
		arc[i][j]=1;arc[j][i]=1;
	}
	cout<<endl;
}

template<class DataType>
void MGraph<DataType>::DFSTraverse(int v)
{
	cout<<vertex[v];visited[v]=1;
	for(int j=0;j<vertexNum;j++)
		if(arc[v][j]==1&&visited[j]==0)
			DFSTraverse(j);
	for(int k=0;k<vertexNum;k++)
		if(visited[k]==0)
			DFSTraverse(k);
}

template<class DataType>
void MGraph<DataType>::BFSTraverse(int v)
{
	int Q[MaxSize];
	int front=-1;
	int rear=-1;
	cout<<vertex[v];visited[v]=1;Q[++rear]=v;
	while(front!=rear)
	{
		v=Q[++front];
		for(int j=0;j<vertexNum;j++)
			if(arc[v][j]==1&&visited[j]==0)
			{
				cout<<vertex[j];visited[j]=1;Q[++rear]=j;
			}
	}
}

template<class DataType>
void MGraph<DataType>::Printvertex()
{
	for(int i=0;i<vertexNum;i++)
	{
		cout<<"顶点"<<vertex[i]<<"的邻接点为:";
		for(int j=0;j<vertexNum;j++)
			if(arc[i][j]==1)
				cout<<vertex[j]<<" ";
		cout<<endl;
	}
}

int main()
{
	char T[8]={'A','B','C','D','E','F','G','H'};
	MGraph<char> M(T,8,9);
	for(int i=0;i<MaxSize;i++)
	{visited[i]=0;}
	cout<<"深度优先遍历:";
	M.DFSTraverse(0);
	cout<<endl;
	for(int i=0;i<MaxSize;i++)
	{visited[i]=0;}
	cout<<"广度优先遍历:";
	M.BFSTraverse(0);
	cout<<endl;
	cout<<endl;
	cout<<"各顶点的邻接点如下:"<<endl;
	M.Printvertex();
	cout<<endl;
	return 0;
}

五、运行与测试结果

数据结构实验报告(六)「终于解决」

六、总结与心得

        这次实验主要是参照课本,在理解的基础上完成的。其中在深度遍历的算法中,经过验证,我认为课本的代码是残缺的。其实深度优先遍历有点类似于树中的前序遍历。依据课本的代码,我发现一旦左边的顶点输出完毕后,右边顶点仍没输出就已经退出程序。所以我在输出完左边顶点后又循环判断了右边的顶点是否访问过,若未访问,则将该数值传入进行深度优先遍历。这样一来,所有的顶点都会输出。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24268.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信