图的组成和深度遍历
#include "stdio.h" #include <stdlib.h> #include <string.h> using namespace std; //邻接矩阵 struct graph{ int vertexs; //顶点个数 int edges; //边的条数 char* ver; //描述顶点的一维数组 int** edg; //描述边的二维数组 }; //图的初始化 void InitGraph(graph *g, bool alloc = false); //图的设置 void SetGraph(graph *g); //通过顶点数剧找下标 int ver2idx(graph *g, char ver); //打印图 void showGraph(graph *g); //深度优先遍历 void DFS(graph *g); //广度优先遍历 void BFS(graph *g); int main() { graph graphics; InitGraph(&graphics); SetGraph(&graphics); BFS(&graphics); getchar(); return 0; } void InitGraph(graph *g, bool alloc){ if (alloc){ g = new graph; } g->edges = g->vertexs = 0; g->ver = NULL; g->edg = NULL; } void SetGraph(graph *g){ printf("请输入顶点的个数:"); scanf("%d", &g->vertexs); g->ver = new char[g->vertexs]; //开辟空间 for (int i = 0; i < g->vertexs; i++){ //printf("请输入第%d个顶点:", i + 1); g->ver[i] = 'A' + i; } //开内存 g->edg = (int**)malloc(4 * (g->vertexs)); for (int i = 0; i < g->vertexs; i++){ g->edg[i] = new int[g->vertexs]; memset(g->edg[i], 0, sizeof(int)*(g->vertexs)); //置空 } printf("请输入有多少条边:"); scanf("%d", &(g->edges)); char buff[20]; for (int i = 0; i < g->edges; i++){ printf("请输入第%d条边:(A,B)\n",i+1); scanf("%s", buff); int row = ver2idx(g, buff[0]); int low = ver2idx(g, buff[2]); // printf("%d%d", row, low); g->edg[row][low] = 1; showGraph(g); } } int ver2idx(graph *g, char ver){ for (int i = 0; i < g->vertexs; i++){ if (g->ver[i] == ver) return i; } return -1; } void showGraph(graph *g){ for (int i = 0; i < g->vertexs; i++) { printf("%c ", g->ver[i]); } printf("\n"); for (int i = 0; i < g->vertexs; i++) { for (int j = 0; j < g->vertexs; j++) { printf("%d ", g->edg[i][j]); } printf("\n"); } } void DFS(graph *g){ } void BFS(graph *g){ char c; scanf("%*c"); //清空缓存区 printf("请输入顶点:"); scanf("%c", &c); printf("起始顶点为%c! \n", c); int begInd = ver2idx(g, c); //标记所有顶点都没有找过 bool *isFind = new bool[g->vertexs]; memset(isFind, 0, g->vertexs); //标记起始顶点找过,并打印 printf("%c", g->ver[begInd]); int count = 1; int i; while (1) { //从当前节点开始找相邻节点 for (i = 0; i < g->vertexs; i++) { if (g->edg[begInd][i] == 1) { if (isFind[i] == false) { printf("%c", g->ver[i]); isFind[i] = true; begInd = i; //下一个从找到的开始 count++; break; } } } if (i == g->vertexs) //回溯 { begInd = (begInd + 1) % (g->vertexs); } //没有下一个顶点了,回到起始顶点,换下一个相邻顶点 if (count > g->vertexs) break; } printf("\n"); }