博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构【图】—023邻接表深度和广度遍历
阅读量:6765 次
发布时间:2019-06-26

本文共 5039 字,大约阅读时间需要 16 分钟。

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
DFSRes;122 void DFS(GraphAdjList *GL, vector
&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 else133 p = p->next;134 }135 }136 137 void DFSTraverse(GraphAdjList *GL) {138 vector
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
BFSRes;154 deque
dq;//压入节符号155 156 void BFS(GraphAdjList *GL, EdgeNode *p, vector
&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
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

你可能感兴趣的文章
【std::regex】C++文件路径正则表达式
查看>>
java实践经验几种常见数据库连接池的使用比较
查看>>
java 获取某个URL的文件扩展名的方法(非精确,精确的扩展名应该使用服务器返回的MIME-TYPE)...
查看>>
BZOJ 4590 [Shoi2015]自动刷题机 ——二分答案
查看>>
吴恩达机器学习笔记16-决策边界(decision boundary)
查看>>
分水岭算法(理论+opencv实现)
查看>>
暑假集训第六周contest1
查看>>
libnl3.2.25安装编译
查看>>
第一天
查看>>
go语言字符串处理
查看>>
hihocoder 1014----Trie树
查看>>
【2016.5.27】再见,软件工程,你好,软件工程。
查看>>
POJ 3237 Tree
查看>>
hdu 2586 How far away ? ( 离线 LCA , tarjan )
查看>>
ISTQB测试人员认证 初级(基础级)大纲
查看>>
核反应堆
查看>>
sencha touch 2 nestlist中获得绑定store中值的办法
查看>>
比较几个统计函数
查看>>
Sass基础用法
查看>>
iOS开发-UIImageView高效设置Radius
查看>>