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

本文介绍了图的基本概念,包括有向图与无向图,并详细阐述了邻接矩阵的存储结构。通过C语言实现了一个创建图及统计图中每个顶点入度、出度和度数的函数。示例代码展示了如何创建和操作邻接矩阵,为后续的深度优先搜索和广度优先搜索奠定了基础。
摘要由CSDN通过智能技术生成


图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。
图的应用极为广泛,已渗入到诸如语言学、逻辑学、物理、化学、电讯、计算机科学以及数学的其它分支。
一个图(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,如果有更好的思路,请批评指正!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值