【数据结构】图基本概念

在计算机科学中,图(Graph)是一种非常重要的数据结构,用于描述各种复杂的关系和网络。本文将介绍图的基本概念,并通过C语言代码演示如何实现基本的图结构和相关操作。

图的基本概念:

图由节点(Vertex)和边(Edge)组成。节点表示图中的对象,边表示节点之间的关系。图可以分为有向图和无向图,区别在于边是否有方向性。

  1. 顶点(Vertex): 图中的节点,也称为顶点。每个顶点可能携带有关信息,如标签或权重。
  2. 边(Edge): 两个顶点之间的连接。如果边是有向的,则有一个起始顶点和一个终止顶点。如果是无向的,则两个顶点之间没有方向。
  3. 路径(Path): 由顶点和边构成的序列,表示从一个顶点到另一个顶点的连续路径。
  4. 环(Cycle): 如果路径的起点和终点是同一个顶点,则称该路径为环。

图的表示方法:

图可以用不同的方式表示,最常见的两种是邻接矩阵和邻接表。

  1. 邻接矩阵(Adjacency Matrix): 使用二维数组来表示图中的节点和边的关系。如果顶点 i 和顶点 j 之间有边相连,则矩阵中 (i, j) 和 (j, i) 的位置为 1,否则为 0。

  2. 邻接表(Adjacency List): 使用链表数组来表示图中的节点和边的关系。每个顶点都有一个链表,存储与其相连的所有顶点。

下面我们通过C语言来实现一个简单的邻接表表示的无向图,并实现一些基本操作:

#include <stdio.h>
#include <stdlib.h>// 定义图的最大顶点数
#define MAX_VERTICES 100// 定义邻接表节点
typedef struct Node {int vertex;struct Node* next;
} Node;// 定义图结构
typedef struct Graph {int numVertices;Node* adjList[MAX_VERTICES];
} Graph;// 初始化图
Graph* createGraph(int numVertices) {Graph* graph = (Graph*)malloc(sizeof(Graph));graph->numVertices = numVertices;for (int i = 0; i < numVertices; i++) {graph->adjList[i] = NULL;}return graph;
}// 添加边
void addEdge(Graph* graph, int src, int dest) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->vertex = dest;newNode->next = graph->adjList[src];graph->adjList[src] = newNode;newNode = (Node*)malloc(sizeof(Node));newNode->vertex = src;newNode->next = graph->adjList[dest];graph->adjList[dest] = newNode;
}// 打印图的邻接表
void printGraph(Graph* graph) {for (int v = 0; v < graph->numVertices; v++) {Node* temp = graph->adjList[v];printf("顶点 %d 的邻接表:", v);while (temp) {printf(" -> %d", temp->vertex);temp = temp->next;}printf("\n");}
}int main() {Graph* graph = createGraph(5);addEdge(graph, 0, 1);addEdge(graph, 0, 2);addEdge(graph, 1, 2);addEdge(graph, 1, 3);addEdge(graph, 2, 3);addEdge(graph, 3, 4);printGraph(graph);return 0;
}

在上述代码中,我们首先定义了一个结构体 Node 来表示邻接表中的节点,然后定义了一个 Graph 结构体来表示图。接着,我们实现了 createGraph 函数用于创建图,addEdge 函数用于添加边,以及 printGraph 函数用于打印图的邻接表。

通过上述C语言代码的实现,我们可以更深入地理解图这种数据结构的基本概念和表示方法,以及如何在程序中实现图的基本操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用react-vant上传图片遇到的问题

使用react-vant Uploader上传图片后出现的问题。 先试用upload上传图片。 <Form.Itemrules{[{ required: true, message: 请上传头像 }]}label上传头像namefiles><Uploader accept* maxCount"1" onChange{imgFile} /></Form.Item> 图片上传成功后…

高频SQL 判断三角形

题目信息 表&#xff1a;Triangle ------------------- | Column Name | Type | ------------------- | x | int | | y | int | | z | int | ------------------- 在 SQL 中&#xff0c;(x, y, z)是该表的主键列。 该表的每一行包含三个线段…

Linux网络-DNS域名解析服务

目录 一.DNS相关介绍 1.DNS是什么 2.DNS系统的分布式数据结构 根域 顶级域 二级域 子域 主机 3.服务器类型 主域名服务器 从域名服务器 缓存域名服务器 转发域名服务器 二.DNS域名解析 1.DNS域名解析方式及功能 2.DNS域名解析查询方式 2.1.递归查询&#xff0…

OpenWRT设置自动获取IP,作为二级路由器

前言 上一期咱们讲了在OpenWRT设置PPPoE拨号的教程&#xff0c;在光猫桥接的模式下&#xff0c;OpenWRT如果不设置PPPoE拨号&#xff0c;就无法正常上网。 OpenWRT设置PPPoE拨号教程 但现在很多新装的宽带&#xff0c;宽带师傅为了方便都会把光猫设置为路由模式。如果你再外…

微软在汉诺威工业博览会上推出新制造业Copilot人工智能功能,强化Dynamics 365工具集

在近日于德国汉诺威举行的盛大工业博览会上&#xff0c;微软向全球展示了其最新推出的制造业人工智能功能&#xff0c;这些功能以Dynamics 365工具集为核心&#xff0c;旨在通过先进的AI技术为制造业带来前所未有的变革。 此次推出的新功能中&#xff0c;最为亮眼的是支持AI的…

数据可视化(四):Pandas技术的高级操作案例,豆瓣电影数据也能轻松分析!

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Dubbo的核心功能及其在实际项目中的应用

