6.图:多对多的非线性数据结构
一、什么是图图Graph是一种多对多的非线性数据结构它由 ** 节点Vertex和边Edge** 组成节点表示实体如人、地点、设备边表示节点之间的关系如连接、路径、交互。简单来说数组、链表是一对一的线性结构树是一对多的层次结构图是多对多的网状结构任意两个节点之间都可能存在连接。图在实际开发中应用非常广泛社交网络用户是节点关注 / 好友关系是边地图导航地点是节点道路是边计算机网络设备是节点网线 / 无线连接是边推荐系统用户和商品是节点点击 / 购买行为是边路由算法路由器是节点链路是边。二、图的核心分类1. 无向图 vs 有向图无向图边没有方向节点之间双向连通如朋友关系有向图边有方向A→B 不代表 B→A如关注关系。2. 带权图 vs 无权图带权图边上标有数值表示距离、时间、代价等如地图的道路长度无权图边没有数值只表示存在连接如社交网络的好友关系。3. 稀疏图 vs 稠密图稀疏图边数远少于完全图如社交网络大部分人只和少数人互动稠密图边数接近完全图如全连接的路由器网络。4. 连通图 vs 非连通图连通图任意两个节点之间都有路径如一个城市的道路网非连通图存在节点之间没有路径如两个独立的岛屿。三、图的存储方式图的存储主要有两种方式邻接矩阵和邻接表。1. 邻接矩阵用二维数组存储图matrix[i][j] 1表示节点 i 和 j 之间有边0表示没有边。优点判断两个节点是否相连的时间复杂度为O(1)实现简单适合稠密图。缺点空间复杂度为O(n²)当节点数很多时会非常占用空间。代码实现#include stdio.h #include stdlib.h #define MAX_NODES 100 // 邻接矩阵结构体 typedef struct { int matrix[MAX_NODES][MAX_NODES]; // 二维数组存储边 int nodeCount; // 节点总数 } AdjacencyMatrix; // 初始化邻接矩阵 void initMatrix(AdjacencyMatrix* graph, int nodeCount) { graph-nodeCount nodeCount; // 初始化所有边为0无连接 for (int i 0; i nodeCount; i) { for (int j 0; j nodeCount; j) { graph-matrix[i][j] 0; } } } // 添加无向边 void addUndirectedEdge(AdjacencyMatrix* graph, int u, int v) { graph-matrix[u][v] 1; graph-matrix[v][u] 1; } // 添加有向边 void addDirectedEdge(AdjacencyMatrix* graph, int u, int v) { graph-matrix[u][v] 1; } // 打印邻接矩阵 void printMatrix(AdjacencyMatrix* graph) { printf(邻接矩阵\n); for (int i 0; i graph-nodeCount; i) { for (int j 0; j graph-nodeCount; j) { printf(%d , graph-matrix[i][j]); } printf(\n); } }2. 邻接表每个节点存储一个链表只记录它能直接到达的邻居节点。优点空间复杂度为O(ne)适合稀疏图遍历邻居的效率高。缺点判断两个节点是否相连的时间复杂度为O(k)k 是节点的邻居数。代码实现// 邻接表节点结构体 typedef struct AdjNode { int node; // 邻居节点编号 struct AdjNode* next; // 下一个邻居节点 } AdjNode; // 邻接表结构体 typedef struct { AdjNode* head[MAX_NODES]; // 每个节点的链表头 int nodeCount; // 节点总数 } AdjacencyList; // 初始化邻接表 void initList(AdjacencyList* graph, int nodeCount) { graph-nodeCount nodeCount; // 初始化所有链表头为NULL for (int i 0; i nodeCount; i) { graph-head[i] NULL; } } // 添加无向边 void addUndirectedEdgeList(AdjacencyList* graph, int u, int v) { // 添加u→v AdjNode* newNode (AdjNode*)malloc(sizeof(AdjNode)); newNode-node v; newNode-next graph-head[u]; graph-head[u] newNode; // 添加v→u newNode (AdjNode*)malloc(sizeof(AdjNode)); newNode-node u; newNode-next graph-head[v]; graph-head[v] newNode; } // 添加有向边 void addDirectedEdgeList(AdjacencyList* graph, int u, int v) { AdjNode* newNode (AdjNode*)malloc(sizeof(AdjNode)); newNode-node v; newNode-next graph-head[u]; graph-head[u] newNode; } // 打印邻接表 void printList(AdjacencyList* graph) { printf(邻接表\n); for (int i 0; i graph-nodeCount; i) { printf(节点 %d 的邻居, i); AdjNode* p graph-head[i]; while (p ! NULL) { printf(%d , p-node); p p-next; } printf(\n); } }四、图的基本概念1. 度Degree无向图节点的度是它连接的边数有向图入度指向该节点的边数出度从该节点出发的边数。2. 路径节点之间的边组成的序列如 A→B→C。3. 回路环起点和终点相同的路径如 A→B→C→A。4. 简单路径不重复经过任何节点的路径。5. 完全图每对节点之间都有边的图n 个节点的完全图有n*(n-1)/2条边。五、图的遍历方式图的遍历是指访问图中的所有节点且每个节点只访问一次。常见的遍历方式有两种1. 深度优先搜索DFS从起始节点出发尽可能深地访问分支直到无法继续再回溯到上一个节点。代码实现邻接表版// 深度优先搜索 void dfs(AdjacencyList* graph, int start, int* visited) { // 标记当前节点已访问 visited[start] 1; printf(%d , start); // 遍历当前节点的所有邻居 AdjNode* p graph-head[start]; while (p ! NULL) { if (!visited[p-node]) { dfs(graph, p-node, visited); } p p-next; } }2. 广度优先搜索BFS从起始节点出发先访问所有直接邻居再访问邻居的邻居逐层向外扩展。代码实现邻接表版#include stdio.h #include stdlib.h // 广度优先搜索 void bfs(AdjacencyList* graph, int start, int* visited) { // 使用队列存储待访问的节点 int queue[MAX_NODES]; int front 0, rear 0; // 标记起始节点已访问并入队 visited[start] 1; queue[rear] start; while (front rear) { int node queue[front]; printf(%d , node); // 遍历当前节点的所有邻居 AdjNode* p graph-head[node]; while (p ! NULL) { if (!visited[p-node]) { visited[p-node] 1; queue[rear] p-node; } p p-next; } } }六、完整代码示例#include stdio.h #include stdlib.h #define MAX_NODES 100 // 邻接表节点结构体 typedef struct AdjNode { int node; struct AdjNode* next; } AdjNode; // 邻接表结构体 typedef struct { AdjNode* head[MAX_NODES]; int nodeCount; } AdjacencyList; // 初始化邻接表 void initList(AdjacencyList* graph, int nodeCount) { graph-nodeCount nodeCount; for (int i 0; i nodeCount; i) { graph-head[i] NULL; } } // 添加无向边 void addUndirectedEdgeList(AdjacencyList* graph, int u, int v) { AdjNode* newNode (AdjNode*)malloc(sizeof(AdjNode)); newNode-node v; newNode-next graph-head[u]; graph-head[u] newNode; newNode (AdjNode*)malloc(sizeof(AdjNode)); newNode-node u; newNode-next graph-head[v]; graph-head[v] newNode; } // 打印邻接表 void printList(AdjacencyList* graph) { printf(邻接表\n); for (int i 0; i graph-nodeCount; i) { printf(节点 %d 的邻居, i); AdjNode* p graph-head[i]; while (p ! NULL) { printf(%d , p-node); p p-next; } printf(\n); } } // 深度优先搜索 void dfs(AdjacencyList* graph, int start, int* visited) { visited[start] 1; printf(%d , start); AdjNode* p graph-head[start]; while (p ! NULL) { if (!visited[p-node]) { dfs(graph, p-node, visited); } p p-next; } } // 广度优先搜索 void bfs(AdjacencyList* graph, int start, int* visited) { int queue[MAX_NODES]; int front 0, rear 0; visited[start] 1; queue[rear] start; while (front rear) { int node queue[front]; printf(%d , node); AdjNode* p graph-head[node]; while (p ! NULL) { if (!visited[p-node]) { visited[p-node] 1; queue[rear] p-node; } p p-next; } } } // 释放邻接表内存 void freeList(AdjacencyList* graph) { for (int i 0; i graph-nodeCount; i) { AdjNode* p graph-head[i]; while (p ! NULL) { AdjNode* tmp p; p p-next; free(tmp); } } } int main() { AdjacencyList graph; int nodeCount 5; initList(graph, nodeCount); // 添加无向边 addUndirectedEdgeList(graph, 0, 1); addUndirectedEdgeList(graph, 0, 2); addUndirectedEdgeList(graph, 1, 3); addUndirectedEdgeList(graph, 2, 4); // 打印邻接表 printList(graph); // 测试深度优先搜索 int visited[MAX_NODES] {0}; printf(深度优先搜索); dfs(graph, 0, visited); // 输出0 1 3 2 4 printf(\n); // 测试广度优先搜索 for (int i 0; i nodeCount; i) { visited[i] 0; } printf(广度优先搜索); bfs(graph, 0, visited); // 输出0 1 2 3 4 printf(\n); // 释放内存 freeList(graph); printf(内存已释放\n); return 0; }七、图的实际应用场景图在实际开发中应用非常广泛常见场景包括社交网络用户是节点关注 / 好友关系是边用于推荐好友、计算影响力地图导航地点是节点道路是边用于计算最短路径如 Dijkstra 算法计算机网络设备是节点链路是边用于路由选择、故障排查推荐系统用户和商品是节点点击 / 购买行为是边用于协同过滤推荐编译器函数调用关系是图用于优化编译、检测循环依赖人工智能知识图谱是图用于表示实体之间的关系支持推理和问答。八、总结图是一种多对多的非线性数据结构由节点和边组成支持无向 / 有向、带权 / 无权、稀疏 / 稠密等多种形态。图的存储主要有邻接矩阵和邻接表两种方式遍历方式有深度优先搜索DFS和广度优先搜索BFS。在实际开发中图的应用非常广泛是算法和开发中不可或缺的基础数据结构。希望这篇文章能帮助你深入理解图的原理和实现

