图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍。
废话不多说,直接上代码:
#include<iostream> using namespace std; //构造一个循环队列来存放广度优先算法的下标 #define ADD 5; using namespace std; class CirQueue
{
private:
int * base;
int front,rear,size,length;
public:
bool InitCirQueue(int size)
{
this->size=size;
base=new int[size];
if(!base)
{
return false;
}
front=rear=length=;
return true;
}
bool insertQueue(int num)
{
if(length==size)
{
int newsize=size+ADD;
int * newbase=new int[newsize];
if(!newbase)
{
return false;
}
int i=;
for(i=;i<length;i++)
{
newbase[(front+i)%newsize]=base[(front+i)%size];
}
rear=(front+i)%newsize;
base=newbase;
size=newsize;
}
base[rear]=num;
rear=(rear+)%size;
++length;
return true;
}
int outQueue()
{
int temp=base[front];
front=(front+)%size;
--length;
return temp;
}
void traverseQueue()
{
for(int i=;i<length;i++)
{
cout<<base[(front+i)%size]<<endl;
}
}
int getLength()
{
return length;
}
bool isEmpty()
{
if(==length)
{
return true;
}
else
{
return false;
}
}
bool isFull()
{
if(length==size)
{
return true;
}
else
{
return false;
}
}
}; // void main()
// {
// CirQueue cq;
// cq.InitCirQueue(5);
// for(int i=1;i<=100;i++)
// {
// cq.insertQueue(i);
// }
// cq.traverseQueue();
// } //构造循环队列结束 struct Arc
{
int adjvex;
Arc * next;
}; struct Vertex
{
char data;
Arc * firstarc;
}; class Map
{
private:
Vertex * vexList;
int vexNum;
int arcNum;
bool * visted;
public:
Map(int vexNum,int arcNum)
{
this->vexNum=vexNum;
this->arcNum=arcNum;
visted=new bool[vexNum];
for(int i=;i<vexNum;i++)
{
visted[i]=false;
}
vexList=new Vertex[vexNum];
for(int i=;i<vexNum;i++)
{
cout<<"请输入第"<<i<<"个顶点的数据:";
cin>>vexList[i].data;
vexList[i].firstarc=NULL;
}
for(int i=;i<arcNum;i++)
{
int a,b;
cout<<"请输入第"<<i+<<"条边的两顶点";
cin>>a>>b; Arc * tempArc=new Arc;
tempArc->adjvex=b;
tempArc->next=vexList[a].firstarc;
vexList[a].firstarc=tempArc; //因为是无向图所以是双向的
tempArc=new Arc;
tempArc->adjvex=a;
tempArc->next=vexList[b].firstarc;
vexList[b].firstarc=tempArc;
}
}
void DFS(int v)
{
cout<<vexList[v].data<<endl;
visted[v]=true;
Arc * p=vexList[v].firstarc;
while(p)
{
int u=p->adjvex;
if(!visted[u])
{
DFS(u);
}
p=p->next;
}
}
void BFS(int v)
{
CirQueue cq;
cq.InitCirQueue();
cout<<vexList[v].data<<endl;
visted[v]=true;
cq.insertQueue(v);
while(!cq.isEmpty())
{
v=cq.outQueue();
Arc * p=vexList[v].firstarc;
while(p)
{
int j=p->adjvex;
if(!visted[j])
{
cout<<vexList[j].data<<endl;
visted[j]=true;
cq.insertQueue(j);
}
p=p->next;
}
}
}
void ClearVisted()
{
for(int i=;i<vexNum;i++)
{
visted[i]=false;
}
}
}; int main()
{
Map map(,);
cout<<"--------------深度优先遍历————————————————"<<endl;
map.DFS();
map.ClearVisted();
cout<<"--------------广度优先遍历————————————————"<<endl;
map.BFS();
return ;
}
运行结果为:

图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)的更多相关文章
- 图的理解:深度优先和广度优先遍历及其 Java 实现
遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...
- python 实现图的深度优先和广度优先搜索
在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...
- 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现
如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...
- 图的dfs遍历模板(邻接表和邻接矩阵存储)
我们做算法题的目的是解决问题,完成任务,而不是创造算法,解题的过程是利用算法的过程而不是创造算法的过程,我们不能不能陷入这样的认识误区.而想要快速高效的利用算法解决算法题,积累算法模板就很重要,利用模 ...
- JavaScript实现树深度优先和广度优先遍历搜索
1.前置条件 我们提前构建一棵树,类型为 Tree ,其节点类型为 Note.这里我们不进行过多的实现,简单描述下 Note 的结构: class Node{ constructor(data){ t ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- Python 非递归遍历图
class Queue: def __init__(self,max_size): self.max_size = int(max_size) self.queue = [] def put(self ...
- c++ 由无向图构造邻接表,实现深度优先遍历、广度优先遍历。
/* 首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点 为起始点,进行深度优先.广度优先搜索遍历,并输出遍历的结果. */ #include <stdlib.h> #i ...
- 图的存储结构(邻接矩阵与邻接表)及其C++实现
一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...
随机推荐
- float属性
float属性介绍 float给人一种捉摸不透的感觉,不过可以依照浏览器的解析机制(根据HTML文档,从上往下解析),对float属性了解一二.float有四种值:none/left/right/in ...
- this的指向
在JS中,有三种需要注意的this:寻常的this/事件的this/ajax请求的this. 寻常的this 这种this的判断很简单,this是指向执行函数的对象.下面是事例说明: var name ...
- 字符流和字节流(FileReader类和FileWriter类)
字符流主要用于支持Unicode的文字内容,绝大多数在字节流中所提供的类,都可在此找到对应的类.其中,输入流Reader抽象类帮助用户在Unicode流内获得字符数据,而Writer类则实现了输出.可 ...
- 数据库的Instance/Crash Recovery
crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...
- Android studio 查看签名
根据密钥查看 根据安装包查看:改apk为zip 解压 打开 META-INF --->cmd: keytool -printcert -file CERT.RSA
- python学习笔记系列----(一)python简介
一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...
- 安卓与PC网络对接实现视频实时播放
研究安卓网络通信一段时间了, 由于最近公司催的比较紧, 硬着头皮弄出来了. 现在手机客户端终于能够连接流媒体服务器实时播放前端的视频流了. 其实通信方面主要还是命令包的解析, 以及分包组包. 比如要 ...
- GridView----CustomRowCellEdit 使用注意事项
当你在Grid和TreeList中,需要对不同的行中的某一个单元格(Cell)提供特定的RepositoryItem时,使用CustomRowCellEdit 绝对能胜任, 但在使用时千万要注意了:“ ...
- 给jar包进行数字签名(2014-06-28记)
整理一下两年前用到的一些资料. 为了使Applet或者Java Web Start程序能够访问客户端本地资源,需要对Applet或者JWS程序jar包进行数据签名,当客户端打开Applet或者JWS程 ...
- 引用参数,值参数,ref,out
1,一个参数只有在引用的时候才能改变其值,这是一种情况 2,一个参数在引用后要永久的改变其值(可以用返回参数的形式) 3,多个参数在引用后要永久的改变其值或者多个参数中的部分(返回参数就适合了,因为只 ...