/*图的存储及遍历*/
#include<iostream>
using namespace std;
//-----------------------------------
//邻接矩阵的存储及深度和广度遍历
//----------------------------------- /*邻接矩阵的类型定义*/
#define MAX 10000000
#define MAX_VERTEX_NUM 20
typedef enum{ DG,DN,UDG,UDN }GraphKind;//有向图,有向网,无向图,无向网
typedef struct
{
char vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息
int vexnum,edgenum;//顶点树和边数
GraphKind kind;//图的种类
}MGraph; /*构造无向图的邻接矩阵*/
void CreateUDG_AM(MGraph &G,int n,int e)
{
G.vexnum=n;
G.edgenum=e; int i,j,k;
for(i=;i<n;i++)
cin>>G.vexs[i];//输入顶点信息 for(i=;i<n;i++)
for(j=;j<n;j++)
G.edges[i][j]=;//将矩阵初始化为0 for(k=;k<e;k++)
{
cin>>i>>j;//这里只用输入对称的边就行,也就是输入下矩阵或是上矩阵
G.edges[i][j]=G.edges[j][i]=;//输入边的信息
}
} /****************************无向图的深度优先遍历************************/
int visited[MAX_VERTEX_NUM]; void DF_AM(MGraph &G,int i)
{
int j;
cout<<G.vexs[i]<<" ";
visited[i]=;
for(j=;j<G.vexnum;j++)
{
if((G.edges[i][j])==&&(visited[j])==)
DF_AM(G,j);
}
} void DF_Traverse_AM(MGraph &G)
{
int i;
for(i=;i<G.vexnum;i++)
{
visited[i]=;
}
for(i=;i<G.vexnum;i++)
{
if(!visited[i])
DF_AM(G,i);
}
} /*********************无向图的广度优先遍历*****************************/ //循环队列的类型定义
const int Queue_Size=; typedef struct circlQueue
{
int *elem;
int rear;
int front;
int queueSize;
}circlQueue; //初始化
void initQueue_C(circlQueue &Q)
{
Q.elem=new int[Queue_Size];
Q.front=Q.rear=;//首尾指针相等说明队列为空。
Q.queueSize=Queue_Size;
} //入队列
void enterQueue_C(circlQueue &Q,int x)
{
if(((Q.rear+)%Q.queueSize)==Q.front)//判断栈满的情况
cout<<"Queue OverFlow!";
Q.elem[Q.rear]=x;
Q.rear=(Q.rear+)%Queue_Size;//尾指针应以此种方式加1,才会实现循环队列。
} //出队列
char outputQueue_C(circlQueue &Q)
{
int e;
if(Q.rear==Q.front)
cout<<"Queue Empty";
e=Q.elem[Q.front];
Q.front=(Q.front+)%Q.queueSize;;//头指针应以此种方式加1,才会实现循环队列。
return e;
}
//广度遍历
void BF_Traverse_AM(MGraph &G)
{
int i,j,v;
for(i=;i<G.vexnum;i++)
visited[i]=;
circlQueue Q;
initQueue_C(Q);//队列实现了“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问
for(i=;i<G.vexnum;i++)
{
if(!visited[i])
{
cout<<G.vexs[i]<<" ";
visited[i]=;
enterQueue_C(Q,i);
while(Q.front!=Q.rear)
{//这个循环是将队列里面的顶点取出来,然后进行下面的for循环
v=outputQueue_C(Q);
for(j=;j<G.vexnum;j++)
{//这个循环是将顶点的全部邻接点依次访问并且入队列
if(G.edges[v][j]&&(!visited[j]))
{
cout<<G.vexs[j]<<" ";
visited[j]=;
enterQueue_C(Q,j);
}
}
}
}
}
} //-----------------------------------------------
//邻接表的存储及深度和广度遍历
//-----------------------------------------------
typedef struct EdgeNode
{//边表结点的定义
int adjvex;//存放邻接点在顶点表中的位置
struct EdgeNode * nextedge;//指向下一个边表结点
int weight;
}EdgeNode; typedef struct VexNode
{//顶点表结点的定义
char vex;//存放顶点信息
EdgeNode * firstedge;//指向第一个边表结点
}VexNode; typedef struct
{//顶点表的定义
VexNode vexs[MAX_VERTEX_NUM];
int vexnum,edgenum;
GraphKind kind;
}LGraph; /*构造有向图的邻接表*/
void CreateDG_AL(LGraph &G,int n,int e)
{
int i,j,k;
G.vexnum=n;
G.edgenum=e;
G.kind=DG;
for(i=;i<n;i++)
{
cin>>G.vexs[i].vex;
G.vexs[i].firstedge=NULL;//初始化为空
}
for(k=;k<e;k++)
{
EdgeNode *p;
cin>>i>>j;
p=new EdgeNode;
p->adjvex=j;
p->nextedge=G.vexs[i].firstedge;
G.vexs[i].firstedge=p;//采用头插法
}
} /*********************有向图的深度优先遍历**************************/
void DF_AL(LGraph &G,int v)
{
int j;
EdgeNode *p;
cout<<G.vexs[v].vex<<" ";
visited[v]=;
for(p=G.vexs[v].firstedge;p;p=p->nextedge)
{
j=p->adjvex;
if(!visited[j])
DF_AL(G,j);
}
} void DF_Traverse_AL(LGraph &G)
{
int i;
for(i=;i<G.vexnum;i++)
{
visited[i]=;
}
for(i=;i<G.vexnum;i++)
{
if(!visited[i])
DF_AL(G,i);
}
} /* 何问起 hovertree.com */
/*********************有向图的广度优先遍历**************************/
void BF_Traverse_AL(LGraph &G)
{
int i,j,v;
EdgeNode *p;
for(i=;i<G.vexnum;i++)
visited[i]=;
circlQueue Q;
initQueue_C(Q);//队列实现了“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问
for(i=;i<G.vexnum;i++)
{
if(!visited[i])
{
cout<<G.vexs[i].vex<<" ";
visited[i]=;
enterQueue_C(Q,i);
while(Q.front!=Q.rear)
{//这个循环是将队列里面的顶点取出来,然后进行下面的for循环
v=outputQueue_C(Q);
for(p=G.vexs[v].firstedge;p;p=p->nextedge)
{//这个循环是将顶点的全部邻接点依次访问并且入队列
j=p->adjvex;
if(!visited[j])
{
cout<<G.vexs[j].vex<<" ";
visited[j]=;
enterQueue_C(Q,j);
}
}
}
}
}
}
void main()
{
/*MGraph G;
CreateUDG_AM(G,6,6);
DF_Traverse_AM(G);
cout<<endl;
BF_Traverse_AM(G);*/ LGraph G;
CreateDG_AL(G,,);
DF_Traverse_AL(G);
cout<<endl;
BF_Traverse_AL(G);
}

