图的邻接矩阵(C语言)

图的邻接矩阵(C语言)邻接矩阵无向图和有向图在邻接矩阵中的表示方法 无向图和有向图大同小异 在这里只以无向图为例 代码部分通过简单调整即可对应编译有向图邻接矩阵数据类型定义 defineMaxVer 定义最大容量 typedefstruc 包含权的邻接矩阵的的定义 intVertices MaxVertices 顶点信息的数组 intEdge Max

邻接矩阵

邻接矩阵概念
无向图和有向图在邻接矩阵中的表示方法:
有向图和无向图的表示方法




无向图和有向图大同小异,在这里只以无向图为例,代码部分通过简单调整即可对应编译有向图

邻接矩阵数据类型定义

#define MaxVertices 100 //定义最大容量 typedef struct{ //包含权的邻接矩阵的的定义 int Vertices[MaxVertices]; //顶点信息的数组 int Edge[MaxVertices][MaxVertices]; //边信息的数组 int numV; //顶点数 int numE; //边数 }AdjMatrix;
void CreateGraph(AdjMatrix *G) //图的生成函数 { int n,e,vi,vj,w,i,j; printf("请输入图的顶点数和边数(以空格分隔):"); scanf("%d%d",&n,&e); G->numV=n;G->numE=e; for(i=0;i 
  
    //图的初始化 
   for(j= 
   0;j 
   
     if(i==j) G->Edge[i][j]= 
    0; 
    else G->Edge[i][j]= 
    32767; } 
    for(i= 
    0;i 
    
      numV;i++) 
     //将顶点存入数组中 { 
     printf( 
     "请输入第%d个顶点的信息:",i+ 
     1); 
     scanf( 
     "%d",&G->Vertices[i]); } 
     printf( 
     "\n"); 
     for(i= 
     0;i 
     
       numE;i++) { 
      printf( 
      "请输入边的信息i,j,w(以空格分隔):"); 
      scanf( 
      "%d%d%d",&vi,&vj,&w); 
      //若为不带权值的图,则w输入1 
      //若为带权值的图,则w输入对应权值 G->Edge[vi- 
      1][vj- 
      1]=w; 
      //① G->Edge[vj- 
      1][vi- 
      1]=w; 
      //② 
      //无向图具有对称性的规律,通过①②实现 
      //有向图不具备此性质,所以只需要① } } 
      
     
    
  

创建完无向图对应的邻接矩阵,我们需要对输出的格式进行一下控制,使其尽量按照普通手写的方式输出

void DispGraph(AdjMatrix G) //输出邻接矩阵的信息 { int i,j; printf("\n输出顶点的信息(整型):\n"); for(i=0;i 
  
    printf( 
   "%8d",G.Vertices[i]); 
   printf( 
   "\n输出邻接矩阵:\n"); 
   printf( 
   "\t"); 
   for(i= 
   0;i 
   
     printf( 
    "%8d",G.Vertices[i]); 
    for(i= 
    0;i 
    
      printf( 
     "\n%8d",i+ 
     1); 
     for(j= 
     0;j 
     
       if(G.Edge[i][j]== 
      32767) //两点之间无连接时权值为默认的 
      32767,但输出时为了方便输出 
      "∞" 
      printf( 
      "%8s", 
      "∞"); 
      else 
      printf( 
      "%8d",G.Edge[i][j]); } 
      printf( 
      "\n"); } } 
      
     
    
  

完整程序如下:

