用C和部分基础的C++创建和打印无向图
下面就是我的笔记,如果有错误,欢迎大家指正
一、头文件和自定义类型的部分
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAXSIZE 100 //设置最大顶点数为100
#define MaxInt 0 //设置最小值,表示∞
/*图的邻接矩阵存储表示*/
typedef struct AMGraph
{
char vexs[MAXSIZE]; //顶点表
int arcs[MAXSIZE][MAXSIZE]; //邻接矩阵
int vexsnum, arcsnum; //图的当前点数和边数
}AMGraph;
顶点表是用来存放无向图中元素的名称的,因为我在这里设置的名称都是一个字母的,所以用的是字符char类型,如果名称需要更多元化一些的话可以改为字符串string类型。
MAXSIZE是定义了数组中的最大的空间为多少
MaxInt则是定义了邻接表里面为空的表示
到这里基本上需要提前定义的变量都已经定义好了,接下来看函数方面
二、采用邻接矩阵法创建无向图的函数
/*采用邻接矩阵表示法创建无向网*/
void CreatUDN(AMGraph &G)
{
printf("请输入总顶点数和总边数 : ");
cin >> G.vexsnum >> G.arcsnum; //输入总顶点数和总边数
printf("输入的顶点数为 %d , 边数为 %d \n\n", G.vexsnum, G.arcsnum); //用于检测该过程有没有问题
printf("请输入顶点表里面的数据 :");
for (int i = 0; i < G.vexsnum; ++i)
cin >> G.vexs[i]; //用for循环来输入顶点表里面的元素
printf("输入的顶点表为:\n");
for (int i = 0; i < G.vexsnum; ++i)
printf(" %c ", G.vexs[i]); //用于检测该过程有没有问题
for(int i = 0; i < G.vexsnum; ++i)
for (int j = 0; j < G.vexsnum; ++j)
{
G.arcs[i][j] = MaxInt; //初始化邻接矩阵,将里面所有的元素都设置为∞
}
printf("\n初始化邻接矩阵成功!\n\n");
printf("初始化后的邻接矩阵为:\n");
printG(G);
printf("\n\n"); //用于检测该过程有没有问题
for (int k = 0; k < G.arcsnum; ++k)
{
char v1, v2;
int w; //v1,v2代表着一条边依附着的顶点,w代表着权值
int i, j;
printf("请输入一条边依附的顶点 v1 和 v2 和权值 w :\n");
cin >>v1 >>v2 >> w;
printf("\n输入的 v1 为 %c , v2 为 %c , w 为 %d \n", v1,v2,w); //用于检测该过程有没有问题
i = LocateVex(G, v1);
printf("\n返回的位置 i 为 %d \n", i); //用于检测该过程有没有问题
j = LocateVex(G, v2);
printf("\n返回的位置 j 为 %d \n", j);
G.arcs[i][j] = w;
G.arcs[j][i] = G.arcs[i][j];
}
printf("\n创建无向图成功!\n");
}
内容很多,不过一个个讲吧,因为之前调试的过程中因为不会断电法,所以在每一步的后面加了一个打印的过程,用来看看到这里为止的代码有没有出错
首先输入顶点数和边数,接下来用循环来输入顶点表里面的内容,也就是存放图的顶点名称的数组
接下来创建空的邻接矩阵,一共有多少个顶点就生成几行几列,并将里面的元素全部都初始化为0,等到下面输入权值的时候在调用去改就可以了
接下来又是一个循环,有多少条边就循环多少次,借此输入边所代表的权值
在循环中,首先输入一条边依附的两个顶点的名称和所需要赋值的权值
接下来就根据顶点的名称调用LocateG函数,以返回在顶点表的位置,用来找到在邻接矩阵的位置,函数如下
/*确定传输过来的数据在 G 中的位置,即顶点数组的下标*/
int LocateVex(AMGraph &G, char target)
{
printf("\n输入的顶点表为:\n");
for (int i = 0; i < G.vexsnum; ++i)
printf(" %c ", G.vexs[i]); //用于检测该过程有没有问题
for (int i = 0; i < G.vexsnum; i++)
{
if (G.vexs[i] == target)
{
return i;
}
}
return 0;
}
之前我因为数据的类型问题忙活了半天,不能用两个数据类型不同的对比,所以以后在进行赋值和对比之前都需要看一下数据的类型,或者在一张白纸上将所有数据的类型列下来,方便查看
在返回位置之后,就只需要通过位置来修改初始邻接矩阵的值就可以了
因为是无向图,对角线的值也需要改,例如(1,4)改了那么(4,1)也需要改
接下来是打印函数,比较简单,不做解释
void printG(AMGraph& G)
{
for (int j = 0; j < G.vexsnum; j++)
{
for (int i = 0; i < G.vexsnum; i++)
{
printf("%d ", G.arcs[i][j]);
}
printf("\n");
}
}
下面是代码的完整版
/*创建无向网的代码*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAXSIZE 100 //设置最大顶点数为100
#define MaxInt 0 //设置最大值,表示∞
/*图的邻接矩阵存储表示*/
typedef struct AMGraph
{
char vexs[MAXSIZE]; //顶点表
int arcs[MAXSIZE][MAXSIZE]; //邻接矩阵
int vexsnum, arcsnum; //图的当前点数和边数
}AMGraph;
/*确定传输过来的数据在 G 中的位置,即顶点数组的下标*/
int LocateVex(AMGraph &G, char target)
{
printf("\n输入的顶点表为:\n");
for (int i = 0; i < G.vexsnum; ++i)
printf(" %c ", G.vexs[i]); //用于检测该过程有没有问题
for (int i = 0; i < G.vexsnum; i++)
{
if (G.vexs[i] == target)
{
return i;
}
}
return 0;
}
void printG(AMGraph& G)
{
for (int j = 0; j < G.vexsnum; j++)
{
for (int i = 0; i < G.vexsnum; i++)
{
printf("%d ", G.arcs[i][j]);
}
printf("\n");
}
}
/*采用邻接矩阵表示法创建无向网*/
void CreatUDN(AMGraph &G)
{
printf("请输入总顶点数和总边数 : ");
cin >> G.vexsnum >> G.arcsnum; //输入总顶点数和总边数
printf("输入的顶点数为 %d , 边数为 %d \n\n", G.vexsnum, G.arcsnum); //用于检测该过程有没有问题
printf("请输入顶点表里面的数据 :");
for (int i = 0; i < G.vexsnum; ++i)
cin >> G.vexs[i]; //用for循环来输入顶点表里面的元素
printf("输入的顶点表为:\n");
for (int i = 0; i < G.vexsnum; ++i)
printf(" %c ", G.vexs[i]); //用于检测该过程有没有问题
for(int i = 0; i < G.vexsnum; ++i)
for (int j = 0; j < G.vexsnum; ++j)
{
G.arcs[i][j] = MaxInt; //初始化邻接矩阵,将里面所有的元素都设置为∞
}
printf("\n初始化邻接矩阵成功!\n\n");
printf("初始化后的邻接矩阵为:\n");
printG(G);
printf("\n\n"); //用于检测该过程有没有问题
for (int k = 0; k < G.arcsnum; ++k)
{
char v1, v2;
int w; //v1,v2代表着一条边依附着的顶点,w代表着权值
int i, j;
printf("请输入一条边依附的顶点 v1 和 v2 和权值 w :\n");
cin >>v1 >>v2 >> w;
printf("\n输入的 v1 为 %c , v2 为 %c , w 为 %d \n", v1,v2,w); //用于检测该过程有没有问题
i = LocateVex(G, v1);
printf("\n返回的位置 i 为 %d \n", i); //用于检测该过程有没有问题
j = LocateVex(G, v2);
printf("\n返回的位置 j 为 %d \n", j);
G.arcs[i][j] = w;
G.arcs[j][i] = G.arcs[i][j];
}
printf("\n创建无向图成功!\n");
}
int main()
{
AMGraph G;
CreatUDN(G);
printG(G);
return 0;
}
接下来附上我的调试过程和结果