无向图的 DFS 和 BFS实现 (以邻接表存储的图)



#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实现 (以邻接表存储的图)的更多相关文章
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- PTA 邻接表存储图的广度优先遍历(20 分)
6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...
- PTA 邻接表存储图的广度优先遍历
试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...
- 邻接表存储图,DFS遍历图的java代码实现
import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...
- 数据结构之---C语言实现图的邻接表存储表示
// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...
- 图的邻接表存储 c实现
图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...
- 图的邻接表存储表示(C)
//---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...
随机推荐
- 腾讯云CVM之间配置免密钥登录
背景: 1客户A和B俩台主机之间需要实现免密钥登录,已绑定腾讯云申请的密钥对 系统:centos7.3 A:192.168.0.100 B:192.168.0.84 A主机的私钥文件:aaa B主机的 ...
- 45)django-分页实现
Django提供了一个新的类来帮助你管理分页数据,.它可以接收列表.元组或其它可迭代的对象. 一:常用方法 >>> from django.core.paginator import ...
- wx :swipertab切换
<view> <view class="navbar"> <block wx:for="{{body}}" wx:key=&quo ...
- Servet
一.Servlet 是单例吗 不是. 1.你可以用多个 URL 映射同一个 Servlet.这样就会出现多个实例. 2.看看 Servlet 定义: 引用 For a servlet not host ...
- Socket通讯成功案例
Socket通讯案例 #region 服务端 //int port = 1234; //string host = "127.0.0.1"; //IPAddress ip = IP ...
- Confluence 6 XML 备份恢复失败的问题解决
XML 站点备份仅仅针对新数据库恢复的时候是必要的. Upgrading Confluence,Setting up a test server 或者 Production Backup Strate ...
- android组件之TabHost
一 介绍 1.1 TAB的容器.这个对象包含两个子元素: TabWidget:管理标签(tabs),用户点击来选择一个特定的标签,是它告诉TabHost去切换界面的 FrameLayout:对象显示该 ...
- ajax补充--------FormData等...
一.回顾上节知识点 1.什么是json字符串? 轻量级的数据交换格式 2.定时器:关于setTimeout setTimeout(foo,3000) # 3000表示3秒,foo表示一个函数,3秒后 ...
- django rest framework(3)
目录 一.版本 二.解析器 三.序列化 四.请求数据验证 一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class ...
- Java接口自动化测试之TestNG测试报告ExtentReports的应用(三)
pom.xml导入包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...