写这个程序给我的感觉就是乱,思路不是很清晰,遍历的逻辑关系还掌握的不是很熟,只是大概知道是这么回事,但是让自己去写的话,可能就写不出来了!还是要加大对遍历的熟悉程度才行啊!

PS:另外推荐一个让大家真正练手的网站:猪八戒威客网,在这里可以按自己的能力去接一些程序设计的任务。我觉得这是一种很不错的学习方法,当你接了别人的任务,无形中就给了自己压力和动力,然后就会主动的去查询资料,分析问题,可能会历经艰辛才能解决问题,但这中间的过程是很珍贵的,你会通过自己的努力学到很多课本上没有学到的东西,也能过一回需求分析的瘾,真实的体会到和客户进行交流的诸多“纠结”,最后,如果你的努力得到客户的认可,可以获得一笔小小的佣金,当做对自己的奖励,更重要的是,通过做任务,你能体会到自己存在的价值感和对自己能力的肯定!

推荐:http://www.cnblogs.com/roucheng/p/cpphong.html

图的存储及遍历 深度遍历和广度遍历 C++代码实现的更多相关文章

  1. 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]

    参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...

  2. 图的存储,搜索,遍历,广度优先算法和深度优先算法,最小生成树-Java实现

    1)用邻接矩阵方式进行图的存储.如果一个图有n个节点,则可以用n*n的二维数组来存储图中的各个节点关系. 对上面图中各个节点分别编号,ABCDEF分别设置为012345.那么AB AC AD 关系可以 ...

  3. C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

    图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...

  4. 【数据结构】4.1图的创建及DFS深度遍历(不完善)

    声明:本代码仅供参考,根本就不是正确代码(至少在我看来,有很多BUG和不完美的地方) 图的存储方式选择为邻接表,并且headNode只是来存储一个链表的Node首地址额 总之这个代码写的很垃圾呀很垃圾 ...

  5. 【algo&ds】6.图及其存储结构、遍历

    1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...

  6. 【lhyaaa】图的存储&遍历

    呀,图真是一个令人头疼而又很重要的东西.在现实生活中,我们有很多的问题都不能用树来实现,所以烦人啊不伟大的图就出现了—— 图的存储 没有存储哪来的操作,所以存储是最基础的呢. 邻接矩阵 我们对于图的存 ...

  7. 图的存储与遍历C++实现

    1.图的存储 设点数为n,边数为m 1.1.二维数组 方法:使用一个二维数组 adj 来存边,其中 adj[u][v] 为 1 表示存在 u到 v的边,为 0 表示不存在.如果是带边权的图,可以在 a ...

  8. 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)

    邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...

  9. 多级树的深度遍历与广度遍历(Java实现)

    目录 多级树的深度遍历与广度遍历 节点模型 深度优先遍历 广度优先遍历 多级树的深度遍历与广度遍历 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍 ...

