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. 数据结构——图的邻接表存储

    数据结构--图的邻接表存储 功能实现: (1)图的邻接矩阵的储存 (2)深度优先遍历 (3).广度优先遍历 (4)求结点的度 (5)判断图是否连通 (6)求最小生成树 参考代码 #include &l ...

  2. 数据结构 图的邻接表和邻接矩阵实现———c语言

    图的邻接矩阵实现 逻辑结构分为两部分:V和E集合.因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵.邻接矩阵又分为有向图邻接矩阵和无向图 ...

  3. java邻接图_Java数据结构 - 图(邻接表存储)

    邻接表 相比邻接矩阵,邻接表要更加节省空间. 邻接表存储 本文将介绍邻接表存储有向带权图.图的例子如下. 图 介绍一下邻接表 上面的图对应的邻接表如下图所示: 邻接表 前面的数组存储的是所有的顶点,每 ...

  4. 数据结构——图的邻接表实现

    邻接矩阵需要提前预先分配空间,容易造成空间上的浪费 而且在遇到两个顶点之间没有边时,邻接矩阵是不能解决的. 邻接表的出现 是结合了数组和链表的存储方式(当然 也可以是链表+链表) 数组+链表形式的邻接 ...

  5. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  6. 图的邻接表存储与深度优先遍历代码实现

    Graph.h Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化) #include <std ...

  7. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

  8. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索

    线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...

  9. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

最新文章

  1. dbus-launch(转)
  2. NETCONF 环境搭建
  3. java的默认_java默认包的使用
  4. python归一化 增大差异_Python逻辑回归模型原理及实际案例应用
  5. mysql ndb还原数据库_ndb_restore恢复出错
  6. msp430入门编程46
  7. php7扩展安装奇葩事
  8. 从“如何设计用户超过1亿的应用”说起----数据库调优实战
  9. 第六步_安装SSH服务
  10. 安装sphinx的心得和错误处理
  11. 基础篇:6.4)形位公差-符号 Symbol
  12. blos硬盘启动台式计算机,bios设置硬盘启动,最全的bios设置硬盘启动详细方法(两种模式)...
  13. openssl 1.0.2k-fips 升级到 openssl-3.0.5
  14. PDF是什么格式?如何在电脑上编辑PDF文件
  15. 腾讯云IM回调接口-单聊发言后回调
  16. java下载pdf_java实现文件下载..pdf
  17. 应用在触摸电视机中的触摸芯片
  18. Composer 的简介、安装及使用
  19. IP网络设备的测试方法
  20. 用Taylor公式估计函数值

热门文章

  1. gitlab git 安装
  2. CentOS 7 配置网络连接
  3. 【C/C++】概念: VC虚函数布局引发的问题
  4. XAMPP中启动tomcat报错的解决方法
  5. Debian/Ubuntu Apache Mod_Rewrite 安装
  6. 数据结构上机实践第四周项目3 - 单链表应用
  7. Linux搭建NFS文件服务器
  8. C++ Primer Plus学习(十)——类和对象
  9. 数据结构笔记(二十四)-- 哈夫曼编译码
  10. android settheme不起作用,android-主题,样式和别名嵌套不起作用