图的遍历(数据结构)
Posted aiqinger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的遍历(数据结构)相关的知识,希望对你有一定的参考价值。
图的遍历(数据结构)
1 #include <iostream> 2 using namespace std; 3 4 //图的顺序存储的数据定义(邻接矩阵) 5 typedef struct VertexType { 6 char info; 7 int no; 8 }; 9 typedef struct MGraph { 10 int edges[maxsize][maxsize];//邻接矩阵定义,如果是有权图,则可以把int改为float; 11 int e,n;//边数、顶点数 12 VertexType vex[maxsize]; 13 }; 14 15 //图的链式存储的数据定义(邻接表) 16 typedef struct ArcNode { //定义边 17 int adjvex;//定义当前边连接的顶点 18 struct ArcNode *nextarc;//定义与当前边同属一个顶点的下一条边 19 int info;//定义当前边的权值 20 }; 21 typedef struct VNode { //定义顶点 22 char data; 23 ArcNode *firstarc; 24 }; 25 typedef struct AGraph { //定义链式存储结构 26 int e,n; 27 VNode adjlist[maxsize]; 28 } 29 30 //深度优先遍历搜索 31 int visit[maxsize]; 32 void dfs(AGraph *G,int v) { 33 ArcNode *p; 34 visit[v]=1; 35 Visit(v); 36 p=G->adjlist[v].firstarc; 37 while(p!=NULL) { 38 if(visit[p->adjvex]==0) { 39 dfs(G,p->adjvex); 40 } 41 p=p->nextarc; 42 } 43 } 44 45 //广度优先遍历搜索 46 void bfs(AGraph *G,int v,int visit[maxsize]) { 47 ArcNode *p; 48 int que[maxsize]; 49 int rear=0,front=0; 50 Visit(v); 51 visit[v]=1; 52 rear=(rear+1)%maxsize; 53 que[rear]=v; 54 while(rear!=front) { 55 front=(front+1)%maxsize; 56 int i=que[front]; 57 p=G->adjlist[i].firstarc; 58 while(p!=NULL) { 59 if(visit[p->adjvex]==0) { 60 Visit(p->adjvex); 61 visit[p->adjvex]=1; 62 rear=(rear+1)%maxsize; 63 que[rear]=p->adjvex; 64 } 65 p=p->nextarc; 66 } 67 } 68 } 69 70 void DFS(AGraph *g) { //深度遍历 71 for(int i=0; i<g->n; i++) { 72 if(!visit[i]) { 73 dfs(g,i); 74 } 75 } 76 } 77 78 void BFS(AGraph *g) { //广度遍历 79 for(int i=0; i<g->n; i++) { 80 if(!visit[i]) { 81 bfs(g,i,visit); 82 } 83 } 84 } 85 86 int main() { 87 88 89 return 0; 90 }
以上是关于图的遍历(数据结构)的主要内容,如果未能解决你的问题,请参考以下文章
(王道408考研数据结构)第六章图-第三节:图的遍历(DFS和BFS)
图的深度优先遍历DFS和广度优先遍历BFS(邻接矩阵存储)超详细完整代码进阶版