源代码:
//
// main.c
// graph.c
// 程序目的:图的邻接矩阵
// Created by zhen7216 on 2016/12/6.
// Copyright © 2016年 chenzhen. All rights reserved.
//
#include <stdio.h>
#define MaxNum 50 //图的最大顶点数设为50
typedef char VexType[3]; //图的顶点设为字符数组
typedef int EdgeType;
typedef struct {
VexType V[MaxNum];
EdgeType E[MaxNum][MaxNum];
int n, e; //实际顶点数和边数
}MGraph; //图类型定义
/*确定顶点在图中的位置,返回顶点在一维数组中的序号*/
int Locate(MGraph *G, char vex[]) {
int i = -1;
for (i = 0; i < G->n; i++)
if (strcmp(G->V[i], vex) == 0)
return i;
return 0;
}
void createGraph(MGraph *G) {
int i, j, k;
char vex1[3], vex2[3]; //保存输入的顶点
printf("\n输入图的顶点数和边数(用逗号分隔):");
scanf("%d,%d", &(G->n), &(G->e));
printf("输入图的顶点信息(最长2个字符):");
for (i = 0; i < G->n; i++)
scanf("\n%s", G->V[i]); //输入n个顶点的信息标示,建立顶点数组
for (i = 0; i < G->n; i++)
for (j = 0; j < G->n; j++)
G->E[i][j] = 0; //对邻接矩阵元素进行初始化
printf("\n输入图中每条边所依附的两个顶点的标识信息:");
for (k = 0; k < G->e; k++) { //输入e条边
printf("\n输入第%d条边的第一个顶点:", k + 1);
scanf("%s", vex1);
printf("\n输入第%d条边的第二个顶点:", k + 1);
scanf("%s", vex2);
i = Locate(G, vex1);
j = Locate(G, vex2);
G->E[i][j] = 1; //如果同时输入G->E[j][i],则是建立无向图的邻接矩阵
}
}
/*打印图的顶点和边的信息*/
void printGraph(MGraph *G) {
int i, j;
printf("\n图中顶点的个数为:%d", G->n);
printf("\n图中边数为:%d", G->e);
printf("\n图中顶点为:");
for (i = 0; i < G->n; i++)
printf("%c%c", G->V[i][0], G->V[i][1]);
printf("\n图中边为:");
for (i = 0; i < G->n; i++)
for (j = 0; j < G->n; j++)
if (G->E[i][j])
printf("<%c%c,%c%c>", G->V[i][0], G->V[i][1], G->V[j][0], G->V[j][1]);
}
int main() {
MGraph mg;
createGraph(&mg);
printGraph(&mg);
//getch();
return 0;
}
运行结果: