/*
使用邻接矩阵构造图
分析:
虽然图相比于其它数据结构较复杂,但也是十分易懂的,对于使用邻接矩阵存储的图来说,我们所需要知道的数据有
图的顶点数、边数、用一个二维数组存储的边与边的联系及其权值,未连接的边我们要使用无穷表示,节点自身用0
表示,初始时除自身节点外均表示为无穷。另外我们还需要一个一维数组用来存储我们的顶点个数
*/
#define _CRT_SECURE_NO_WARNINGS
#define MAXSIZE 100 //数组最大值
#define TYPE int
#include <stdio.h>
#include <stdlib.h>
typedef struct Graph {
TYPE Vertex[MAXSIZE];
int Edge[MAXSIZE][MAXSIZE];
int numV, numE;//顶点、边数量
}adjMatrix;
void createGraph(adjMatrix *G) {
int v, e, vi, vj, w;
printf("请输入创建的图的顶点与边个数(以空格分开):");
scanf("%d %d", &v, &e);
G->numE = e;
G->numV = v;
//初始化图
for (int i = 0; i < v; i++) {
for (int j = 0; j < v; j++) {
i == j ? G->Edge[i][j] = 0 : G->Edge[i][j] = 32767;
}
}
//将顶点存入数组
for (int i = 0; i < G->numV; i++) {
printf("请输入第%d个节点信息:", i + 1);
scanf("\n%c", &G->Vertex[i]);
}
//开始建立边与边的关系
for (int i = 0; i < G->numE; i++) {
printf("请输入边的信息vi vj w(以空格分开)");
scanf("%d %d %d", &vi, &vj, &w);//有权值就写
G->Edge[vi - 1][vj - 1] = w;//①
G->Edge[vj - 1][vi - 1] = w;//② 这代表无向图
}
}
void createGraphFromFile(adjMatrix *G) {
FILE *fp;//创建文件指针
char ev[4] = {};
char numE[3] = { 0 };//边个数信息
char numV[3] = { 0 };//顶点个数信息
char arc[6] = { 0 };//边信息
char *vertex;//顶点信息,名称
fp = fopen("graph.txt", "r");//打开文件
if (fp == NULL) {
printf("该文件无法打开!");
return;
}
fscanf(fp,"%hu %hu", numE, numV);//读取第一行
G->numE = numE[0];
G->numV = numV[0];
//初始化图
for (int i = 0; i < G->numV; i++) {
for (int j = 0; j < G->numV; j++) {
i == j ? G->Edge[i][j] = 0 : G->Edge[i][j] = 32767;
}
}
vertex = (char *)malloc(sizeof(char*)*G->numV);//这是用来存储顶点信息的数组(顶点的名字)
for (int i = 0; i <= G->numE; i++) {//开始获取后面的信息
if (i == 0) {//此时,根据我们文件的结构,第二行是顶点信息
fgets(ev, 4, fp);//获取回车符,上一次fgets后会停在回车符那儿
fgets(vertex, G->numV * 2, fp);//这里获取顶点信息
int w = 0;//用一个计数器,保证adjlist依次存储顶点
for (int j = 0; j < G->numV * 2; j++) {//因为有空格,所以让j<G->numV*2
if (vertex[j] == 32) {//是空格,不进行操作
continue;
}
else {//开始赋值
G->Vertex[w] = vertex[j];
w++;
}
}
}
else {//开始依次存储边信息
fgets(ev, 4, fp);//同样先吃掉换行符
fgets(arc, 6, fp);//读取该行的边信息
G->Edge[(int)arc[0] - 48 - 1][(int)arc[2] - 48 - 1] = (int)arc[4] - 48;
G->Edge[(int)arc[2] - 48 - 1][(int)arc[0] - 48 - 1] = (int)arc[4] - 48;
}
}
fclose(fp);
}
void dispGraph(adjMatrix *G) {
int i, j;
printf("\n输出顶点的信息(字符):\n");
for (i = 0; i < G->numV; i++)
printf("%8c", G->Vertex[i]);
printf("\n输出邻接矩阵:\n");
printf("\t");
for (i = 0; i < G->numV; i++)
printf("%8c", G->Vertex[i]);
for (i = 0; i < G->numV; i++)
{
printf("\n%8c", G->Vertex[i]);
for (j = 0; j < G->numV; j++)
{
if (G->Edge[i][j] == 32767)
//两点之间无连接时权值为默认的32767,
//在无向图中一般用"0"表示,在有向图中一般用"∞",
//这里为了方便统一输出 "∞"
printf("%8s", "∞");
else
printf("%8d", G->Edge[i][j]);
}
printf("\n");
}
}
//int main() {
// adjMatrix G;
// createGraphFromFile(&G);
// dispGraph(&G);
//}