基于邻接矩阵的无向图的建立+深度优先遍历+Prim算法寻找最小路径

tech2022-07-17  137

#include <stdio.h> #define MAXVEX 10 typedef char VertexType; typedef int EdgeType; int visited[MAXVEX]; typedef struct { VertexType vexs[MAXVEX]; EdgeType arc[MAXVEX][MAXVEX]; int numVertexs; }MyGraph; void creatMyGraph(MyGraph* G) { printf("请输入顶点数:\n"); scanf_s("%d", &G->numVertexs); for (int i = 0; i < G->numVertexs; i++) { printf("请输入第%d个顶点", i); while (getchar() != '\n'); scanf_s("%c", &G->vexs[i],sizeof(char)); } for (int j = 0; j < G->numVertexs; j++) { G->arc[j][j] = 0; for (int k = 0; k < j; k++) { printf("请输入节点%c和%c之间的权值", G->vexs[j], G->vexs[k]); while (getchar() != '\n'); scanf_s("%d", &G->arc[j][k]); G->arc[k][j] = G->arc[j][k]; } } } void DFS(MyGraph G, int i) { int j; printf("%c", G.vexs[i]); visited[i] = 1; for (j = 0; j < G.numVertexs; j++) { if (G.arc[i][j] != 0) { if (visited[j] == 0) DFS(G, j); } } } void DFSTraverse(MyGraph G) { int i; for (i = 0; i < G.numVertexs; i++) { visited[i] = 0; } for (i = 0; i < G.numVertexs; i++) { if (visited[i] == 0) { DFS(G, i); } } } void Prim(MyGraph G) { int lowcost[MAXVEX]; int adjvex[MAXVEX]; lowcost[0] = 0; adjvex[0] = 0; int i,min,k,j; for (i = 1; i < G.numVertexs; i++) { lowcost[i] = G.arc[0][i]; adjvex[i] = 0; } for (i = 1; i < G.numVertexs; i++) { min = 65535; k = 0; for (j = 0; j < G.numVertexs; j++) { if (lowcost[j] != 0 && lowcost[j] < min) { min = lowcost[j]; k = j; } } printf("(%d,%d)", adjvex[k], k); for (j = 0; j < G.numVertexs; j++) { if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j]) { lowcost[j] = G.arc[k][j]; adjvex[j] = k; } } } } int main() { MyGraph G; creatMyGraph(&G); DFSTraverse(G); Prim(G); }

这里在scanf_s这个函数的使用中遇到了一些问题,简单来说,%d不需要长度参数,%s和%c都需要长度参数,否则会警告。 %d不会受到回车的影响 %c会受到上一个回车的影响 %s不会受到上一个回车的影响,但是会受到上次输入溢出字符的影响(比如上一个scanf希望获得一个字符,但是输入了多个字符,那么从第二个字符之后的字符会直接赋值给这个字符串 所以在获取字符之前最好使用一下getchar()

最新回复(0)