图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。
图的应用极为广泛,已渗入到诸如语言学、逻辑学、物理、化学、电讯、计算机科学以及数学的其它分支。
一个图(G)定义为一个偶对(V,E),记为G=(V,E) 。其中:V是顶点(Vertex)的非空有限集合,记为V(G);E是无序集(V,V)的一个子集,记为E(G) ,其元素是图的弧(Arc)
图的分类
有向图(Digraph):若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是有序的,称图G是有向图。
在有向图中,若 <v,w>在关系集合E(G)中,表示从顶点v到顶点w有一条弧。其中:v称为弧尾(tail)或始点(initial node),w称为弧头(head)或终点(terminal node) 。
无向图(Undigraph): 若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是无序的,称图G是无向图。

对于无向图G=(V,E),图G中依附于vi的边的数目称为顶点vi的度(degree),记为TD(vi)。
对有向图G=(V, E),图G中以vi作为起点的有向边(弧)的数目称为顶点vi的出度(Outdegree),记为OD(vi) ;以vi作为终点的有向边(弧)的数目称为顶点vi的入度(Indegree),记为ID(vi) 。顶点vi的出度与入度之和称为vi的度,记为TD(vi) 。
邻接矩阵
对于有n个顶点的图,用一维数组vexs[n]存储顶点信息,用二维数组A[n][n]存储顶点之间关系的信息。该二维数组称为邻接矩阵。在邻接矩阵中,以顶点在vexs数组中的下标代表顶点,邻接矩阵中的元素A[i][j]存放的是顶点i到顶点j之间关系的信息。
接下来看一下存储结构:邻接矩阵:

typedef int EdgeType;
typedef struct{VertexType vexs[MaxVerNum];  //字符类型数组,存储顶点信息EdgeType edges[MaxVerNum][MaxVerNum];  //整型,邻接矩阵,存图中的边
int vnum, eenum; // vum是记录图的顶点数,eenum是记录图中边的个数
}MGraph;
在创建完毕后,接下来写一个创造函数:```c
void CreateMGraph(MGraph *G)
{int i,j,k;printf("请输入顶点数和弧数(输入格式为:顶点数,弧数):\n");scanf("%d,%d", &G->vnum, &G->eenum);printf("请输入顶点信息(输入格式为:顶点号):\n");getchar();for(i=0;i<G->vnum;i++)scanf("%c",&G->vexs[i]);for(i=0;i<G->vnum;i++)for(j=0;j<G->vnum;j++)G->edges[i][j]=0;getchar();printf("请输入每条弧对应的两个顶点的序号(输入格式为:i,j):\n");for(k=0;k<G->eenum;k++){scanf("%d,%d", &i, &j);G->edges[i][j]=1;}
}
进行度数的统计:```c
void Cdegree(MGraph *G)
{int i,j,in,out,count;for(i=0;i<G->vnum;i++){in=out=count=0;for(j=0;j<G->vnum;j++){if(G->edges[i][j])out++;if(G->edges[j][i])in++;}count=in+out;printf("结点%c:入度:%d 出度:%d 度:%d\n",G->vexs[i], in,out,count);}
}

好了,现在基本的功能:创建图和图的度数统计已经完成!
下篇文章将讲解如何进行DFS和BFS
完整的代码:

#include<stdio.h>
#include<stdlib.h>
#define MaxVernum 20
#define MaxVerNum 20
typedef char VertexType;
typedef int EdgeType;
typedef struct{VertexType vexs[MaxVerNum];  //字符类型数组,存储顶点信息EdgeType edges[MaxVerNum][MaxVerNum];  //整型,邻接矩阵,存图中的边
int vnum, eenum; // vum是记录图的顶点数,eenum是记录图中边的个数
}MGraph;
//到此创建完毕图的邻接矩阵的储存结构
//下一步来create一下
void CreateMGraph(MGraph *G)
{int i,j,k;printf("请输入顶点数和弧数(输入格式为:顶点数,弧数):\n");scanf("%d,%d", &G->vnum, &G->eenum);printf("请输入顶点信息(输入格式为:顶点号):\n");getchar();for(i=0;i<G->vnum;i++)scanf("%c",&G->vexs[i]);for(i=0;i<G->vnum;i++)for(j=0;j<G->vnum;j++)G->edges[i][j]=0;getchar();printf("请输入每条弧对应的两个顶点的序号(输入格式为:i,j):\n");for(k=0;k<G->eenum;k++){scanf("%d,%d", &i, &j);G->edges[i][j]=1;}
}
//下面进行度数的统计::
void Cdegree(MGraph *G)
{int i,j,in,out,count;for(i=0;i<G->vnum;i++){in=out=count=0;for(j=0;j<G->vnum;j++){if(G->edges[i][j])out++;if(G->edges[j][i])in++;}count=in+out;printf("结点%c:入度:%d 出度:%d 度:%d\n",G->vexs[i], in,out,count);}
}
int main()
{MGraph *G =(MGraph *)malloc(sizeof(MGraph));CreateMGraph(G);Cdegree(G);
}
测试用例如图所示:


对应的实际图为:

所对应的邻接矩阵为:

自己的第一篇CSDN,如果有更好的思路,请批评指正!

