数据结构【图】—023邻接表深度和广度遍历
1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 #define MAXVEX 9 7 #define INFINITY 65535 8 9 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 10 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */ 11 12 typedef char VertexType; /* 顶点类型应由用户定义 */ 13 typedef int EdgeType; /* 边上的权值类型应由用户定义 */ 14 15 struct MGraph {//临接矩阵参数 16 VertexType vexs[MAXVEX]; 17 EdgeType arc[MAXVEX][MAXVEX]; 18 int numVertexes, numEdges; 19 }; 20 21 struct EdgeNode {//邻接表 22 int adjvex;//节点 23 EdgeType wt;//权重 24 struct EdgeNode *next;//指针 25 }; 26 27 struct VertexNode {//顶点表节点 28 int in;//节点的入度 29 VertexType data; 30 EdgeNode *firstedge; 31 }; 32 33 struct GraphAdjList { 34 VertexNode adjList[MAXVEX]; 35 int numNodes, numEdges; 36 }; 37 38 void CreateMGraph(MGraph **G) { 39 (*G) = new MGraph; 40 (*G)->numEdges = 15; 41 (*G)->numVertexes = 9; 42 /* 读入顶点信息,建立顶点表 */ 43 (*G)->vexs[0] = 'A'; 44 (*G)->vexs[1] = 'B'; 45 (*G)->vexs[2] = 'C'; 46 (*G)->vexs[3] = 'D'; 47 (*G)->vexs[4] = 'E'; 48 (*G)->vexs[5] = 'F'; 49 (*G)->vexs[6] = 'G'; 50 (*G)->vexs[7] = 'H'; 51 (*G)->vexs[8] = 'I'; 52 53 54 for (int i = 0; i < (*G)->numVertexes; ++i)/* 初始化图 */ 55 { 56 for (int j = 0; j < (*G)->numVertexes; ++j) 57 { 58 (*G)->arc[i][j] = 0; 59 } 60 } 61 62 (*G)->arc[0][1] = 1; 63 (*G)->arc[0][5] = 1; 64 65 (*G)->arc[1][2] = 1; 66 (*G)->arc[1][8] = 1; 67 (*G)->arc[1][6] = 1; 68 69 (*G)->arc[2][3] = 1; 70 (*G)->arc[2][8] = 1; 71 72 (*G)->arc[3][4] = 1; 73 (*G)->arc[3][7] = 1; 74 (*G)->arc[3][6] = 1; 75 (*G)->arc[3][8] = 1; 76 77 (*G)->arc[4][5] = 1; 78 (*G)->arc[4][7] = 1; 79 80 (*G)->arc[5][6] = 1; 81 82 (*G)->arc[6][7] = 1; 83 84 85 for (int i = 0; i < (*G)->numVertexes; ++i)/* 初始化图 */ 86 { 87 for (int j = 0; j < (*G)->numVertexes; ++j) 88 { 89 (*G)->arc[j][i] = (*G)->arc[i][j]; 90 } 91 } 92 93 } 94 95 96 //构建临接表 97 void CreateALGraph(MGraph *G, GraphAdjList **GL) { 98 (*GL) = new GraphAdjList; 99 (*GL)->numEdges = G->numEdges; 100 (*GL)->numNodes = G->numVertexes; 101 for (int i = 0; i < G->numVertexes; ++i) { 102 (*GL)->adjList[i].data = G->vexs[i]; 103 (*GL)->adjList[i].firstedge = NULL; 104 (*GL)->adjList[i].in = 0; 105 } 106 for (int i = 0; i < G->numVertexes; ++i) { 107 for (int j = 0; j < G->numVertexes; ++j) { 108 if (G->arc[i][j] != 0) { 109 EdgeNode *p = new EdgeNode; 110 p->adjvex = j; 111 p->wt = 1; 112 p->next = (*GL)->adjList[i].firstedge; 113 (*GL)->adjList[i].firstedge = p; 114 (*GL)->adjList[i].in += 1; 115 } 116 } 117 } 118 119 } 120 //深度遍历 121 vector<char>DFSRes; 122 void DFS(GraphAdjList *GL, vector <bool>&flag, EdgeNode *p) { 123 if (DFSRes.size() == GL->numNodes)return; 124 while (p) { 125 if (flag[p->adjvex]) { 126 DFSRes.push_back(GL->adjList[p->adjvex].data);//第一遍入栈,用来判断的 127 flag[p->adjvex] = false; 128 p = GL->adjList[p->adjvex].firstedge;//下一个点 129 DFS(GL, flag, p); 130 DFSRes.pop_back();//弹出栈,让后面回溯回来的元素入栈! 131 } 132 else 133 p = p->next; 134 } 135 } 136 137 void DFSTraverse(GraphAdjList *GL) { 138 vector<bool>flag(GL->numNodes, true);//标志 139 for (int i = 0; i < GL->numNodes; ++i) { 140 DFSRes.push_back(GL->adjList[i].data); 141 flag[i] = false; 142 EdgeNode *p = GL->adjList[i].firstedge; 143 DFS(GL, flag, p); 144 } 145 cout << "/*****DFS*****/" << endl; 146 for (auto a : DFSRes) 147 cout << a << "->"; 148 cout << endl; 149 } 150 151 152 //广度遍历 153 vector<char>BFSRes; 154 deque<int>dq;//压入节符号 155 156 void BFS(GraphAdjList *GL, EdgeNode *p, vector<bool>&flag) { 157 BFSRes.push_back(GL->adjList[dq.front()].data); 158 dq.pop_front(); 159 while (p) { 160 if (flag[p->adjvex]) {//未遍历过 161 flag[p->adjvex] = false; 162 dq.push_back(p->adjvex); 163 } 164 p = p->next; 165 } 166 if (dq.empty())return ; 167 BFS(GL, GL->adjList[dq.front()].firstedge, flag);//下一个表 168 } 169 170 171 void BFSTraverse(GraphAdjList *GL) { 172 vector<bool>flag(GL->numNodes, true);//访问标志 173 dq.push_back(0); 174 flag[0] = false; 175 BFS(GL, GL->adjList[dq.front()].firstedge, flag); 176 cout << "/*****BFS*****/" << endl; 177 for (auto b : BFSRes) 178 cout << b << "->"; 179 cout << endl; 180 } 181 182 183 184 int T023(void) 185 { 186 MGraph *G; 187 GraphAdjList *GL; 188 CreateMGraph(&G); 189 CreateALGraph(G, &GL); 190 191 //printf("\n深度遍历:"); 192 //DFSTraverse(GL); 193 printf("\n广度遍历:"); 194 BFSTraverse(GL); 195 return 0; 196 }
转载于:https://www.cnblogs.com/zzw1024/p/10567806.html
数据结构【图】—023邻接表深度和广度遍历相关推荐
- 数据结构——图的邻接表存储
数据结构--图的邻接表存储 功能实现: (1)图的邻接矩阵的储存 (2)深度优先遍历 (3).广度优先遍历 (4)求结点的度 (5)判断图是否连通 (6)求最小生成树 参考代码 #include &l ...
- 数据结构 图的邻接表和邻接矩阵实现———c语言
图的邻接矩阵实现 逻辑结构分为两部分:V和E集合.因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵.邻接矩阵又分为有向图邻接矩阵和无向图 ...
- java邻接图_Java数据结构 - 图(邻接表存储)
邻接表 相比邻接矩阵,邻接表要更加节省空间. 邻接表存储 本文将介绍邻接表存储有向带权图.图的例子如下. 图 介绍一下邻接表 上面的图对应的邻接表如下图所示: 邻接表 前面的数组存储的是所有的顶点,每 ...
- 数据结构——图的邻接表实现
邻接矩阵需要提前预先分配空间,容易造成空间上的浪费 而且在遇到两个顶点之间没有边时,邻接矩阵是不能解决的. 邻接表的出现 是结合了数组和链表的存储方式(当然 也可以是链表+链表) 数组+链表形式的邻接 ...
- 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现
邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...
- 图的邻接表存储与深度优先遍历代码实现
Graph.h Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化) #include <std ...
- 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)
摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索
线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...
- 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...
最新文章
- dbus-launch(转)
- NETCONF 环境搭建
- java的默认_java默认包的使用
- python归一化 增大差异_Python逻辑回归模型原理及实际案例应用
- mysql ndb还原数据库_ndb_restore恢复出错
- msp430入门编程46
- php7扩展安装奇葩事
- 从“如何设计用户超过1亿的应用”说起----数据库调优实战
- 第六步_安装SSH服务
- 安装sphinx的心得和错误处理
- 基础篇:6.4)形位公差-符号 Symbol
- blos硬盘启动台式计算机,bios设置硬盘启动,最全的bios设置硬盘启动详细方法(两种模式)...
- openssl 1.0.2k-fips 升级到 openssl-3.0.5
- PDF是什么格式?如何在电脑上编辑PDF文件
- 腾讯云IM回调接口-单聊发言后回调
- java下载pdf_java实现文件下载..pdf
- 应用在触摸电视机中的触摸芯片
- Composer 的简介、安装及使用
- IP网络设备的测试方法
- 用Taylor公式估计函数值