使用邻接矩阵实现的图结构(添加深度优先搜索)
这次我使用了深度优先搜索。以前的文章如下所示。这个算法困难啊,调试了我好一段时间。下面就是我扩充的深度优先搜索的内容。以前发布的程序有诸多不足,还有几个致命的错误,我就不解释了,这个是优化了的,比以前的好了些。我以前写的图结构:http://student.csdn.net/space.php?uid=999749&do=blog&id=51129
下面是我的JGraph.h代码:
-
-
#ifndef_JGRAPH_H_
-
#define_JGRAPH_H_
-
-
-
#include<limits.h>
-
-
#defineINFINITYINT_MAX
-
#defineMAX_VERTEX_NUM20
-
-
-
enumGraphKind{DG,DN,UDG,UDN};
-
typedefunsignedintVRType;
-
typedefcharInfoType;
-
typedefstruct
- {
-
VRTypeadj;
-
InfoType*info;
- }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
-
-
template<typenameCustomType>
-
classJMatrixGraph
- {
-
public:
-
JMatrixGraph():vexnum(0),arcnum(0){}
-
voidCreateGraph(GraphKindinputKind);
-
voidDFSTraverse(bool(*Visit)(intv));
-
private:
-
voidCreateDG(void);
-
voidCreateDN(void);
-
voidCreateUDG(void);
-
voidCreateUDN(void);
-
voidDepthFirstSearch(intv,bool(*Visit)(intv));
-
intFirstAdjVex(intv);
-
intNextAdjVex(intv,intw);
-
CustomTypevexs[MAX_VERTEX_NUM];
-
AdjMatrixarcs;
-
intvexnum,arcnum;
-
GraphKindkind;
-
boolvisited[MAX_VERTEX_NUM];
- };
-
-
-
template<typenameCustomType>
-
voidJMatrixGraph<CustomType>::CreateGraph(GraphKindinputKind)
- {
-
switch(inputKind)
- {
-
caseDG:returnCreateDG();
-
caseDN:returnCreateDN();
-
caseUDG:returnCreateUDG();
-
caseUDN:returnCreateUDN();
- }
- }
-
template<typenameCustomType>
-
voidJMatrixGraph<CustomType>::CreateDG(void)
- {
-
inti,j,k;
-
intv1,v2,incInfo;
-
cout<<"输入顶点个数:/n";
- cin>>vexnum;
-
cout<<"输入弧的个数:/n";
- cin>>arcnum;
-
if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
-
cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
-
return;
- }
-
cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
-
for(i=0;i<vexnum;i++)
- {
-
cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
-
for(i=0;i<vexnum;i++)
- {
-
for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=0;
- arcs[i][j].info=NULL;
- }
- }
-
for(k=0;k<arcnum;k++)
- {
-
cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
- cin>>v1>>v2;
- arcs[v1-1][v2-1].adj=1;
-
if(incInfo!=0)
- {
-
cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
-
}
- }
-
template<typenameCustomType>
-
voidJMatrixGraph<CustomType>::CreateDN(void)
- {
-
inti,j,k;
-
intv1,v2,incInfo;
-
intw;
-
cout<<"输入顶点个数:/n";
- cin>>vexnum;
-
cout<<"输入弧的个数:/n";
- cin>>arcnum;
-
if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
-
cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
-
return;
- }
-
cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
-
for(i=0;i<vexnum;i++)
- {
-
cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
-
for(i=0;i<vexnum;i++)
- {
-
for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=INFINITY;
- arcs[i][j].info=NULL;
- }
- }
-
for(k=0;k<arcnum;k++)
- {
-
cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
- cin>>v1>>v2>>w;
- arcs[v1-1][v2-1].adj=w;
-
if(incInfo!=0)
- {
-
cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
- }
- }
-
template<typenameCustomType>
-
voidJMatrixGraph<CustomType>::CreateUDG(void)
- {
-
inti,j,k;
-
intv1,v2,incInfo;
-
cout<<"输入顶点个数:/n";
- cin>>vexnum;
-
cout<<"输入弧的个数:/n";
- cin>>arcnum;
-
if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
-
cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
-
return;
- }
-
cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
-
for(i=0;i<vexnum;i++)
- {
-
cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
-
for(i=0;i<vexnum;i++)
- {
-
for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=0;
- arcs[i][j].info=NULL;
- }
- }
-
for(k=0;k<arcnum;k++)
- {
-
cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
- cin>>v1>>v2;
- arcs[v1-1][v2-1].adj=1;
-
cout<<"该元素的值是:"<<arcs[v1-1][v2-1].adj;
-
if(incInfo!=0)
- {
-
cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
- arcs[v2-1][v1-1].adj=arcs[v1-1][v2-1].adj;
- }
- }
-
template<typenameCustomType>
-
voidJMatrixGraph<CustomType>::CreateUDN(void)
- {
-
inti,j,k;
-
intv1,v2,incInfo;
-
intw;
-
cout<<"输入顶点个数:/n";
- cin>>vexnum;
-
cout<<"输入弧的个数:/n";
- cin>>arcnum;
-
if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
-
cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
-
return;
- }
-
cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
-
for(i=0;i<vexnum;i++)
- {
-
cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
-
for(i=0;i<vexnum;i++)
- {
-
for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=INFINITY;
- arcs[i][j].info=NULL;
- }
- }
-
for(k=0;k<arcnum;k++)
- {
-
cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
- cin>>v1>>v2>>w;
- arcs[v1-1][v2-1].adj=w;
-
if(incInfo!=0)
- {
-
cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
- arcs[v2-1][v1-1].adj=arcs[v1-1][v2-1].adj;
- }
- }
-
-
-
template<typenameCustomType>
-
voidJMatrixGraph<CustomType>::DFSTraverse(bool(*Visit)(intv))
- {
-
intv;
-
for(v=0;v<vexnum;v++)visited[v]=false;
-
for(v=0;v<vexnum;v++)
-
if(!visited[v])DepthFirstSearch(v,Visit);
- }
-
-
-
template<typenameCustomType>
-
voidJMatrixGraph<CustomType>::DepthFirstSearch(intv,bool(*Visit)(intv))
- {
-
visited[v]=true;Visit(v);
-
intw;
-
for(w=FirstAdjVex(v);w>=0;w=NextAdjVex(v,w))
-
if(!visited[w])DepthFirstSearch(w,Visit);
- }
-
-
-
template<typenameCustomType>
-
intJMatrixGraph<CustomType>::FirstAdjVex(intv)
- {
-
inti;
-
for(i=0;i<vexnum;i++)
-
if(arcs[v][i].adj!=0)returni;
-
return-1;
- }
-
-
-
template<typenameCustomType>
-
intJMatrixGraph<CustomType>::NextAdjVex(intv,intw)
- {
-
inti;
-
for(i=w+1;i<vexnum;i++)
-
if(arcs[v][i].adj!=0)returni;
-
return-1;
- }
-
#endif
下面是我对《数据结构(严蔚敏版)》168页的G4图进行深度优先搜索。MainFrame.h文件如图所示。
-
-
#include<iostream>
-
#include"JGraph.h"
-
usingnamespacestd;
-
boolVisitFunc(intv)
- {
-
cout<<"-----------深度优先搜索------------/n";
-
cout<<"访问第"<<v+1<<"个顶点/n";
-
returntrue;
- }
-
-
intmain(intargc,char**argv)
- {
-
JMatrixGraph<char>jmg;
- jmg.CreateGraph(UDG);
- jmg.DFSTraverse(VisitFunc);
-
return0;
- }
程序的截图如图所示:
以后还会实现广度优先搜索和更多的功能的!
分享到:
相关推荐
程序设计任务: 设计一个程序,实现以邻接表或者邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。基本要求:以邻接表或者邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的...
要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的深度优先搜索遍历路径。
数据结构类模板无向图邻接矩阵和深度及广度优先搜索遍历
c语言表述数据结构 无向图用邻接矩阵的深度优先遍历程序
分别采用邻接矩阵、邻接表存储结构实现图的遍历
|利用邻接矩阵创建图 |显示图的邻接矩阵 |求各顶点的度 |插入顶点 |插入弧 |删除顶点 |删除弧 |用邻接矩阵创建邻接表UDG |显示图的邻接表 |深度优先便利序列 |广度优先便利序列 |图的连通分支...
数据结构图的邻接矩阵,邻接表存储表示,图的深度优先搜索遍历,广度优先搜索遍历 数据结构图的邻接矩阵,邻接表存储表示,图的深度优先搜索遍历,广度优先搜索遍历.rar
以文件操作输入邻接矩阵存储的无向图,广度和深度的递归遍历
C++实现,数据结构,图的邻接矩阵表示,深度优先遍历,广度优先遍历,DFS,BFS,为什么要五十个字才能上传啊
头歌数据结构图的邻接矩阵存储及遍历操作 第1关图的邻接矩阵存储及求邻接点操作 第2关图的深度优先遍历 第3关图的广度优先遍历 稳过
用n阶矩阵实现图,连通图的深度优先遍历递归算法,广度优先遍历算法。
设计一个有向图和一个无向图,使用邻接矩阵和邻接表存储结构,完成在这两种存储结构下有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。 三、实验要求: 1. 根据实验内容编程,画出你所设计的图,...
1.采用邻接矩阵实现无向图的存储,并输入输出邻接矩阵。求每个顶点的度,并实现图的广度优先遍历和深度优先遍历
无向图的邻接矩阵存储及输出无向图的邻接矩阵存储及输出
数据结构课程中的深度优先搜索算法、广度优先搜索算法的C语言程序,在Turbo C 2.0上调试通过。
邻接矩阵存储图的深度优先遍历 邻接矩阵表示的无向图遍历实现。 #include using namespace std; #define MAX_SIZE 100//最大顶点数 。 #define MAX_INT 326564//表示极大值,即 ∞ 。 typedef char Elemtype_A;//...
邻接表表示的图的深度优先搜索和广度优先搜索程序,这是数据结构的实验
分别以邻接矩阵和邻接表的方式实现图的深度优先搜索、广度优先搜索
领会图的两种主要存储结构、图基本运算算法和两种遍历算法设计内容:编写一个程序,设计带权图的邻接矩阵与邻接表的创建和输出运算,并在此基础上设计一个主程序完成如下功能:(1)建立如图所示的有向图G的邻接矩阵...
这是用邻接矩阵作存储结构的图类源代码,有完整的注释(每个变量的作用、函数执行的过程的文字描述等)。下面是图类的声明部分: //用邻接矩阵表示的图的类的定义 template class Graph { private: static ...