数据结构(C语言)图的创建和度数统计(基础)相关推荐

  1. 数据结构 --- c语言图的基础

    本博客主要介绍图的基本概念.图的存储结构和有关图的一些常用算法       1)  图的定义和术语       2)  图的各种存储结构       3)  图的深度优先搜索(DFS)和广度优先搜索( ...

  2. 数据结构C语言实现-6—图

    Table of Contents 邻接矩阵创建 邻接表创建 邻接矩阵深度和广度遍历 邻接表深度和广度遍历 最小生成树-Prim 最小生成树-Kruskal 最短路径-Dijkstra 最短路径-Fl ...

  3. 【数据结构C语言版】课程实验-图的应用

    数据结构C语言版 - 图的应用 前言: 大二本科计算机科学与技术程序员一枚,总结几篇课后实验内容,希望可以帮助到大家. 软件:Devc++ 实验目的: 通过实验掌握图的基本存储原理,能够利用图模型存储 ...

  4. R语言gganimate包创建可视化gif动图、并使用anim_save函数保存可视化gif动图(gganimate export to gif)

    R语言gganimate包创建可视化gif动图.并使用anim_save函数保存可视化gif动图(gganimate export to gif) 目录

  5. R语言gganimate包创建可视化gif动图、可视化动图:ggplot2可视化静态散点图、gganimate包创建动态散点分面图(facet_wrap)动画基于transition_time函数

    R语言gganimate包创建可视化gif动图.可视化动图:ggplot2可视化静态散点图.gganimate包创建动态散点分面图(facet_wrap)动画基于transition_time函数 目 ...

  6. R语言gganimate包创建可视化gif动图、可视化动图:、gganimate包创建动态线型图动画基于transition_time函数、使用geom_point函数显示动画移动的数据点

    R语言gganimate包创建可视化gif动图.可视化动图:.gganimate包创建动态线型图动画基于transition_time函数.使用geom_point函数显示动画移动的数据点 目录

  7. R语言gganimate包创建可视化gif动图、可视化动图:创建动态散点图动画基于transition_time函数、使用shadow_wake函数配置动画的渐变效果(gradual falloff)

    R语言gganimate包创建可视化gif动图.可视化动图:创建动态散点图动画基于transition_time函数.使用shadow_wake函数配置动画的渐变效果(gradual falloff) ...

  8. R语言gganimate包创建可视化gif动图:gganimate包创建动态线型图动画基于transition_time函数、使用geom_point函数显示动画移动的数据点、并保留线图中的全部数据点

    R语言gganimate包创建可视化gif动图:gganimate包创建动态线型图动画基于transition_time函数.使用geom_point函数显示动画移动的数据点.并保留线图中的全部数据点 ...

  9. R语言gganimate包创建可视化gif动图:ggplot2可视化静态条形图(bar plot)、gganimate包创建动态条形图(bar plot)动画、基于transition_time函数

    R语言gganimate包创建可视化gif动图:ggplot2可视化静态条形图(bar plot).gganimate包创建动态条形图(bar plot)动画.基于transition_time函数 ...

最新文章

  1. 职业生涯第二年回顾(2011.2~2012.2)
  2. [转] SQL的3种连接查询
  3. android ScrollView滚动距离和判断滚动停止状态
  4. AI+云 华为开启智能时代新纪元
  5. python找水仙花数_Python一句代码实现找出所有水仙花数的方法
  6. IntelliJ IDEA for Mac 彻底卸载/彻底删除
  7. Per-FedAvg:联邦个性化元学习
  8. oracle不能插入,oracle – 在过程中截断和插入不能一起工作
  9. Bootstarp4 按钮
  10. 208-实现 Trie (前缀树)
  11. 软件概要设计书写模板
  12. 计算机多媒体简历,[计算机个人简历模板范文]计算机多媒体专业个人简历
  13. 【教育心理学】学习理论流派——行为主义学习理论
  14. Mac系统下Typora配置阿里云图床+上传工具PicGo安装
  15. java json 解析字符串_java-解析JSON字符串的最简单方法
  16. html页面会出现浏览器崩溃,大规模WebGL应用引发浏览器崩溃的几种情况及解决办法...
  17. ue4 无限地图_基于UE4的开放世界地图架构
  18. Q1财报之后,美团继续看未来
  19. SQL 2008 -数据库的创建与管理
  20. 方舟服务器 参数修改器,gg修改器方舟脚本中函数

热门文章

  1. 开好会议的方法 会议达成共识 明确目标,促成共识 单向会议 互动会议 会议讨论,文档先行 会前文档 会中 3D法则讨论 同步会议,跟进代办 举个栗子 企业管理
  2. 实现memset函数
  3. 蓝桥杯刷题之分享或许会迟到,但绝不会缺席
  4. java八进制数转十进制数_Java程序八进制数与十进制相互转换
  5. vue根据接口返回数据状态给按钮动态设置disabled属性
  6. PowerMill宏命令的二次开发利用,优化加工流程,提高生产效率。
  7. Javascript 实现[网红] 时间轮盘
  8. BiliBili-IJKPlayer播放器源码分析(一)
  9. openGauss 的简单查询
  10. Linux Or Ubuntu动态磁盘 挂载(带区卷)Win10 Ubuntu 双系统 ldmtool