图的邻接矩阵存储—C语言

图的邻接矩阵存储—C语言_第1张图片
图的邻接矩阵存储—C语言_第2张图片
代码实现:

//图的邻接矩阵存储结构—用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组(称为邻接数组)存储图中的边或弧的信息。
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#define MAX_VERTICES 100 //假设图有100个顶点
#define MAX_WEIGHT 32767 //加权图(网)不邻接时为10000,但输出为“∞”

typedef struct
{
	int Vertices[MAX_VERTICES]; //顶点信息的数组
	int AdjacencyMatrix[MAX_VERTICES][MAX_VERTICES]; //边信息的数组。
	int numV; //当前的顶点数
	int numA; //当前的边数
}AdMatrix;
//图的生成函数
void CreateGraph(AdMatrix *G)
{
	int n, e, vi, vj, w;
	printf("请输入图的顶点数和边数(空格隔开):");
	scanf("%d%d", &n, &e);
	G->numV = n;
	G->numA = e;
	//AdjacencyMatrix初始化
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			//无权图的初始化
			//G->AdjacencyMatrix[i][j] = 0;

			//加权图(网)的初始化
			if (i == j)
			{
				G->AdjacencyMatrix[i][j] = 0;
			}
			else
			{
				G->AdjacencyMatrix[i][j] = MAX_WEIGHT;
			}

		}
	}
	//Vertices数组的创建
	for (int i = 0; i < G->numV; i++)
	{
		printf("\n 请输入第%d个顶点的信息(整数):\n", i + 1);
		scanf("%d", &G->Vertices[i]);
	}
	//AdjacencyMatrix数组的建立
	for (int i = 0; i < G->numA; i++)
	{
		printf("请输入边的信息i,j,w(空格分开):\n");
		scanf("%d%d%d", &vi, &vj, &w);
		G->AdjacencyMatrix[vi - 1][vj - 1] = w;
		//G->AdjacencyMatrix[vj - 1][vi - 1] = w;//无向图具有对称性,通过其实现;有向图不需要这条语句。
	}
}
//输出邻接矩阵的信息
void ShowGraph(AdMatrix *G)
{
	int i, j;
	printf("输出顶点的信息:\n");
	for (i = 0; i < G->numV; i++)
	{
		printf("%d ", G->Vertices[i]);
	}
	printf("\n输出邻接矩阵的信息: \n");
	printf("  ");
	for (i = 0; i < G->numV; i++)
	{
		printf("%d ", i + 1);
	}
	for (i = 0; i < G->numV; i++)
	{
		printf("\n%d ", i + 1);
		for (j = 0; j < G->numV; j++)
		{
			if (G->AdjacencyMatrix[i][j] == MAX_WEIGHT)
			{
				printf("%s ", "∞");
			}
			else
			{
				printf("%d ", G->AdjacencyMatrix[i][j]);
			}
		}
		printf("\n");
	}
}

int main()
{
	AdMatrix G;
	CreateGraph(&G);
	ShowGraph(&G);

	system("pause");
	return 0;
}

运行结果:
图的邻接矩阵存储—C语言_第3张图片

你可能感兴趣的:(程序解析,数据结构)