数据结构_7:图算法 :图的遍历
2016-01-16 15:07
381 查看
DFS-深度优先遍历
类似于先序遍历领接表矩阵方式
typedef int Boolean; Boolean visited[MAX]; // 访问标志数组 //领接矩阵的深度优先递归算法 void DFS(MGraph G,int i) { int j; visited[i]=TRUE; printf("%c",G.vexs[i]); //打印顶点, for(j=0;j<G.numVertextes;j++) if(G.arc[i][j]==1 && !visited[j]) DFS(G,j); //对访问的顶点调用DFS } void DFSTraverse(MGraph G) { int i; for(i=0;i<G.numVertexes;i++) visited[i]=FALSE; //初始所有顶点是未访问状态 for(i=0;i<G.numVertexes;i++) if(!visited[i]) //对未访问过的顶点调用DFS,若图是连通图,则只会执行一次。 DFS (G,i); }
领接表DFS
void DFS(GraphAdjList GL, int i) { EdgeNode *p; visited[i] = TRUE; printf("%c ",GL->adjList[i].data);/* 打印顶点,也可以其它操作 */ p = GL->adjList[i].firstedge; while(p) { if(!visited[p->adjvex]) DFS(GL, p->adjvex);/* 对为访问的邻接顶点递归调用 */ p = p->next; } } /* 邻接表的深度遍历操作 */ void DFSTraverse(GraphAdjList GL) { int i; for(i = 0; i < GL->numVertexes; i++) visited[i] = FALSE; /* 初始所有顶点状态都是未访问过状态 */ for(i = 0; i < GL->numVertexes; i++) if(!visited[i]) /* 对未访问过的顶点调用DFS,若是连通图,只会执行一次 */ DFS(GL, i); }
广度优先遍历
类似于树的层次遍历邻接矩阵的BFS
/* 邻接矩阵的广度遍历算法 */ void BFSTraverse(MGraph G) { int i, j; Queue Q; for(i = 0; i < G.numVertexes; i++) visited[i] = FALSE; InitQueue(&Q); /* 初始化一辅助用的队列 */ for(i = 0; i < G.numVertexes; i++) /* 对每一个顶点做循环 */ { if (!visited[i]) /* 若是未访问过就处理 */ { visited[i]=TRUE; /* 设置当前顶点访问过 */ printf("%c ", G.vexs[i]);/* 打印顶点,也可以其它操作 */ EnQueue(&Q,i); /* 将此顶点入队列 */ while(!QueueEmpty(Q)) /* 若当前队列不为空 */ { DeQueue(&Q,&i); /* 将队对元素出队列,赋值给i */ for(j=0;j<G.numVertexes;j++) { /* 判断其它顶点若与当前顶点存在边且未访问过 */ if(G.arc[i][j] == 1 && !visited[j]) { visited[j]=TRUE; /* 将找到的此顶点标记为已访问 */ printf("%c ", G.vexs[j]); /* 打印顶点 */ EnQueue(&Q,j); /* 将找到的此顶点入队列 */ } } } } } }
领接表BFS
void BFSTraverse(GraphAdjList GL) { int i; EdgeNode *p; Queue Q; for(i = 0; i < GL->numVertexes; i++) visited[i] = FALSE; InitQueue(&Q); for(i = 0; i < GL->numVertexes; i++) { if (!visited[i]) { visited[i]=TRUE; printf("%c ",GL->adjList[i].data);/* 打印顶点,也可以其它操作 */ EnQueue(&Q,i); while(!QueueEmpty(Q)) { DeQueue(&Q,&i); p = GL->adjList[i].firstedge; /* 找到当前顶点的边表链表头指针 */ while(p) { if(!visited[p->adjvex]) /* 若此顶点未被访问 */ { visited[p->adjvex]=TRUE; printf("%c ",GL->adjList[p->adjvex].data); EnQueue(&Q,p->adjvex); /* 将此顶点入队列 */ } p = p->next; /* 指针指向下一个邻接点 */ } } } } }
相关文章推荐
- 数据结构之单链表常见操作 C
- vxworks源码剖析- 数据结构篇一(双向链表)-转
- 数据结构_7:图算法 :图的存储
- 半边数据结构
- 数据结构-------顺序表的实现
- 算法系列(1)-数据结构
- 飞龙的程序员书单 – 数据结构、算法
- Java数据结构之迭代器
- 20 找出第1500个丑数
- LCT(Link Cut Tree)学习小记
- 数据结构之数组和字符串的反转java实现
- Java数据结构之linkedhashset
- 数据结构优化连边
- 学习笔记------数据结构(C语言版)链表应用~一元多项式求和
- 学习数据结构之链表
- 自底向上伸展树(之字形旋转+一字形旋转)
- 动态规划初体验
- 数据结构_6:树:C++
- 数据结构和抽象数据类型
- hrbustoj 1551 C - 基础数据结构——字符串2 病毒II