相关新闻

AI Agent驱动智能习惯养成:从监督到陪伴的产品架构与实现

AI Agent驱动智能习惯养成:从监督到陪伴的产品架构与实现

1. 这篇文章真正要解决的问题 你有没有过这样的经历?年初立下Flag要每天健身、学英语、读书,结果不到一个月就默默放弃。或者,你开发了一个帮助用户养成习惯的小程序,却发现用户活跃度断崖式下跌,根本“催不动”&#…

2026/8/20 15:01:04 阅读更多 →
全新奥迪Q5L定价策略与产品力深度解析:豪华中型SUV市场新格局

全新奥迪Q5L定价策略与产品力深度解析:豪华中型SUV市场新格局

1. 从“39.28万起”看豪华中型SUV市场的定价博弈最近,全新奥迪Q5L的上市价格一公布,就在圈内和潜在车主群里引起了不小的讨论。39.28万元的起售价,这个数字背后,远不止是奥迪官方的一个定价策略那么简单。它更像是一面镜子&#x…

2026/8/20 13:24:15 阅读更多 →
从本田销量数据看汽车行业分析:产品力、市场策略与趋势解读

从本田销量数据看汽车行业分析:产品力、市场策略与趋势解读

1. 从一份销量快报说起:数据背后的行业逻辑又到了月初,各大车企的销量快报开始陆续发布。今天早上,我像往常一样刷着行业新闻,看到了本田中国发布的2018年6月在华终端汽车销量数据。对于咱们这些在汽车行业里摸爬滚打的人来说&…

