#include<stdio.h>  
#include<stdlib.h>  
#define MAX_VER_NUM 50  
typedef char VertexType;  
typedef enum  
{  
    DG,UDG  
}GraphType;  
typedef struct  
{  
    VertexType vexs[MAX_VER_NUM];           //顶点向量  
    int arcs[MAX_VER_NUM][MAX_VER_NUM];  //邻接矩阵  
    int vexnum,arcnum;                   //图的当前顶点数和弧数  
    GraphType type;                      //图的种类标志  
}MGraph;   
  
//根据名称得到指定顶点在顶点集合中的下标  
//vex 顶点  
//return 如果找到,则返回下标,否则,返回0  
int getIndexOfVexs(char vex,MGraph *MG)  
{  
    int i;  
    for(i=1;i<=MG->vexnum;i++)  
    {  
        if(MG->vexs[i]==vex)  
        {  
            return i;  
        }  
    }  
    return 0;  
}  
  
//创建邻接矩阵  
void create_MG(MGraph *MG)  
{  
    int i,j,k;  
    int v1,v2,type;  
    char c1,c2;  
    printf("Please input graph type DG(0) or UDG(1):");  
    scanf("%d",&type);  
    if(type==0)  
    {  
        MG->type=DG;  
    }  
    else if(type==1)  
    {  
        MG->type=UDG;  
    }  
    else  
    {  
        printf("Please input correct graph type DG(0) or UDG(1)!");  
        return;  
    }  
    printf("Please input vexnum:");  
    scanf("%d",&MG->vexnum);  
    printf("Please input arcnum:");  
    scanf("%d",&MG->arcnum);  
    getchar();  
    for(i=1;i<=MG->vexnum;i++)  
    {  
        printf("Please input %dth vex(char):",i);  
        scanf("%c",&MG->vexs[i]);  
        getchar();  
    }  
    //初始化邻接矩阵  
    for(i=1;i<=MG->vexnum;i++)  
    {  
        for (j=1;j<=MG->vexnum;j++)  
        {  
            MG->arcs[i][j]=0;  
        }  
    }  
    //输入边的信息,建立邻接矩阵  
    for(k=1;k<=MG->arcnum;k++)  
    {  
        printf("Please input %dth arc v1(char) v2(char):",k);  
        scanf("%c %c",&c1,&c2);  
        v1=getIndexOfVexs(c1,MG);  
        v2=getIndexOfVexs(c2,MG);  
        if(MG->type==1)  
        {  
            MG->arcs[v1][v2]=MG->arcs[v2][v1]=1;  
        }  
        else  
        {  
            MG->arcs[v1][v2]=1;  
        }  
        getchar();  
    }  
}  
  
//打印邻接矩阵和顶点信息  
void print_MG(MGraph MG)  
{  
    int i,j;  
    if(MG.type==DG)  
    {  
        printf("Graph type: Direct graph\n");  
    }  
    else  
    {  
        printf("Graph type: Undirect graph\n");  
    }  
    printf("Graph vertex number: %d\n",MG.vexnum);  
    printf("Graph arc number: %d\n",MG.arcnum);  
    printf("Vertex set:");  
    for(i=1;i<=MG.vexnum;i++)  
    {  
        printf("%c",MG.vexs[i]);  
    }  
    printf("\nAdjacency Matrix:\n");  
    for(i=1;i<=MG.vexnum;i++)  
    {  
        for(j=1;j<=MG.vexnum;j++)  
        {  
            printf("%d",MG.arcs[i][j]);  
        }  
        printf("\n");  
    }  
}  
  
//主函数  
int main(void)  
{  
    MGraph MG;  
    create_MG(&MG);  
    print_MG(MG);  
    return 0;  
}

