C语言创建无向图

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值