目录
1.邻接矩阵(adjacency matrix)
(1)用一维数组存储顶点信息
(2)用矩阵(二维数组)表示图中顶点邻接关系
2.无向图的邻接矩阵表示
规定:若两节点连通,则在矩阵对应位置元素置1,否则置0
3.有向图的邻接矩阵表示
规定:若两节点连通,则矩阵对应位置元素为边上权值,否则为无穷大
4.网的邻接矩阵表示
规定:若两节点连通,则矩阵对应位置元素为边上权值,否则为无穷大
5.示例源代码(以上述无向图为例)
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 /* 图中最大节点数 */
typedef char VertexType; /* 顶点类型设置为字符型 */
typedef int EdgeType; /* 边上权值类型设置为整型 */
typedef struct /* 边表节点 */
{
VertexType vex[MAX_VERTEX_NUM]; /* 顶点表 */
EdgeType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; /* 邻接矩阵 */
int vexnum; /* 节点的数目 */
int edgenum; /* 边的数目 */
}MGraph;
void CreateMG(MGraph * MG); /* 邻接表法创建无向图 */
void PrintMG(MGraph MG); /* 邻接矩阵形式输出图MG */
int main(void)
{
MGraph g;
CreateMG(&g);
printf("------------------------------\n");
printf("vexnum = %d ; edgenum = %d\n", g.vexnum, g.edgenum);
printf("------------------------------\n");
PrintMG(g);
return 0;
}
void CreateMG(MGraph * MG)
{
int i = 0, j, k, w; /* w:权值 */
char ch;
printf("请依次输入顶点数、边数:");
scanf("%d %d", &(MG->vexnum), &(MG->edgenum));
printf("请依次输入顶点(以回车结束输入):");
getchar();
while ((ch = getchar()) != '\n') /* 输入顶点信息 */
MG->vex[i++] = ch;
/* 另一种方式输入顶点信息
for (i = 0; i < MG->vexnum; i++)
scanf("\n%c", &(MG->vex[i])); */
for (i = 0; i < MG->vexnum; i++) /* 初始化邻接矩阵 */
for (j = 0; j < MG->vexnum; j++)
MG->edges[i][j] = 0;
printf("顶点 | 下标\n");
for (i = 0; i < MG->vexnum; i++) /* 显示图中顶点及其对应下标 */
{
printf("%3c%6d\n", MG->vex[i], i);
}
printf("请输入每条表对应的两个顶点序号(格式:i,j):\n");
for (k = 0; k < MG->edgenum; k++) /* 建立邻接矩阵 */
{
scanf("\n%d,%d", &i, &j);
MG->edges[i][j] = 1;
MG->edges[j][i] = 1;
}
}
void PrintMG(MGraph MG)
{
int i, j;
for (i = 0; i < MG.vexnum; i++) /* 输出邻接矩阵 */
{
for (j = 0; j < MG.vexnum; j++)
printf("%2d", MG.edges[i][j]);
printf("\n");
}
}