//以邻接矩阵作为图的存储结构,创建无向图。 #include #include #define M 200 #define Max 32767 typedef struct { char vexs[M]; int arcs[M][M]; int vexnum, arcnum;//顶点数,边数 } Graph; //返回位置函数 int Locatevex(Graph *G, char v) { int i; for (i = 0; i < G->vexnum; i++) { if (G->vexs[i] == v) return i; } return -1; } void CreateGraph(Graph *G) { int i, j, k, v1, v2, w; printf("请输入你要生成图的顶点数和边数:"); scanf("%d%d", &G->vexnum, &G->arcnum); for (i = 0; i < G->vexnum; i++) { printf("请输入第%d个顶点信息:", i + 1); scanf("%c", G->vexs[i]); } for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) { G->arcs[i][j] = 32767; if (i == j) { G->arcs[i][j] = 0; } } } printf("请输入两个顶点和对应边的权值:\n"); for (k = 0; k < G->arcnum; i++) { scanf("%c%c%d", &v1, &v2, &w); i = Locatevex(G, v1); j = Locatevex(G, v2); G->arcs[i][j] = w; G->arcs[j][i] = G->arcs[i][j]; } } void PrintGraph(Graph *G) { int i, j; printf("邻接矩阵为:\n"); for (i = 0; i < G->vexnum; i++) { printf(" %c", G->vexs[i]); } printf("\n"); for (i = 0; i < G->vexnum; i++) { printf("%c ", G->vexs[i]); for (j = 0; j < G->vexnum; j++) { if (G->arcs[i][j] == 32767) { printf("$"); } else { printf("%d", G->arcs[i][j]); } } } printf("\n"); } void menu () { printf("**************************\n"); printf("**1.创建图 2.打印图**\n"); printf("**3.深度优先 4.广度优先**\n"); printf("**5.退出 **\n"); printf("**************************\n"); } int main() { int i, num; Graph G; while (1) { menu();//选择菜单 printf("请输入你要选择的功能:"); scanf("%d", num); switch (num) { case 1: CreateGraph(&G);//创建图 break; case 2: PrintGraph(&G);//打印图 break; case 5: exit(0); break; } } return 0; }
#define M 200
#define Max 32767
typedef struct {
char vexs[M];
int arcs[M][M];
int vexnum, arcnum;//顶点数,边数
} Graph;
//返回位置函数
int Locatevex(Graph *G, char v)
{
int i;
for (i = 0; i < G->vexnum; i++)
{
if (G->vexs[i] == v)
return i;
} return -1;
}
void CreateGraph(Graph *G)
{
int i, j, k, v1, v2, w;
printf("请输入你要生成图的顶点数和边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
for (i = 0; i < G->vexnum; i++)
{
printf("请输入第%d个顶点信息:", i + 1);
scanf(" %c", &G->vexs[i]); /*错误1,%c前面需要加空格*/
}
for (i = 0; i < G->vexnum; i++)
{
for (j = 0; j < G->vexnum; j++)
{
G->arcs[i][j] = 32767;
if (i == j)
{
G->arcs[i][j] = 0;
}
}
}
printf("请输入两个顶点和对应边的权值:\n");
for (k = 0; k < G->arcnum; k++)
{
scanf(" %c %c %d", &v1, &v2, &w);/*错误2,需要空格分开*/
i = Locatevex(G, v1);
j = Locatevex(G, v2);
G->arcs[i][j] = w;
G->arcs[j][i] = G->arcs[i][j];
}
}
void PrintGraph(Graph *G)
{
int i, j;
printf("邻接矩阵为:\n");
for (i = 0; i < G->vexnum; i++)
{
printf(" %c", G->vexs[i]);
}
printf("\n");
for (i = 0; i < G->vexnum; i++)
{
printf("%c ", G->vexs[i]);
for (j = 0; j < G->vexnum; j++)
{
if (G->arcs[i][j] == 32767)
{
printf("$");
}
else
{
printf("%d", G->arcs[i][j]);
}
}
}
printf("\n");
}
void menu ()
{
printf("**************************\n");
printf("**1.创建图 2.打印图**\n");
printf("**3.深度优先 4.广度优先**\n");
printf("**5.退出 **\n");
printf("**************************\n");
}
int main()
{
int i, num;
Graph G;
while (1)
{
menu();//选择菜单
printf("请输入你要选择的功能:");
scanf("%d", &num);/*错误3,需要加&*/
switch (num)
{
case 1:
CreateGraph(&G);//创建图
break;
case 2:
PrintGraph(&G);//打印图
break;
case 5:
exit(0);
break;
}
}
return 0;
}
问题写到注释当中了,流程都能进去了,看看还有没有其他类似的问题,scanf的用法你需要再研究一下,兄弟