图的邻接矩阵(C语言实现)相关推荐

  1. C语言利用图的邻接矩阵的存储方式实现拓扑排序

    C语言利用图的邻接矩阵的存储方式实现拓扑排序 在拓扑排序中,我们的对象是有向无环图,这种图是描述工程进行过程的有效工具.比如"课程开课顺序,施工进程,软件开发进程",我们在使用有向 ...

  2. 图之邻接矩阵详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 图的邻接矩阵是一种采用邻接矩阵数组表示顶点之间相邻关系的存储结构.设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:       ...

  3. 图、邻接矩阵、广度与深度优先、生成树

    最近突然被问到这个问题,于是复习一下,用最通俗的语言解释. 图 无向图:如下左图各个顶点之间用不带箭头的边连接的图:相应的右图就是有向图                 邻接矩阵 可以理解为表示上述图 ...

  4. 图的邻接矩阵存储及遍历操作

    第1关:图的邻接矩阵存储及求邻接点操作 任务描述 本关任务:要求从文件输入顶点和边数据,包括顶点信息.边.权值等,编写程序实现以下功能. 1)构造无向网G的邻接矩阵和顶点集,即图的存储结构为邻接矩阵. ...

  5. 图的邻接矩阵简单实现Win32版本

    图的邻接矩阵存储方式,结构由顶点数量.边数量.顶点集合和边集合组成: 其中顶点集合一维数组,根据顶点的数量动态分配数组大小: 边集合是二维数组,根据顶点的数量来动态分配数组大小,对于无向图来说,该邻接 ...

  6. leetcode 547. Number of Provinces | 547. 省份数量(图的邻接矩阵 DFS)

    题目 https://leetcode.com/problems/number-of-provinces/ 题解 本题用了图的邻接矩阵 DFS.另外,也可以用并查集来做. class Solution ...

  7. leetcode 310. Minimum Height Trees | 310. 最小高度树(图的邻接矩阵DFS / 拓扑排序)

    题目 https://leetcode.com/problems/minimum-height-trees/ 题解 方法1:图的邻接矩阵 DFS(超时) 我一想,这不就是个图嘛,于是随手敲出一个 DF ...

  8. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  9. 图的邻接矩阵存储(简单代码实现)

    说起来邻接矩阵,对于学过线性代数的同学理解起来非常简单 其实就是一个数字组成方阵,每一个数字都能有有意义的代表一些信息. 下面来看一个例子 如上图所示的图,使用邻接矩阵存储的话应该是下面的情况 由此可 ...

  10. 数据结构——图的邻接矩阵实现

    图的邻接矩阵是用两个数组来表示图 一个一维数组vexs[MAXVER];用来存储顶点元素 一个二维数组arc[MAXVER][MAXVER];用来存储图的边或者弧度以及证明其存在 无向图的的二维数组 ...

最新文章

  1. Docker compose 容器编排
  2. 业界对生成图片缩略图的做法归纳
  3. WinForm打印之页边距
  4. IOS中UIActionSheet使用方法详解
  5. 网络编程2之Socket简介和java.net包
  6. Js中 关于top、clientTop、scrollTop、offsetTop的用法
  7. 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题
  8. P4103-[HEOI2014]大工程【虚树,dp】
  9. 新版 chrome 将原生支持图片懒加载!
  10. Red Hat Linux 253 实验部分
  11. Topcoder SRM 655 DIV1 250 CountryGroupHard
  12. [附源码]Java计算机毕业设计SSM电影票网上订票系统
  13. 南油外服-网易游戏测试(外包) 面试
  14. java中refresh是什么_JavaWeb Refresh响应头代码实例详解
  15. matlab 功率谱密度 汉宁窗_Matlab实例|频谱、功率谱和功率谱密度计算详解
  16. Ceph Calamari安装问题汇总
  17. PyQt5 QPushButton 设置文字对齐方式(基于setStyleSheet)
  18. 面试如何巧妙总结自己的缺点和不足之处呢
  19. [翻译] 在 Overleaf 中上传项目
  20. sdust-Java-字符串集合求并集

热门文章

  1. 2021年3月程序员工资统计,平均15189元,又涨了
  2. JVM超神之路:年后跳槽需要的JVM知识点,周末给你整理了一份!!!
  3. 阿里面试“神器”,成为众多程序员手中的王炸!
  4. 关于PLSQL Developer报动态执行表不可访问,本会话的自动统计被禁止错的解决方法 .
  5. JMM和synchronized
  6. iOS app submission : missing 64-bit support
  7. (0,eval)('this')与eval的区别
  8. php 交换函数,php用于反转/交换数组中的键名和对应关联的键值的函数array_flip()...
  9. 计算机打开就是桌面界面的讲解,电脑桌面图标打不开,小猪教您电脑桌面图标打不开怎么办...
  10. 远程下层文档 正在打印_爱普生上线智能打印“宅家学习”好物选择就来京东电脑数码...