数据结构图之定义与遍历

我是自动化专业的应届研究生,最终拿到了tplink、华为、vivo等公司的ssp的offer,分享自己学习过的计算机基础知识(C语言+操作系统+计算机网络+linux)以及数据结构与算法的相关知识,保证看完让你有所成长。
欢迎关注我,学习资料免费分享给你哦!还有其他超多学习资源,都是我自己学习过的,经过过滤之后的资源,免去你还在因为拥有大量资源不知如何入手的纠结,让你体系化学习。
在这里插入图片描述

图的概念

图就是有一些顶点,顶点之间有一些边,这样就构成了一个图。所以对于图这种数据结构,关键点就是顶点和边,就是描述顶点和边的关系。然后对于边呢,对于某些问题来说,还可能有权重,以城市之间的航班为例,各个城市就是顶点,航线就是边,不同的航线票价不同,这个票价就是权重,所以根据边有无权重,分为有权图和无权图。根据边是否是单方向,就是顶点A和B之间有一条边,如果只能沿着这条边单方向的从A到B或者从B到A,而不是既可以从A到B也可以从B到A的,这种图就是有向图。

无向图:

在这里插入图片描述

有向图:
在这里插入图片描述

有权图:

在这里插入图片描述

在一个无向图中,如果任意的两个顶点,都可以找到一个路径,让他俩连通,那么这个图就是连通图。否则就不是。

连通图:任意两个节点之间都可以找到通路

在这里插入图片描述

非连通图:ABCD任意一个顶点都不能找到到达E和F的通路。但是ABCD是一个连通图。

在这里插入图片描述

图的邻接矩阵的实现

所谓邻接矩阵就是用二维矩阵(就是二维数组)来表示顶点之间的关系。二维矩阵是一个方阵,大小就是顶点数*顶点数,如果顶点i和顶点j之间有一条边,如果是无向图则,G[i][j]=1,G[j][i]=1。如果是有向图,假设只是从i指向j那么G[i][j]=1。对于有权图,那么这个矩阵的值就是权值,然后两个顶点之间没有边,可以让G[i][j]等于一个权值永远不会相等的数来表示没有边。

代码如下

typedef struct EdgeNode //边的定义,方便为图插入边,如果是有权图,添加一个权重变量即可
{
   
	int begin; 
	int end;
}* Edge;
#define MAX_NV 11 //定义图的最大顶点数目,当然也可以使用动态数组生成一个二维数组
typedef struct Graph //如果是有权图,添加一个权重变量即可
{
   
	int Nv;//顶点数
	int Ne;//边数
	int G[11][11];//边的关系,两个顶点i和j之间有边,则置1
}* Graph;
Graph creatGraph(int Nv,int Ne)//输入顶点数和边数,创建一个图,返回图的指针。
{
   
	Graph graph;
	int i,j;
	graph=(Graph)malloc(sizeof(struct Graph));
	if(graph==NULL)
	{
   
		printf("内存不足\n");
		return NULL;
	}
	graph->Ne=Ne;
	graph->Nv=Nv;
	for(i=0;i<graph->Nv;i++)//全部初始化为没有边
	{
   
		for(j=0;j<graph->Nv;j++)
		{
   
			graph->G[i][j]=0;
		}
	}
	return graph;
}
void insert(Graph graph,Edge e)//插入边,这里是无权图&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值