图的遍历——C语言
来源:互联网 发布:python 全文搜索引擎 编辑:程序博客网 时间:2024/06/08 04:52
利用邻接矩阵存储一张图,分别采用图的深度优先搜索和广度优先搜索遍历该图,并输出遍历结果。
主程序:
#include <stdio.h>#include <stdlib.h>#define MAXVEX 100 //最大顶点数#define INFINITY 65535 //用65535来代表无穷大int visited[MAXVEX]={0};typedef struct{ char vexs[MAXVEX]; //顶点表 int arc[MAXVEX][MAXVEX]; //邻接矩阵,可看作边 int numVertexes, numEdges; //图中当前的顶点数和边数}Graph;void CreateGraph(Graph *g){ int i,j,k,w,t; printf("输入顶点数,边数和t(中间用空格):"); scanf("%d %d %d", &(g->numVertexes), &(g->numEdges),&t); printf("\n"); for(i=1;i<=g->numVertexes;i++) { getchar(); printf("输入第%d顶点信息vexs[%d]=",i,i); scanf("%c",&(g->vexs[i])); } printf("\n"); for(i=1;i<=g->numVertexes;i++) for(j=1;j<=g->numVertexes;j++) if (t>2) g->arc[i][j] = INFINITY; else g->arc[i][j]=0; for(k=1;k<=g->numEdges;k++) { printf("输入i j(中间用空格):"); scanf("%d %d",&i,&j); if(i>g->numVertexes ||j>g->numVertexes) exit(0); if(t>2) { printf("输入w:"); scanf("%d",&w); g->arc[i][j]=w; if(t==3) g->arc[j][i]=w; } else { g->arc[i][j]=1; if (t==1) g->arc[j][i]=1; } } printf("\n"); printf("输出邻接矩阵:\n"); for(i=1;i<=g->numVertexes ;i++) { for(j=1;j<=g->numVertexes ;j++) { printf("%8d",g->arc[i][j]); if(t>2&&g->arc[i][j]==65535) g->arc[i][j]=0; else if(t>2&&g->arc[i][j]!=65535) g->arc[i][j]=1; } printf("\n"); }}void dfs (Graph g,int i) //广度优先搜索,从顶点i开始遍历{ int j; printf("%d->",i); //输出访问顶点 visited[i]=1; //全局数组访问标记置1表示已经访问 for(j=1; j<=g.numVertexes; j++) if ((g.arc[i][j]==1)&&(!visited[j])) dfs (g,j);}void bfs (Graph g,int i){ int visited[MAXVEX]={0}; int q[g.numVertexes+1] ; int f,r,j ; f=r=0 ; printf("%d->",i); visited[i]=1 ; r++; q[r]=i ; while (f<r) { f++; i=q[f] ; for (j=1; j<=g.numVertexes; j++) if ((g.arc[i][j]==1)&&(!visited[j])) { printf("%d->",j); ; visited[j]=1 ; r++; q[r]=j ; } }}int main(){ Graph g; int i; printf("t为1~4,分别表示无向图、有向图、带权无向图、带权有向图\n"); CreateGraph(&g); printf("\n输入i:"); scanf("%d",&i); printf("\n深度优先搜索遍历:"); dfs (g,i); printf("NULL\n"); printf("广度优先搜索遍历:"); bfs (g,i); printf("NULL\n"); return 0;}输入输出示例:
1.无向图
t为1~4,分别表示无向图、有向图、带权无向图、带权有向图输入顶点数,边数和t(中间用空格):8 10 1输入第1顶点信息vexs[1]=1输入第2顶点信息vexs[2]=2输入第3顶点信息vexs[3]=3输入第4顶点信息vexs[4]=4输入第5顶点信息vexs[5]=5输入第6顶点信息vexs[6]=6输入第7顶点信息vexs[7]=7输入第8顶点信息vexs[8]=8输入i j(中间用空格):1 2输入i j(中间用空格):1 3输入i j(中间用空格):2 4输入i j(中间用空格):2 5输入i j(中间用空格):3 6输入i j(中间用空格):3 7输入i j(中间用空格):4 8输入i j(中间用空格):5 8输入i j(中间用空格):6 8输入i j(中间用空格):7 8输出邻接矩阵: 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0输入i:1深度优先搜索遍历:1->2->4->8->5->6->3->7->NULL广度优先搜索遍历:1->2->3->4->5->6->7->8->NULL--------------------------------Process exited after 74.92 seconds with return value 0请按任意键继续. . .
2.带权无向图
t为1~4,分别表示无向图、有向图、带权无向图、带权有向图输入顶点数,边数和t(中间用空格):5 8 3输入第1顶点信息vexs[1]=1输入第2顶点信息vexs[2]=2输入第3顶点信息vexs[3]=3输入第4顶点信息vexs[4]=4输入第5顶点信息vexs[5]=5输入i j(中间用空格):1 2输入w:6输入i j(中间用空格):1 3输入w:1输入i j(中间用空格):1 5输入w:3输入i j(中间用空格):2 5输入w:9输入i j(中间用空格):2 4输入w:8输入i j(中间用空格):4 5输入w:7输入i j(中间用空格):4 3输入w:2输入i j(中间用空格):3 5输入w:4输出邻接矩阵: 65535 6 1 65535 3 6 65535 65535 8 9 1 65535 65535 2 4 65535 8 2 65535 7 3 9 4 7 65535输入i:3深度优先搜索遍历:3->1->2->4->5->NULL广度优先搜索遍历:3->1->4->5->2->NULL--------------------------------Process exited after 42.63 seconds with return value 0请按任意键继续. . .
0 1
- 图的遍历——C语言
- 二叉树的遍历——c语言
- C语言 图的深度 遍历
- C语言数据结构之图的遍历
- C语言-数据结构-图的遍历
- 图的遍历 -深度优先—C
- 图的广度优先遍历—C
- c语言实现图的广度优先遍历
- c语言之图的定义及遍历
- 图的深度优先遍历-C语言实现
- C语言非连通图的深度优先遍历
- 图的邻接表创建与遍历(C语言)
- 图的遍历--使用邻接表作为存储结构的遍历(DFS、BFS)C语言
- 数据结构——二叉树的遍历问题(C语言)
- 二叉树的遍历(无头结点,C语言)——更新后
- stack 实现二叉树的非递归遍历——C语言
- C语言实现二叉树的遍历
- 数据结构C语言二叉树的遍历
- Java并发编程(Java Concurrency)(12)- Java 同步代码块(Java Synchronized Blocks)
- 在sklearn中使用DataFrame的一些问题(训练集与测试集列顺序问题)
- cmd下查看java字节码
- java 正则表达式 特殊构造(非捕获)理解 (2)
- CentOS6.6将/var移到新的分区
- 图的遍历——C语言
- Error: Expected resource of type id [ResourceType]的解决办法
- windows 连接Ubuntu 中HDFS的权限错误:Permission denied
- recyclerview禁止滑动
- python实现清理桌面的功能
- 利用css的target选择器实现纯css相册
- 用两个队列实现一个栈
- words reference
- Max中四边面转三角面的方法