2026/8/19 12:50:58 阅读更多 →

最新新闻

如何用Python绘制精美地图:Prettymaps开源项目完全指南 [特殊字符]️

如何用Python绘制精美地图:Prettymaps开源项目完全指南 [特殊字符]️

如何用Python绘制精美地图:Prettymaps开源项目完全指南 🗺️ 【免费下载链接】prettymaps Draw pretty maps from OpenStreetMap data! Built with osmnx matplotlib shapely 项目地址: https://gitcode.com/GitHub_Trending/pr/prettymaps 你是…

2026/8/20 15:39:41 阅读更多 →
抖音评论采集5分钟搞定:一键导出全量评论区到Excel的完整指南

抖音评论采集5分钟搞定:一键导出全量评论区到Excel的完整指南

抖音评论采集5分钟搞定:一键导出全量评论区到Excel的完整指南 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper TikTokCommentScraper 是一款免费开源的抖音评论采集工具,能在几分钟内…

2026/8/20 15:39:41 阅读更多 →
2026年答辩PPT生成用哪款?4款工具清单实测

2026年答辩PPT生成用哪款?4款工具清单实测

论文定稿只是第一步,答辩PPT才是压垮很多人的最后一根稻草。排版、提炼重点、梳理逻辑,一晚上全搞定几乎不可能,好在现在有专门的答辩PPT生成工具能接手这部分工作。这篇就基于实际测试,把市面上四款主流工具的真实表现摊开来说。…

