图结构
邻接矩阵法创建图
大家好,我是小白莲,今天小白莲学到了图的创建,今天先写个邻接矩阵的创建,后续补上
参考书:大话数据结构(咳咳,也是我的学习书)
1.图结构的定义
//邻接矩阵创建图
//实现方式:一维数组存顶点,二维数组存边
//包含头文件
#include<stdio.h>
#include<stdlib.h>
//定义常量及返回码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXVEX 100 //数组最大容量
#define INFINITY 0 //我这里用0来代表无穷大,为了输出好观察
typedef int VertexType;//定义顶点类型
typedef int EdgeType;//定义边上的权值类型
typedef int Status;
//定义领接矩阵的结构
typedef struct {
VertexType vexs[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵,可看作边表
int numVertexes, numEdges;//图中当前的顶点数和边数
}MyGraph;
2.图的创建
//创建无向网图的邻接矩阵表现形式 (带权)
//注意:(实际意义不存在的边用0表示)
Status CreateMGraph(MyGraph* G) {
int i, j, k, w;//w为权值
printf("输入顶点数和边数:\n");
scanf_s("%d%d", &G->numVertexes, &G->numEdges); //输入顶点数和边数
//建立顶点表,并读入顶点的数据:
printf("请输入顶点的值:\n");
for ( i = 0; i < G->numVertexes; i++)
scanf_s("%d", &G->vexs[i]);
//建立边表:
//1.初始化
for ( i = 0; i < G->numVertexes; i++)
for ( j = 0; j < G->numVertexes; j++)
//初始化边的值为0(即权值)
G->arc[i][j] = INFINITY;
//2.读入numEdges条边
for ( k = 0; k < G->numEdges; k++) {
printf("请输入边(vi,vj)上的下标i,下标j和权w:\n");
scanf_s("%d%d%d", &i, &j, &w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];//因为是无向图,矩阵对称
}
return OK;
}//CreateMGraph
3.图元素的输出函数与在main中测试
//后边会有图的遍历算法:深搜和广搜
//这里用个简单的函数输出一下
//输出点的函数
void vexPrint(MyGraph G) {
printf("顶点的值为:\n");
for (int i = 0; i < G.numVertexes; i++)
printf("%d ", G.vexs[i]);
printf("\n");
}
//输出边的函数
void edgPrint(MyGraph G) {
printf("边的值为:\n");
for (int i = 0; i < G.numVertexes; i++)
{
for (int j = 0; j < G.numVertexes; j++)
{
printf("%2d ", G.arc[i][j]);
}
printf("\n");
}
printf("\n");
}
//测试
int main() {
MyGraph graph; //创建一个图
if (CreateMGraph(&graph)) {
vexPrint(graph);//输出顶点
edgPrint(graph);//输出边上的权值
}
return 0;
}
4.测试结果
给人点赞,手留余香
预知后续操作如何,请看下集
@author 白莲居仙 QQ:1131977233