图邻接矩阵存储代码实现(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;
}