图邻接矩阵存储代码实现(2)

图邻接矩阵:用两个数组来表示图。一个一维数组存储图的顶点,另外一个二维数组存储图中边或者弧的信息。图邻接矩阵存储代码实现(2)
首先需要创建一个图,并在创建的过程记住每个元素的位置信息,这样有利于用easyx来画出更直观的图,便于观察。需要定义两个结构体:
元素即其位置结构体,图的结构体
用到的头文件如下:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <graphics.h>
#include <conio.h>
#define MAXVEX 100
typedef int EdgeType;
#define INFINITY 0x7FFFFFFF

typedef struct
{
	char data;
	int x;
	int y;
}VertexType;
typedef struct
{
	VertexType	vexs[MAXVEX];
	EdgeType	arc[MAXVEX][MAXVEX];
	int			numVertexes, numEdges;
}MGraph;

由于每次都要输入元素个数,元素位置等比较麻烦,所以把需要输入的数据放在一个同级目录下文本中,这样方便快捷。
输入数据函数(取数据函数)

void CreateMGraph(MGraph* g)
{
	FILE* pf = fopen("MGraphW.txt", "r");

	fscanf(pf, "%d,%d\n", &g->numVertexes, &g->numEdges);

	for (int i = 0; i < g->numVertexes; ++i)
	{
		fscanf(pf, "%c,%d,%d\n", &g->vexs[i].data, &g->vexs[i].x, &g->vexs[i].y);
	}

	for (int i = 0; i < g->numVertexes; ++i)
	{
		for (int j = 0; j < g->numVertexes; ++j)
		{
			if (i != j)
			{
				g->arc[i][j] = INFINITY;
			}
		}
	}

	int i, j, w;
	for (int k = 0; k < g->numEdges; ++k)
	{
		fscanf(pf, "%d,%d,%d\n", &i, &j, &w);
		g->arc[i][j] = g->arc[j][i] = w;
	}

	fclose(pf);
}

表现输出数据函数:

void ShowMGraph(const MGraph* g)
{
	wchar_t str[100];
	for (int i = 1; i < g->numVertexes; ++i)
	{
		for (int j = 0; j < i; ++j)
		{
			if (g->arc[i][j] < INFINITY)
			{
				int x1, y1, x2, y2;
				x1 = g->vexs[i].x;
				y1 = g->vexs[i].y;
				x2 = g->vexs[j].x;
				y2 = g->vexs[j].y;
				line(x1, y1, x2, y2);
				int x, y;
				x = (x1 + x2) / 2;
				y = (y1 + y2) / 2;
				swprintf(str, _T("%d"), g->arc[i][j]);
				outtextxy(x, y, (LPCTSTR)str);

			}
		}
	}

	setfillcolor(RGB(0, 0, 0));
	for (int i = 0; i < g->numVertexes; ++i)
	{
		fillcircle(g->vexs[i].x, g->vexs[i].y, 22);
		outtextxy(g->vexs[i].x - 5, g->vexs[i].y - 5, g->vexs[i].data);
	}
}

主函数:

int main()
{
	MGraph g = { 0 };	
	CreateMGraph(&g);
	initgraph(640, 480);
	ShowMGraph(&g);
	MinSpanTree_Prim(&g);
	_getch();
	closegraph();
   return 0;
   }
   

图邻接矩阵存储代码实现(2)