#include 
    #include 
    #define MaxVertices 100 //假设包含100个顶点 #define MaxWeight 32767 //不邻接时为32767,但输出时用 "∞" typedef struct{ //包含权的邻接矩阵的的定义 int Vertices[MaxVertices]; //顶点信息的数组 int Edge[MaxVertices][MaxVertices]; //边的权信息的数组 int numV; //当前的顶点数 int numE; //当前的边数 }AdjMatrix; void CreateGraph(AdjMatrix *G) //图的生成函数 { int n,e,vi,vj,w,i,j; printf("请输入图的顶点数和边数(以空格分隔):"); scanf("%d%d",&n,&e); G->numV=n;G->numE=e; for(i=0;i 
  
    //图的初始化 
   for(j= 
   0;j 
   
     if(i==j) G->Edge[i][j]= 
    0; 
    else G->Edge[i][j]= 
    32767; } 
    for(i= 
    0;i 
    
      numV;i++) 
     //将顶点存入数组中 { 
     printf( 
     "请输入第%d个顶点的信息(整型):",i+ 
     1); 
     scanf( 
     "%d",&G->Vertices[i]); } 
     printf( 
     "\n"); 
     for(i= 
     0;i 
     
       numE;i++) { 
      printf( 
      "请输入边的信息i,j,w(以空格分隔):"); 
      scanf( 
      "%d%d%d",&vi,&vj,&w); 
      //若为不带权值的图,则w输入1 
      //若为带权值的图,则w输入对应权值 G->Edge[vi- 
      1][vj- 
      1]=w; 
      //① G->Edge[vj- 
      1][vi- 
      1]=w; 
      //② 
      //无向图具有对称性的规律,通过①②实现 
      //有向图不具备此性质,所以只需要① } } 
      void DispGraph(AdjMatrix G) 
      //输出邻接矩阵的信息 { 
      int i,j; 
      printf( 
      "\n输出顶点的信息(整型):\n"); 
      for(i= 
      0;i 
      
        printf( 
       "%8d",G.Vertices[i]); 
       printf( 
       "\n输出邻接矩阵:\n"); 
       printf( 
       "\t"); 
       for(i= 
       0;i 
       
         printf( 
        "%8d",G.Vertices[i]); 
        for(i= 
        0;i 
        
          printf( 
         "\n%8d",i+ 
         1); 
         for(j= 
         0;j 
         
           if(G.Edge[i][j]== 
          32767) 
          //两点之间无连接时权值为默认的32767, 在无向图中一般用 
          "0"表示,在有向图中一般用 
          "∞", 这里为了方便统一输出 
          "∞" 
          printf( 
          "%8s", 
          "∞"); 
          else 
          printf( 
          "%8d",G.Edge[i][j]); } 
          printf( 
          "\n"); } } 
          int main() { AdjMatrix G; CreateGraph(&G); DispGraph(G); } 
          
         
        
       
      
     
    
  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218347.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:28
下一篇 2026年3月18日 上午7:28


相关推荐

  • Python天天美味(13) – struct.unpack

    Python天天美味(13) – struct.unpack

    2022年2月23日
    65
  • 单页面网站的利弊

    单页面网站的利弊现在的网站 一般的网站建设公司都会选择做成多页面网站 因为多页面网站内容丰富 相比单页面网站 更容易做 SEO 优化 也能在网站外形上做多些变化 但是还是会有特殊网站要求做单页面网站 今天 惠州网站建设公司 惠州盖亚科技的小编就来说说单页面网站的利弊 让大家对此有些了解 首先 我们来看看单页面网站有什么优势呢 nbsp 第一 利于搜索引擎的抓取 单页面网站最大的优点

    2026年3月26日
    2
  • 一、SpringBoot+MybatisPlus+P6spy环境搭建

    一、SpringBoot+MybatisPlus+P6spy环境搭建

    2021年7月12日
    90
  • java栈帧里面的储存的内容_java创建一个栈

    java栈帧里面的储存的内容_java创建一个栈文章转载自:http://www.tuicool.com/articles/URZrMnbjvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。栈帧(StackFrame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(VirtualMachineStack)的栈元素。栈帧存储了方法的…

    2025年9月17日
    8
  • 什么是activity的生命周期_activity切换生命周期

    什么是activity的生命周期_activity切换生命周期Activity生命周期,英文名也叫activity_lifecycle。Activity状态每个Activity在其生命周期内可能会有哪几种状态吗?没错,一共有运行状态、暂停状态、停止状态和销毁状态这4种。运行状态当一个Activity位于返回栈的栈顶时,Activity就处于运行状态。系统最不愿意回收的就是处于运行状态的Activity,因为这会带来非常差的用户体验。暂停状态当一个Activity不再处于栈顶位置,但仍然可见时,Activity就进入了暂停状态。你可能会觉得,既然Activi

    2022年8月16日
    6
  • 20道经典Redis面试题

    20道经典Redis面试题前言整理了 20 道经典 Redis 面试题 希望对大家有帮助 1 什么是 Redis 它主要用来什么的 Redis 英文全称是 RemoteDictio 远程字典服务 是一个开源的使用 ANSIC 语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value 数据库 并提供多种语言的 API 与 MySQL 数据库不同的是 Redis 的数据是存在内存中的 它的读写速度非常快 每秒可以处理超过 10 万次读写操作 因此 redis 被广泛应用于缓存 另外 Redis 也经常用来做分布式锁

    2025年8月31日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号