图的邻接矩阵操作算法实现如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXV 5 //最大顶点个数
#define LIMITLESS 9999 //表示无穷大“ ∞ ”
typedef char InfoType [10];
//顶点类型
typedef struct VERTEXTYPE
{
int num; //顶点编号
InfoType info; //顶点其他信息
} VertexType;
//图的定义:邻接矩阵
typedef struct MGRAPH{
int n; //顶点数
int e; //边数
int deges[MAXV][MAXV]; //邻接矩阵
VertexType vesx[MAXV]; //顶点类型
} MGraph;
//创建图的邻接矩阵
void CreateMGraph(MGraph *G)
{
int i;
int j;
int k;
int w;
if(G == NULL)
{
return;
}
printf("输入顶点数和边数:");
scanf("%d %d" , &(G->n) , &(G->e));
printf("输入顶点信息:\n");
for(i = 0; i < G->n; i++)
{
scanf("%d %s" , &(G->vesx[i].num), &(G->vesx[i].info));
}
for(i = 0; i < G->n; i++)
{
for(j = 0; j < G->n; j++)
{
//邻接矩阵的对角线值为0
if(j == i)
{
G->deges[i][j] = 0;
}
//其他全部初始化为无穷大“ ∞ ”
else
{
G->deges[i][j] = LIMITLESS;
}
}
}
//记录每条边的权值
printf("请输入 i , j , w 的值:\n");
for(k = 0; k < G->e; k++)
{
scanf("%d %d %d" , &i , &j , &w);
G->deges[i][j] = w;
}
}
//输出图的邻接矩阵
void DispMGraph(MGraph *G)
{
int i;
int j;
if(G == NULL)
{
return;
}
printf("顶点数:%d\n边数:%d\n" , G->n , G->e);
printf("%d个顶点的信息:\n" , G->n);
//输出顶点信息
for(i = 0; i < G->n; i++)
{
printf("%5d %5d %s\n" , i , G->vesx[i].num , G->vesx[i].info);
}
printf("各顶点相连的情况:\n");
printf("\t");
for(j = 0; j < G->n; j++)
{
printf("[%d]\t" , j);
}
printf("\n");
for(i = 0; i < G->n; i++)
{
printf("[%d]\t" , i);
for (j = 0; j < G->n; j++)
{
if(G->deges[i][j] == LIMITLESS)
{
printf("∞\t");
}else
{
printf("%d\t" , G->deges[i][j]);
}
}
printf("\n");
}
}
int main(void)
{
MGraph *g = NULL;
g = (MGraph *)malloc(sizeof(MGraph));
//创建图结构
CreateMGraph(g);
//输出图结构
DispMGraph(g);
printf("\n");
return 0;
}
测试结果:
这是一个有向图,从测试的结果来看,和我们期望的52篇中图5中的邻接矩阵中的是一样的。