随机推荐

  1. [stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO

    书接上文<1.一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO> 我们发现用16MHz晶振的nRF51822驱动1.77寸的spi速度达不到要求 本节主要采用7 ...

  2. [ACM_几何] The Deadly Olympic Returns!!! (空间相对运动之最短距离)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/B 题目大意: 有两个同时再空间中匀速运动的导弹,告诉一个时间以 ...

  3. ActiveMQ第六弹:设置多个并行的消费者

    消息队列本来就是一种经典的生产者与消费者模式.生产者向消息队列中发送消息,消费者从消息队列中获取消息来消费. 消息的传送一般由一个代理来实现的,那就是Message broker(即消息代理).Mes ...

  4. AutoMapper的简单使用

    接触AutoMapper已经有两年多的时间了,在ORM框架中,它使持久层对象与DTO对象之间的转换变得相当简单. 随着负责的项目的增多,使用的技术框架一多起来,很多具体的技术点难免记不清, 加上同时兼 ...

  5. 如何在 Ubuntu 15.04 上安装带 JSON 支持的 SQLite 3.9

    欢迎阅读我们关于SQLite 的文章,SQLite 是当今世界上使用最广泛的 SQL 数据库引擎,它基本不需要配置,不需要设置或管理就可以运行.SQLite 是一个是公开领域(public-domai ...

  6. Android开发学习之路-GSON使用心得(OCR图片识别)

    在安卓中解析JSON串可以使用的方法有很多,比如说用官方提供的JSONObject或者谷歌提供的开源库GSON,以及一些第三方开源库. 这里用的是GSON,为了测试方便,借助了一个百度的api,一个图 ...

  7. react7 react 三目运算

    <body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...

  8. Linux常用命令03

    上篇我们写到,如何编辑文件,我们有时候,在编辑的时候,有可能会异常的退出,这样的话, linux会针对这个文件生成一个swp文件,当你下次进入vi模式时,就会提示你一个错误 这样,即使你按enter键 ...

  9. poj 2385Apple Catching(简单dp)

    /* 题意: 有两棵苹果树,每一棵苹果树每一秒间隔的掉落下来一个苹果,一个人在树下接住苹果,不让苹果掉落! 人在两棵树之间的移动是很快的!但是这个人移动的次数是有限制的,问最多可以接住多少个苹果! 思 ...

  10. java中线程存活和线程执行的问题!

    /* 下面的程序会出现下面的情况,当Thread-0, Thread-1, Thread-2都被wait的时候,可能会同时苏醒 Thread-0 put Thread-1 put Thread-2 p ...