#include <iostream>
#include <queue> using namespace std; #define MaxVertexNum 10
typedef int Vertex;
typedef int WeightType;
typedef char DataType; bool Visited[MaxVertexNum] = { false }; //边的定义
typedef struct ENode
{
Vertex V1, V2; //有向边<V1,V2>
WeightType Weight; //权重
}*Edge; //邻接点的定义
typedef struct AdjVNode
{
Vertex AdjV; //邻接点下标
WeightType Weight; //边权重
struct AdjVNode *Next; //指向下一个邻接点的指针
}*PtrToAdjVNode; //顶点表头结点的定义
typedef struct VNode
{
/* DataType Data; //存顶点的数据,很多情况下,顶点无数据,此时Data可以不用出现 */
struct AdjVNode *FirstEdge; //边表头指针
}AdjList[MaxVertexNum]; //图结点的定义
typedef struct GNode
{
int Nv; //顶点数
int Ne; //边数
AdjList G; //邻接表表示的图
}*LGraph; LGraph BuildGraph(int vertex_num, int edge_num)
{
LGraph Graph = (LGraph)malloc(sizeof(struct GNode));
Graph->Nv = vertex_num;
Graph->Ne = edge_num;
for (int i = ; i < Graph->Nv; ++i)
Graph->G[i].FirstEdge = NULL; //初始化所有表头指针为NULL Edge E = (Edge)malloc(sizeof(struct ENode));
for (int i = ; i < Graph->Ne; ++i)
{
printf("请输入第%d条边的起点和终点:", i+);
cin >> E->V1 >> E->V2;
E->Weight = ; //这种插入方法将会使下标大的在前,小的在后,所以遍历的时候下标大的会先遍历
//插入边<V1,V2>
PtrToAdjVNode NewNode1 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode1->AdjV = E->V2;
NewNode1->Weight = E->Weight;
NewNode1->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode1; //无向图,还要插入边<V2,V1>
PtrToAdjVNode NewNode2 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode2->AdjV = E->V1;
NewNode2->Weight = E->Weight;
NewNode2->Next = Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge = NewNode2;
} return Graph;
} void Visit(LGraph Graph, Vertex V)
{
cout << V << ' ';
} void ClearVisited()
{
for (int i = ; i < MaxVertexNum; ++i)
Visited[i] = false;
} void DFS(LGraph Graph, Vertex V)
{
Visit(Graph, V);
Visited[V] = true; for (PtrToAdjVNode p = Graph->G[V].FirstEdge; p != NULL; p = p->Next)
{
if (!Visited[p->AdjV])
DFS(Graph, p->AdjV);
}
} void BFS(LGraph Graph, Vertex V)
{
Visit(Graph, V);
Visited[V] = true;
queue<Vertex> Q;
Q.push(V); while(!Q.empty())
{
Vertex W = Q.front();
Q.pop();
for (PtrToAdjVNode p = Graph->G[W].FirstEdge; p != NULL; p = p->Next)
{
if (!Visited[p->AdjV])
{
Visit(Graph, p->AdjV);
Visited[p->AdjV] = true;
Q.push(p->AdjV);
}
}
}
} int main()
{
int nv, ne;
cout << "请输入图的顶点数与边数:";
cin >> nv >> ne;
LGraph Graph = BuildGraph(nv, ne);
cout << endl;
cout << "请输入遍历起点:";
Vertex V;
cin >> V;
cout << "DFS: ";
DFS(Graph, V);
ClearVisited();
cout <<endl;
cout << "BFS: ";
BFS(Graph, V); return ;
}

输出:

无向图的 DFS 和 BFS实现 (以邻接表存储的图)的更多相关文章

  1. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  2. PTA 邻接表存储图的广度优先遍历(20 分)

    6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...

  3. PTA 邻接表存储图的广度优先遍历

    试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...

  4. 邻接表存储图,DFS遍历图的java代码实现

    import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...

  5. 数据结构之---C语言实现图的邻接表存储表示

    // 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...

  6. 图的邻接表存储 c实现

    图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...

  7. DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储

    题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...

  8. 图的邻接表存储表示(C)

    //---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...

  9. 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS

    图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...

随机推荐

  1. Android跳转WIFI界面的四种方式

    第一种 Intent intent = new Intent(); intent.setAction("android.net.wifi.PICK_WIFI_NETWORK"); ...

  2. spring、springMVC、mybatis配置文件

    一.jdbc.properties 文件: driver=com.mysql.jdbc.Driverurl=jdbc:mysql://192.168.31.xxx:3306/abc?useUnicod ...

  3. Synchronizing timer

    http://blog.csdn.net/zjq001x/article/details/53107159 集合点: 简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存 ...

  4. Confluence 6 其他 MBeans 和高 CPU 消耗线程

    其他 MBeans 希望监控 Hibernate 和 Hazelcast(仅针对 Confluence 数据中心)你需要在你的 setenv.sh / setenv.bat 文件中添加下面的内容. s ...

  5. Confluence 6 自定义配色方案

    Confluence 的管理员可以修改 Confluence 的色彩配色方案.站点的默认配色方案将会在站点的默认空间上同时生效. 希望修改站点的配色方案: 在屏幕的右上角单击 控制台按钮 ,然后选择  ...

  6. caffe2安装

    参考http://blog.csdn.net/Andy965/article/details/70808909?locationNum=5&fps=1 建议将make 和make instal ...

  7. 《剑指offer》 数值的整数次方

    本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...

  8. ajax对象方法的使用

    change.js文件的内容对象函数关键字:fnjQuery.fn.change = function () { this.css({"background": "red ...

  9. AI学习吧-支付宝支付

    支付宝支付流程 1.接收前端发过来的贝里数和结算金额 2.检查贝里数是否够用 3.获取结算中心的课程并应用优惠券 4.应用未绑定课程的优惠券 5.判断总价格减去优惠券价格是否等于实际支付金额 6.生成 ...

  10. python 把类当作 装饰器

    # class Test(object): # def __call__(self): # print('-----test----') # t= Test()# t() 调用主要有个__call__ ...