实现内容:
①文件读取图,以邻接表形式储存(文件路径在宏定义)
②把邻接表储存转化为邻接矩阵储存
③输出邻接矩阵
思路:转化分两步,一个是顶点数组,一个是邻接矩阵。顶点数组直接循环邻接表的顶点数组赋值,邻接矩阵则需要对每一个顶点结点的FirstArc进行判断,如果不是NULL就把邻接矩阵相应位置赋值为1,表示顶点之间有边,直到该顶点的Next是NULL
测试图:
读取的文件:
运行情况:
代码如下:
/*
实现内容:
①文件读取图,以邻接表形式储存(文件路径在宏定义)
②把邻接表储存转化为邻接矩阵储存
③输出邻接矩阵
VS2019 编译通过
2020.8.1 王大花
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <memory.h>
#define VexDateType char
#define MaxVexDateLength 2
#define TextPath "C:\\Users\\86132\\Desktop\\第7章 作业\\临接表变邻接矩阵\\ALGraph.txt"
//邻接表表示法
//弧结点
typedef struct _ARCNODE ArcNode;
struct _ARCNODE {
int AdjVex;
ArcNode* Next;
};
//顶点结点
typedef struct _VEXNODE {
VexDateType Date;
ArcNode* FirstArc;
}VexNode;
//图
typedef struct _ALGRAPH {
VexNode* Vertics;
int VexNum;
int ArcNum;
}ALGraph;
//邻接矩阵表示法
//顶点结点
typedef struct _ARVEXNODE {
VexDateType Date;
}ArVexNode;
//图
typedef struct _ARGLAPH {
ArVexNode* Vertics;
int** ArcMatrix;
int VexNum;
int ArcNum;
}ArGraph;
//根据元素寻找顶点位置 默认元素为ABCD……顺序排布
int Locate(char ch) {
return ch - 'A';
}
void Creat_ALGraph(ALGraph* G){
//从文件读取信息
FILE* fp = fopen(TextPath, "r");
if (NULL == fp)
return;
fscanf(fp , "%d%d", &G->VexNum, &G->ArcNum);
G->Vertics = (VexNode*)malloc(sizeof(VexNode) * G->VexNum);
//初始化顶点数组
for (int i = 0; i < G->VexNum; i++) {
fscanf(fp, " %c", &G->Vertics[i].Date);
G->Vertics[i].FirstArc = NULL;
}
//读取弧的信息
for (int i = 0; i < G->ArcNum; i++) {
char ch1, ch2;
fscanf(fp, " %c %c", &ch1, &ch2);
ch1 = Locate(ch1);
ch2 = Locate(ch2);
//创建第一个弧节点并插入
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->Next = G->Vertics[ch1].FirstArc;
p->AdjVex = ch2;
G->Vertics[ch1].FirstArc = p;
//创建第二个弧节点并插入
p = (ArcNode*)malloc(sizeof(ArcNode));
p->Next = G->Vertics[ch2].FirstArc;
p->AdjVex = ch1;
G->Vertics[ch2].FirstArc = p;
}
fclose(fp);
}
void AL_TransTo_AR(ALGraph G1, ArGraph* G2) {
G2->Vertics = (ArVexNode*)malloc(sizeof(ArVexNode) * G1.VexNum);
G2->VexNum = G1.VexNum;
G2->ArcNum = G1.ArcNum;
//初始化邻接矩阵
G2->ArcMatrix = (int**)malloc(sizeof(int*) * G2->VexNum);
for (int i = 0; i < G2->VexNum; i++) {
G2->ArcMatrix[i] = (int*)malloc(sizeof(int) * G2->VexNum);
memset(G2->ArcMatrix[i], 0, sizeof(int) * G2->VexNum);
//顺便更新顶点;
G2->Vertics[i].Date = G1.Vertics[i].Date;
}
//更新邻接矩阵
for (int i = 0; i < G1.VexNum; i++) {
ArcNode* p = G1.Vertics[i].FirstArc;
while (NULL != p) {
G2->ArcMatrix[i][p->AdjVex] = G2->ArcMatrix[p->AdjVex][i] = 1;
p = p->Next;
}
}
}
void Print_ArGraph(ArGraph G) {
printf("共有%d个顶点%d条弧\n", G.VexNum, G.ArcNum);
printf("邻接矩阵:\n\n ");
for (int i = 0; i < G.VexNum; i++) {
printf("%c ", G.Vertics[i].Date);
}
printf("\n");
for (int i = 0; i < G.VexNum; i++) {
printf("%c", G.Vertics[i].Date);
for (int j = 0; j < G.VexNum; j++)
printf(" %d", G.ArcMatrix[i][j]);
printf("\n");
}
}
int main(void) {
ALGraph G1;
Creat_ALGraph(&G1);
ArGraph G2;
AL_TransTo_AR(G1, &G2);
Print_ArGraph(G2);
return 0;
}