//bfs后续补充; #include <stdio.h> #include <string.h> #define N 100 /* 创建邻接矩阵:以无向图为例: 需要数据类型: 1.顶点数据类型,顶点数组; 2.二维数组,表示是否有边; 3.图的总结点数目和边数; 实现:深度优先遍历和广度优先遍历。 */ //顶点类型; typedef struct AM { //顶点的 char v[N]; int e[N][N]; int vnumber,enumber;//定点数与边数; }AM; AM am;//定义一个图的数据类型; //创建图; int Search(char f[],char x) { for(int i=0;i<strlen(f);i++) if(f[i]==x) return i; return -1; } void Creat(AM &e) { /* 输入数据方式: 例如: 5 5 ABCDE A B A C A D C D D E */ printf("请输入顶点个数与边的个数:\n");scanf("%d %d",&e.vnumber,&e.enumber);getchar(); printf("请依次输入各节点的字符值:\n"); for(int i=0;i<e.vnumber;i++) scanf("%c",&e.v[i]);getchar(); //初始化邻接矩阵;为网或者为图的时候初始化不同; for(int i=0;i<e.enumber;i++) for(int j=0;j<e.enumber;j++) e.e[i][j]=0; printf("请依次输入每条边对应的两个顶点:\n"); for(int i=0;i<e.enumber;i++) { char x,y; scanf("%c %c",&x,&y);getchar();//吸收回车; int a,b; a=Search(e.v,x);b=Search(e.v,y);//Search为寻找字符x与y在顶点数组中的位置;坐标位置; e.e[a][b]=1;e.e[b][a]=1; } printf("邻接矩阵建立完毕!\n"); } //深度优先遍历: //定义一个vis[]数组,表示当前结点是否被访问过; int vis[N]; void dfs(AM am,int number) { //AM代表图的数据类型;v代表首先访问第v个顶点; printf("%c ",am.v[number]);vis[number]=1; for(int i=0;i<am.vnumber;i++)//依次检查邻接矩阵第number行的邻接点; if(am.e[number][i] && vis[i]==0) dfs(am,i); } //广度优先遍历:这个需要借助队列来实现; void bfs(AM am,int number) { printf("%c ",am.v[number]);vis[number]=1; /*for()*/ } int main() { Creat(am); for(int i=0;i<am.vnumber;i++) vis[i]=0; dfs(am,0); for(int i=0;i<am.vnumber;i++) vis[i]=0; bfs(am,0); return 0; }