数据结构例程——非连通图的遍历
2015-11-03 21:26
507 查看
本文是[数据结构基础系列(7):图]中第7课时[非连通图的遍历]的例程。
(程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…)
1、非连通图的深度优先遍历——DFS
2、非连通图的广度优先遍历——BFS
3、判断连通图
附:测试用的图及存储结构
(程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…)
1、非连通图的深度优先遍历——DFS
#include <stdio.h> #include <malloc.h> #include "graph.h" int visited[MAXV]; //定义存放节点的访问标志的全局数组 void DFS(ALGraph *G, int v) { ArcNode *p; int w; visited[v]=1; printf("%d ", v); p=G->adjlist[v].firstarc; while (p!=NULL) { w=p->adjvex; if (visited[w]==0) DFS(G,w); p=p->nextarc; } } //采用深度优先搜索遍历非连通无向图 void DFS1(ALGraph *G) { int i; for (i=0; i<G->n; i++) if (visited[i]==0) DFS(G,i); } int main() { int i; ALGraph *G; int A[8][8]= { {0,1,0,1,0,0,0,0}, {1,0,1,0,0,0,0,0}, {0,1,0,1,1,0,0,0}, {1,0,1,0,1,0,0,0}, {0,0,1,1,0,0,0,0}, {0,0,0,0,0,0,1,0}, {0,0,0,0,0,1,0,1}, {0,0,0,0,0,0,1,0}, }; ArrayToList(A[0], 8, G); for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化 printf(" 非连通图的广度优先遍历:\n"); DFS1(G); return 0; }
2、非连通图的广度优先遍历——BFS
#include <stdio.h> #include <malloc.h> #include "graph.h" int visited[MAXV]; //定义存放节点的访问标志的全局数组 void BFS(ALGraph *G, int v) { ArcNode *p; int w; int queue[MAXV],front=0,rear=0; //定义循环队列 printf("%2d",v); //输出被访问顶点的编号 visited[v]=1; //置已访问标记 rear=(rear+1)%MAXV; queue[rear]=v; //v进队 while (front!=rear) //若队列不空时循环 { front=(front+1)%MAXV; w=queue[front]; //出队并赋给w p=G->adjlist[w].firstarc; //找w的第一个的邻接点 while (p!=NULL) { if (visited[p->adjvex]==0) { printf("%2d",p->adjvex); //访问之 visited[p->adjvex]=1; rear=(rear+1)%MAXV; //该顶点进队 queue[rear]=p->adjvex; } p=p->nextarc; //找下一个邻接顶点 } } printf("\n"); } //采用广度优先搜索遍历非连通无向图 void BFS1(ALGraph *G) { int i; for (i=0;i<G->n;i++) if (visited[i]==0) BFS(G,i); } int main() { int i; ALGraph *G; int A[8][8]= { {0,1,0,1,0,0,0,0}, {1,0,1,0,0,0,0,0}, {0,1,0,1,1,0,0,0}, {1,0,1,0,1,0,0,0}, {0,0,1,1,0,0,0,0}, {0,0,0,0,0,0,1,0}, {0,0,0,0,0,1,0,1}, {0,0,0,0,0,0,1,0}, }; ArrayToList(A[0], 8, G); for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化 printf(" 非连通图的广度优先遍历:\n"); BFS1(G); return 0; }
3、判断连通图
#include <stdio.h> #include <malloc.h> #include "graph.h" int visited[MAXV]; //定义存放节点的访问标志的全局数组 void DFS(ALGraph *G, int v) { ArcNode *p; int w; visited[v]=1; //此处做了标记即完成了访问,不必下句的输出 //printf("%d ", v); p=G->adjlist[v].firstarc; while (p!=NULL) { w=p->adjvex; if (visited[w]==0) DFS(G,w); p=p->nextarc; } } //是连通图返回true,否则返回false bool Connect(ALGraph *G) { int i; bool flag=true; for (i=0; i<G->n; i++) visited[i]=0; DFS(G,0); for (i=0; i<G->n; i++) if (visited[i]==0) { flag=false; break; } return flag; } int main() { int i; ALGraph *G; int A[8][8]= { {0,1,0,1,0,0,0,0}, {1,0,1,0,0,0,0,0}, {0,1,0,1,1,0,0,0}, {1,0,1,0,1,0,0,0}, {0,0,1,1,0,0,0,0}, {0,0,0,0,0,0,1,0}, {0,0,0,0,0,1,0,1}, {0,0,0,0,0,0,1,0}, }; ArrayToList(A[0], 8, G); for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化 if(Connect(G)) printf(" G是连通图\n"); else printf(" G不是连通图\n"); return 0; }
附:测试用的图及存储结构
相关文章推荐
- 动易2006序列号破解算法公布
- 文件遍历排序函数
- 渗透技术一瞥(图)
- 图片引发的溢出危机(图)
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#数据结构揭秘一
- C#中遍历Hashtable的4种方法
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- Erlang中遍历取出某个位置的最大值代码
- c语言实现的带通配符匹配算法