目录
1. 邻接矩阵表示法
1.1 图的邻接矩阵
图的邻接矩阵表示法(Adjacency Matrix)也称作数组表示法。它采用两个数组来表示图:一个是用于存储顶点信息的一维数组,另一个是用于存储图中顶点之间关联关系的二维数组,这个关联关系数组被称为邻接矩阵。
有向图的邻接矩阵可以指示弧的方向;无向图的邻接矩阵没有方向,所以是对称矩阵;
稀疏图不适于用邻接矩阵来存储,会造成空间浪费。
1.2 创建有向网的邻接矩阵
# include<stdio.h>
# define MAX_VERTEX_NUM 20 //最多顶点个数
# define INFINITY 32768 //表示极大值,即∞
/*图的邻接矩阵表示法*/
typedef int AdjType;
typedef char VertexData;
typedef struct ArcNode {
AdjType adj; //无权图用1或0表示是否相邻,带权图则为权值类型
}ArcNode;
typedef struct {
VertexData vertex[MAX_VERTEX_NUM]; //顶点向量
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
int vexnum, arcnum; //图的顶点数和弧数
}AdjMatrix;
/*采用邻接矩阵表示法创建有向网*/
/*求顶点位置*/
int LocateVertex(AdjMatrix* G, VertexData v) {
int k;
for (k = 0; k < G->vexnum; k++) {
if (G->vertex[k] == v)
break;
}
return k;
}
/*创建有向网*/
int CreateDN(AdjMatrix* G) {
int i, j, k, weight;
VertexData v1, v2;
printf("输入图的顶点数和弧数:"); //输入图的顶点数和弧数
scanf("%d%d", &G->vexnum, &G->arcnum);
for (i = 0; i < G->vexnum; i++) {
//初始化邻接矩阵
for (j = 0; j < G->vexnum; j++)
G->arcs[i][j].adj = INFINITY;
}
printf("输入图的顶点:");
for (i = 0; i < G->vexnum; i++) //输入图的顶点
scanf(" %c", &G->vertex[i]);
for (k = 0; k < G->arcnum; k++) {
printf("输入第%d条弧的两个顶点及权值:", k + 1);
scanf(" %c %c %d", &v1, &v2, &weight); //输入一条弧的两个顶点及权值
i = LocateVertex(G, v1);
j = LocateVertex(G, v2);
G->arcs[i][j].adj = weight; //建立弧