邻接矩阵
图的存储结构分为 邻接矩阵 和 邻接表, 本篇文章是有关通过邻接矩阵来实现图的存储, 邻接矩阵, 顾名思义, 即顶点之间的关系通过矩阵的形式表现出来, 矩阵的行坐标代表起始顶点的位置, 列坐标代表到达顶点的位置(无向图和无向网始末位置不讨论), 对于不带权的图或网而言, 矩阵中的值存放邻接标志, 如果起始顶点与到达顶点邻接, 则为 1, 否则为 0; 而对于带权图或网而言, 如果起始顶点与到达顶点邻接, 则为指定权值, 否则为一个无穷大的数.
邻接矩阵的具体实现
定义图的类型
//定义一些自定义类型
typedef char VertexType[4]; //结点类型
#define INFINITY 10000 //定义一个无穷大的数
#define MAXSIZE 100 //最大顶点的个数
//DG:有向图 GN:有向网 UG:无向图 UN:无向网
typedef enum {
DG, DN, UG, UN} GraphKind;
//定义弧或边的信息结构
typedef struct {
//若是无权图, 用 1 代表相邻, 0 代表不相邻; 若是有权图, 则存储权值
int adj;
//存储与弧或边相关的信息
char* infor;
}ArcNode, AdjMaxtrix[MAXSIZE][MAXSIZE];
//定义图的类型及相关信息
typedef struct {
//存储顶点
VertexType vex[MAXSIZE];
//定义一个存储了弧或边信息的邻接矩阵
AdjMaxtrix arc;
//顶点数
int vexnum;
//弧或边数
int arcnum;
//图的类型
GraphKind kind;
}MGraph;
创建一个有向网
void CreateGraph(MGraph* N) {
//定义一个是否录入弧的信息的判断变量
int InforFlag = 0;
//定义两个相邻结点的名称变量
VertexType v1, v2;
//定义权值
int w = 0;
//定义输入权值(或相邻)位置的索引
int row, col;
//定义一个储存每个弧信息的数组
char s[MAXSIZE];
printf("请输入有向网 N 的顶点数,弧数,弧的信息(是:1, 否:0):");
scanf("%d,%d,%d", &N->vexnum, &N->arcnum, &InforFlag);
printf("请输入 %d 个顶点的值(<%d个字符):\n", N->vexnum, MAXSIZE);
//保存网的各个顶点
for (int i = 0; i < N->vexnum; ++i) {
scanf(