//
// Created by zhuoL on 2021/11/10.
//
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERtEX_NUM 20 //顶点的最大个数
#define VRType int //表示顶点之间的关系的变量类型
#define InfoType int //存储弧或者边额外信息的指针变量类型
#define VertexType char //图中顶点的数据类型
typedef struct {
VRType adj; //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值。
InfoType *info; //弧或边额外含有的信息指针
} ArcCell, AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM];
typedef struct {
VertexType vexs[MAX_VERtEX_NUM]; //存储图中顶点数据
AdjMatrix arcs; //二维数组,记录顶点之间的关系
int vexnum, arcnum; //记录图的顶点数和弧(边)数
} MGraph;
//根据顶点本身数据,判断出顶点在二维数组中的位置
int LocateVex(MGraph *G, VertexType v) {
int i = 0;
//遍历一维数组,找到变量v
for (; i < G->vexnum; i++) {
if (G->vexs[i] == v) {
break;
}
}
//如果找不到,输出提示语句,返回-1
if (i > G->vexnum) {
// printf("no such vertex.\n");
return -1;
}
return i;
}
//构造无向图
void CreateDN(MGraph *G) {
//printf("输入图含有的顶点数和边的个数:");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
getchar();
// printf("输入顶点数据:");
int i, j, k;
for (i = 0; i < G->vexnum; i++) {
scanf("%c", &(G->vexs[i]));
}
getchar();
for (j = 0; j < G->vexnum; j++) {
for (k = 0; k < G->vexnum; k++) {
G->arcs[j][k].adj = 0;
G->arcs[j][k].info = NULL;
}
}
char v1, v2;
//printf("输入每条边:");
int i1;
for (i1 = 0; i1 < G->arcnum; i1++) {
v1 = getchar();
v2 = getchar();
// scanf("%c%c", &v1,&v2);
getchar();
int n = LocateVex(G, v1);
int m = LocateVex(G, v2);
if (m == -1 || n == -1) {
//printf("no this vertex\n");
return;
}
G->arcs[n][m].adj = 1;
G->arcs[m][n].adj = 1;//无向图的二阶矩阵沿主对角线对称
}
}
//输出函数
void PrintGrapth(MGraph G) {
int i, j;
for (i = 0; i < G.vexnum; i++) {
for (j = 0; j < G.vexnum; j++) {
printf("%-2d", G.arcs[i][j].adj);
}
printf("\n");
}
}
int main() {
MGraph G;//建立一个图的变量
CreateDN(&G);
printf("The vertexs of graph:");
int i;
for (i = 0; i < G.vexnum; ++i) {
printf("%c", G.vexs[i]);
}
printf("\nAdjent matrix:\n");
PrintGrapth(G);//输出图的二阶矩阵
return 0;
}
C语言创建无向图
最新推荐文章于 2022-12-03 21:41:28 发布