2026/8/20 15:39:41 阅读更多 →
Prettymaps性能优化终极指南:7个技巧快速减少数据获取时间

Prettymaps性能优化终极指南:7个技巧快速减少数据获取时间

Prettymaps性能优化终极指南:7个技巧快速减少数据获取时间 【免费下载链接】prettymaps Draw pretty maps from OpenStreetMap data! Built with osmnx matplotlib shapely 项目地址: https://gitcode.com/GitHub_Trending/pr/prettymaps Prettymaps是一个基…

2026/8/20 15:39:41 阅读更多 →
TrollInstallerX 安装教程:iOS 14.0–16.6.1 一键装好 TrollStore 的完整指南(附避坑速查表)

TrollInstallerX 安装教程:iOS 14.0–16.6.1 一键装好 TrollStore 的完整指南(附避坑速查表)

TrollInstallerX 安装教程:iOS 14.0–16.6.1 一键装好 TrollStore 的完整指南(附避坑速查表) 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstalle…

2026/8/20 15:39:41 阅读更多 →
玩转 tmux-power 状态栏:日期与时间格式(strftime)自定义详解

玩转 tmux-power 状态栏:日期与时间格式(strftime)自定义详解

玩转 tmux-power 状态栏:日期与时间格式(strftime)自定义详解 【免费下载链接】tmux-power 🎨 Tmux powerline theme 项目地址: https://gitcode.com/gh_mirrors/tm/tmux-power tmux-power 是一款基于 Powerline 风格的高颜…

2026/8/20 15:38:40 阅读更多 →

日新闻

Framework笔记本BIOS更新变砖,“可维修”承诺遭遇芯片级维修考验!

Framework笔记本BIOS更新变砖,“可维修”承诺遭遇芯片级维修考验!

Framework笔记本BIOS更新引“变砖”危机2026年7月7日,Framework向用户quantum5发送邮件,建议其安装BIOS 3.20更新。然而,更新后电脑出现严重问题,屏幕显示三角形和随机像素图案,风扇狂转,系统完全挂起。qua…

2026/8/20 0:00:46 阅读更多 →
2026还在担忧建站平台哪家好?手把手带你搭建自家网站!

2026还在担忧建站平台哪家好?手把手带你搭建自家网站!

2026还在担忧建站平台哪家好?手把手带你搭建自家网站!据艾瑞咨询发布的《2026年中国企业数字化服务市场研究报告》,2025年国内网站建设市场规模已达896亿元,同比增长18.7%。中国互联网络信息中心数据显示,截至2025年底…

2026/8/20 0:00:46 阅读更多 →
2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?

2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?

2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?据艾瑞咨询《2026年中国企业数字化服务市场研究报告》,2025年国内网站建设市场规模已达896亿元,其中高端定制网站服务占比突破42%。更值得关注的是,91%的规模以上企业…

2026/8/20 0:00:46 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/19 11:55:18 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 9:46:27 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/19 7:42:22 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/19 11:55:13 阅读更多 →