Dubbo不仅简化了微服务架构的开发和部署&#xff0c;还提供了诸多核心功能&#xff0c;帮助开发团队提升服务治理的能力和系统的可扩展性。下面&#xff0c;我将详细介绍Dubbo的核心功能&#xff0c;并结合实际项目经验&#xff0c;举例说明这些功能是如何在项目中发挥作用的。…

Blueprints - 鼠标光标判断相关节点

一些以前的学习笔记归档&#xff1b; 俯视角场景中要用鼠标光标判断是否点中物体&#xff0c;或依靠光标引发各种事件&#xff1b; 这些逻辑一般编写在Controller中&#xff0c;Controller类本身就带有相关判断节点&#xff1a; 其中Get Hit Result Under Cursor by Channel是…

如何批量跟踪京东物流信息

随着电商行业的快速发展&#xff0c;快递业务日益繁忙&#xff0c;无论是商家还是消费者&#xff0c;都需要一种高效、便捷的快递查询工具。快递批量查询高手软件应运而生&#xff0c;以其强大的功能和便捷的操作体验&#xff0c;赢得了广大电商、微商精英们的青睐。 快递批量…

用Bash变量进行sed替换

问题&#xff1a; 我试图在一个 Bash 脚本中使用 sed 改变文本文件中的值&#xff1a; sed s/draw($old_num;n_)/draw($new_num;n_)/g file.txt > tmp这行代码将在 for 循环中。为什么它不起作用&#xff1f; 回答&#xff1a; 当使用 Bash 变量进行 sed 替换时&#xff…

Golang编译优化——公共子表达式消除

文章目录 一、概述二、公共子表达式消除2.1 初始划分等价值2.2 细分等价值2.2.1 给所有值标号2.2.2 根据参数细分等价值 2.3 替换重复表达式2.3 .1 按照支配性排序2.3 .2 进行替换操作 一、概述 公共子表达式消除&#xff08;Common Subexpression Elimination&#xff0c;CSE…

机器人视觉教学实训平台

一&#xff1a;功能概述 1.1、功能简介 机器人视觉教学实训平台基于睿尔曼机器人与海康机器视觉产品&#xff0c;面向机器人视觉系统应用而开发设计&#xff0c;产品涵盖机器人系统、工业视觉系统、自动化控制系统、计算机编程系统&#xff0c;可以在一台设备上进行多种与机器…

冷热不均?试试智慧供热二网平衡解决方案吧!

一、系统背景&#xff1a; 在城市供热系统中&#xff0c;目前普遍存在热力平衡调节困难、过量供热及供热不足并存、系统灵活性不足、管理粗放、智能化水平不高、无法根据实际天气变化及具体需求灵活调节等问题。供水管和回水管之间的温差过大&#xff0c;导致热能在循环过程中…

Confluence 快捷键大揭秘:提高效率的小窍门

使用 Confluence 快捷键的好处有&#xff1a; 1.提高工作效率&#xff1b; 2.更流畅地进行编辑、导航和管理操作&#xff1b; 3.减少误操作&#xff1b; 4.展现专业水平。 更多精彩内容&#xff1a; 成为 Jira 大师&#xff1a;效率达人的必备秘诀 Jira Cloud 项目管理专栏 PMO…

centos7.9下安装SVN服务

一、安装subversion yum install -y subversion #安装svn mkdir -p /data/svnrepos/java #自定义svn仓库位置/data/svnrepos&#xff0c;自定义一个项目叫svn&#xff08;这里新建目录&#xff09; svnadmin create /data/svnrepos/java #创建一…

Linux:进程创建 进程终止

Linux&#xff1a;进程创建 & 进程终止 进程创建fork写时拷贝 进程终止退出码strerrorerrno 异常信号exit 进程创建 fork fork函数可以用于在程序内部创建子进程&#xff0c;其包含在头文件<unistd.h>中&#xff0c;直接调用fork()就可以创建子进程了。 示例代码&…

个人博客系统的设计与实现

https://download.csdn.net/download/liuhaikang/89222885http://点击下载源码和论文 本 科 毕 业 设 计&#xff08;论文&#xff09; 题 目&#xff1a;个人博客系统的设计与实现 专题题目&#xff1a; 本 科 毕 业 设 计&#xff08;论文&#xff09;任 务 书 题 …

算法-动态规划专题

文章目录 前言 : 动态规划简述1 . 斐波那契模型1.1 泰波那契数列1.2 最小花费爬楼梯1.3 解码方法 前言 : 动态规划简述 动态规划在当前我们的理解下,其实就是一种变相的递归,我们查看一些资料也可以知道,动态规划其实属于递归的一个分支,通过把递归问题开辟的栈帧通过一定的手…

1002 - 编程求解1+2+3+...+n

题目描述 编程求解下列式子的值&#xff1a; S123 \dots nS123⋯n。 输入 输入一行&#xff0c;只有一个整数 n(1 \le n \le 1000)n(1≤n≤1000) 。 输出 输出只有一行&#xff08;这意味着末尾有一个回车符号&#xff09;&#xff0c;包括 11 个整数。 样例 输入 100 …

“亚马逊依赖”之下,傲基科技的品牌势能如何提升?

受益于出口政策红利、低人工成本、完善的供应链以及成熟的生产工艺优势&#xff0c;近年来我国家具出口行业迅速发展。 数据显示&#xff0c;我国家具出口规模1995年仅为11.06亿美元&#xff0c;至2023年增至641.96亿美元。随着出口规模持续扩大&#xff0c;相关企业积极走入公…