无向图的创建和打印

用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;
}

接下来附上我的调试过程和结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值