博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无向图的 DFS 和 BFS实现 (以邻接表存储的图)
阅读量:6073 次
发布时间:2019-06-20

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

                  

 

1 #include 
2 #include
3 4 using namespace std; 5 6 #define MaxVertexNum 10 7 typedef int Vertex; 8 typedef int WeightType; 9 typedef char DataType; 10 11 bool Visited[MaxVertexNum] = { false }; 12 13 //边的定义 14 typedef struct ENode 15 { 16 Vertex V1, V2; //有向边
17 WeightType Weight; //权重 18 }*Edge; 19 20 //邻接点的定义 21 typedef struct AdjVNode 22 { 23 Vertex AdjV; //邻接点下标 24 WeightType Weight; //边权重 25 struct AdjVNode *Next; //指向下一个邻接点的指针 26 }*PtrToAdjVNode; 27 28 //顶点表头结点的定义 29 typedef struct VNode 30 { 31 /* DataType Data; //存顶点的数据,很多情况下,顶点无数据,此时Data可以不用出现 */ 32 struct AdjVNode *FirstEdge; //边表头指针 33 }AdjList[MaxVertexNum]; 34 35 //图结点的定义 36 typedef struct GNode 37 { 38 int Nv; //顶点数 39 int Ne; //边数 40 AdjList G; //邻接表表示的图 41 }*LGraph; 42 43 44 LGraph BuildGraph(int vertex_num, int edge_num) 45 { 46 LGraph Graph = (LGraph)malloc(sizeof(struct GNode)); 47 Graph->Nv = vertex_num; 48 Graph->Ne = edge_num; 49 for (int i = 0; i < Graph->Nv; ++i) 50 Graph->G[i].FirstEdge = NULL; //初始化所有表头指针为NULL 51 52 Edge E = (Edge)malloc(sizeof(struct ENode)); 53 for (int i = 0; i < Graph->Ne; ++i) 54 { 55 printf("请输入第%d条边的起点和终点:", i+1); 56 cin >> E->V1 >> E->V2; 57 E->Weight = 1; 58 59 60 //这种插入方法将会使下标大的在前,小的在后,所以遍历的时候下标大的会先遍历 61 //插入边
62 PtrToAdjVNode NewNode1 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode)); 63 NewNode1->AdjV = E->V2; 64 NewNode1->Weight = E->Weight; 65 NewNode1->Next = Graph->G[E->V1].FirstEdge; 66 Graph->G[E->V1].FirstEdge = NewNode1; 67 68 //无向图,还要插入边
69 PtrToAdjVNode NewNode2 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode)); 70 NewNode2->AdjV = E->V1; 71 NewNode2->Weight = E->Weight; 72 NewNode2->Next = Graph->G[E->V2].FirstEdge; 73 Graph->G[E->V2].FirstEdge = NewNode2; 74 } 75 76 return Graph; 77 } 78 79 void Visit(LGraph Graph, Vertex V) 80 { 81 cout << V << ' '; 82 } 83 84 void ClearVisited() 85 { 86 for (int i = 0; i < MaxVertexNum; ++i) 87 Visited[i] = false; 88 } 89 90 void DFS(LGraph Graph, Vertex V) 91 { 92 Visit(Graph, V); 93 Visited[V] = true; 94 95 for (PtrToAdjVNode p = Graph->G[V].FirstEdge; p != NULL; p = p->Next) 96 { 97 if (!Visited[p->AdjV]) 98 DFS(Graph, p->AdjV); 99 }100 }101 102 void BFS(LGraph Graph, Vertex V)103 {104 Visit(Graph, V);105 Visited[V] = true;106 queue
Q;107 Q.push(V);108 109 while(!Q.empty())110 { 111 Vertex W = Q.front();112 Q.pop();113 for (PtrToAdjVNode p = Graph->G[W].FirstEdge; p != NULL; p = p->Next)114 {115 if (!Visited[p->AdjV])116 {117 Visit(Graph, p->AdjV);118 Visited[p->AdjV] = true;119 Q.push(p->AdjV);120 }121 }122 }123 }124 125 int main()126 {127 int nv, ne;128 cout << "请输入图的顶点数与边数:";129 cin >> nv >> ne;130 LGraph Graph = BuildGraph(nv, ne);131 cout << endl;132 cout << "请输入遍历起点:";133 Vertex V;134 cin >> V;135 cout << "DFS: ";136 DFS(Graph, V);137 ClearVisited();138 cout <

 

 

 

输出:

 

 

 

转载于:https://www.cnblogs.com/FengZeng666/p/10299606.html

你可能感兴趣的文章
vsftpd不支持目录软链接的解决办法
查看>>
Java中byte与16进制字符串的互转
查看>>
解决Windows下修改环境变量后需重启才能生效的问题(转)
查看>>
我的友情链接
查看>>
Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
查看>>
网盘的另类玩法——命令行
查看>>
C++:一段代码,了解拷贝构造函数、move构造函数、拷贝赋值函数、move赋值函数、右值引用...
查看>>
linux下连接github并进行提交
查看>>
IdentityServer4 实现 OpenID Connect 和 OAuth 2.0
查看>>
【Java ThreadLocal的使用】
查看>>
tcp/ip学习笔记
查看>>
Android 浏览器的研究(五)--- 浏览器APK的Eclipse开发环境搭建
查看>>
Rsync企业实战之自动异地备份
查看>>
Spring cloud 学习资料汇总
查看>>
对网卡流量监控的一些想法
查看>>
团队 ≠ 人 + 人
查看>>
我的友情链接
查看>>
C89和C99标准比较
查看>>
PHP5.6和PHP7中函数中的一些新特性
查看>>
oracle linux 5.7 布署ogg v11 oracle to oracle之Configure Change Capture and delivery
查看>>