数据结构之图(C语言)

图的概念

图是由节点(也称为顶点)和边(也称为边缘)组成的非线性数据结构。节点是图的基本单元,边则用于连接节点之间的关系。图可以用于许多不同的应用程序,包括社交网络、网络拓扑、地图和生物学。

在图中,节点和边可以具有不同的属性。例如,一个社交网络图可能具有节点属性表示用户的姓名和年龄,边属性可能表示用户之间的关系,如朋友或家庭关系。图可以是有向或无向的,也可以是加权或未加权的。有向图具有指向边的方向,而无向图则没有。加权图则对边进行加权,这些权重可以表示距离、成本或其他数据。

图的定义:图G由顶点集V和边集E组成,G = (V,E);

有向图与无向图

如果给图的每条边规定一个方向,那么该图称为有向图。在有向图中,从一个顶点出发的边数称为该点的出度,而指向一个顶点的边数称为该点的入度。相反,边没有方向的图称为无向图。

在有向图中,边指向的结点是唯一的,而无向图的边所连接的结点相互连通;

有权图与无权图

如果图中的边都有各自的权重,则称该图为有权图。反之,如果图中的边无权重(各边的权重相同),则该图为无权图;

图的存储

常用的存储方式有两种:邻接矩阵和邻接表。得分

邻接矩阵:

图的邻接矩阵是一个二维矩阵,矩阵的行和列分别对应图中的顶点。如果两个顶点之间有边,则矩阵中对应的元素为1;否则为0。对于无向图来说,邻接矩阵是对称的。而对于有向图来说,邻接矩阵则不一定对称。因此邻接矩阵的表示相当的直观,而且对于查找某一条边是否存在、权重多少非常快。但其比较浪费空间,对稠密图来说,会比较适合。

代码实现步骤:

1、构建图的基本元素与图的初始化

#define Maxcount 100

struct Node{        //图
	int Nv; //顶点数
	int Ne; //边数
	int data[Maxcount];  //顶点数据
	int wight[Maxcount][Maxcount];  //边的权重
};


struct Nodes //边
{
	int V1, V2; //边所连接的顶点
	int wight;  //边的权重
};


void initialize(struct Node *graph ,int Vexcount)  //初始化图
{
	graph->Nv = Vexcount;   //顶点数
	graph->Ne = 0;         //边数置零
	for (int i = 0; i <= Vexcount; i++) 
	{
		for (int j = 0; j <= Vexcount; j++)
		{
			graph->wight[i][j] = 0;  //初始化每条边的比重
		}
	}
}

2、插入边的权重

void insertedge(struct Node* graph, struct Nodes* edge) //插入边的权重(无向图)
{
	graph->wight[edge->V1][edge->V2] = edge->wight;
	graph->wight[edge->V2][edge->V1] = edge->wight;
}

3、主函数

int main()
{
	printf("邻接矩阵实现图!\n");
	int count;
	printf("图的顶点数:");
	scanf_s("%d/n", &count);
	struct Node* graph = (struct Node*)malloc(sizeof(struct Node)); 
	initialize(graph, count);
	int edgecoun
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值