学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为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++面向对象实现)的更多相关文章

  1. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  2. python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  3. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

  4. 图的dfs遍历模板(邻接表和邻接矩阵存储)

    我们做算法题的目的是解决问题,完成任务,而不是创造算法,解题的过程是利用算法的过程而不是创造算法的过程,我们不能不能陷入这样的认识误区.而想要快速高效的利用算法解决算法题,积累算法模板就很重要,利用模 ...

  5. JavaScript实现树深度优先和广度优先遍历搜索

    1.前置条件 我们提前构建一棵树,类型为 Tree ,其节点类型为 Note.这里我们不进行过多的实现,简单描述下 Note 的结构: class Node{ constructor(data){ t ...

  6. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  7. Python 非递归遍历图

    class Queue: def __init__(self,max_size): self.max_size = int(max_size) self.queue = [] def put(self ...

  8. c++ 由无向图构造邻接表,实现深度优先遍历、广度优先遍历。

    /* 首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点 为起始点,进行深度优先.广度优先搜索遍历,并输出遍历的结果. */ #include <stdlib.h> #i ...

  9. 图的存储结构(邻接矩阵与邻接表)及其C++实现

    一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...

随机推荐

  1. iOS,自动布局autoresizing和auto layout,VFL语言

    1.使用autoresizing 2.使用autolayout 3.VFL语言(Visual Format Language:可视化格式语言) 使用autoresizing 点击xib文件,去掉使用a ...

  2. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.7 版本发布

    历时数月,RDIFramework.NET V2.7 版本发布了,感谢大家的支持. RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开发系 ...

  3. Java中String类的方法及说明

    String : 字符串类型 一.      String sc_sub = new String(c,3,2);    //      String sb_copy = new String(sb) ...

  4. VBA好的插件

    VBE 小插件--- Office 编程助手 :http://club.excelhome.net/thread-1055425-1-1.html VB以及VBA的编程助手MZ-tools7.0破解版 ...

  5. Stylish: http://bbs.csdn.net/topics/

    [id^=google_ads_], [id^=bd_ad_], #cpro_u2392825, [id^=BAIDU_SSP_], .bbs_top_ad, .csdn-toolbar, #topi ...

  6. #if、#ifdef、#if defined之间的区别【转】

    转自:http://quanminchaoren.iteye.com/blog/1870977 #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20) code. ...

  7. linux下rpm包安装、配置和卸载mysql

    WIN10下虚拟机:VMware workstation 12 PRO 安装 # 1.查看系统版本 [root@vm-xiluhua][/home/xiluhua]$ cat /etc/redhat- ...

  8. Linux之保留yum安装软件后的RPM包

    yum安装软件很方便,但是下载下来的rpm包在安装后默认会被删除掉: 如果希望保留yum安装的软件包该如何做呢? 设置方法: 将/etc/yum.conf里对应的keepcache参数改为1即可,然后 ...

  9. mybatis动态SQL标签的用法

    动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...

  10. 将数组里的元素拼接成sql里的in条件

    /** * 将数组里的元素拼接成sql里的in条件,如'a1','a2','a3' * @param array * @returns */function makeSqlInStr(array){ ...