C 语言中如何实现图结构?

C语言

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
📙C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。

分割线

文章目录

  • C 语言中如何实现图结构
  • 一、图的基本概念
  • 二、图的表示方法
    • (一)邻接矩阵
    • (二)邻接表
  • 三、图的遍历
    • (一)深度优先搜索(DFS)
    • (二)广度优先搜索(BFS)
  • 四、图的应用
    • (一)网络路由
    • (二)社交网络分析
    • (三)任务调度
    • (四)地图导航
  • 五、总结

分割线


C 语言中如何实现图结构

在 C 语言中,实现图结构是一项重要且具有挑战性的任务。图是一种复杂的数据结构,用于表示对象之间的关系。它由顶点(Vertex)和边(Edge)组成,可以分为有向图和无向图两种类型。

一、图的基本概念

  1. 顶点(Vertex):图中的基本元素,表示一个独立的对象。
  2. 边(Edge):连接两个顶点的线段,表示顶点之间的关系。
  3. 有向图(Directed Graph):边具有方向,从一个顶点指向另一个顶点。
  4. 无向图(Undirected Graph):边没有方向,两个顶点之间的关系是相互的。

二、图的表示方法

在 C 语言中,常见的图表示方法有邻接矩阵(Adjacency Matrix)和邻接表(Adjacency List)。

(一)邻接矩阵

邻接矩阵是一个二维数组,用于表示图中顶点之间的连接关系。如果顶点 i 和顶点 j 之间有边相连,则矩阵中的 [i][j] 元素为 1(或边的权值);否则为 0。

以下是使用邻接矩阵表示无向图的 C 语言示例代码:

#include <stdio.h>
#include <stdlib.h>#define V 5  // 顶点数量// 打印邻接矩阵
void printAdjMatrix(int adjMatrix[V][V]) {for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {printf("%d ", adjMatrix[i][j]);}printf("\n");}
}int main() {int adjMatrix[V][V] = {{0, 1, 0, 1, 0},{1, 0, 1, 0, 1},{0, 1, 0, 1, 0},{1, 0, 1, 0, 1},{0, 1, 0, 1, 0}};printf("邻接矩阵表示的无向图:\n");printAdjMatrix(adjMatrix);return 0;
}

邻接矩阵的优点是直观、简单,判断两个顶点之间是否有边的时间复杂度为 O(1)。但对于稀疏图(边的数量相对较少),会浪费大量的存储空间。

(二)邻接表

邻接表是一种链表数组,每个数组元素是一个链表,链表中存储与该顶点相连的其他顶点。

以下是使用邻接表表示无向图的 C 语言示例代码:

#include <stdio.h>
#include <stdlib.h>// 图的顶点结构体
typedef struct Vertex {int data;struct Vertex* next;
} Vertex;// 创建新的顶点
Vertex* createVertex(int data) {Vertex* newVertex = (Vertex*)malloc(sizeof(Vertex));newVertex->data = data;newVertex->next = NULL;return newVertex;
}// 向邻接表中添加边
void addEdge(Vertex* adjList[], int src, int dest) {Vertex* newNode = createVertex(dest);newNode->next = adjList[src];adjList[src] = newNode;newNode = createVertex(src);newNode->next = adjList[dest];adjList[dest] = newNode;
}// 打印邻接表
void printAdjList(Vertex* adjList[], int V) {for (int i = 0; i < V; i++) {Vertex* temp = adjList[i];printf("顶点 %d: ", i);while (temp) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n");}
}int main() {int V = 5;  // 顶点数量Vertex* adjList[V];for (int i = 0; i < V; i++) {adjList[i] = NULL;}addEdge(adjList, 0, 1);addEdge(adjList, 0, 4);addEdge(adjList, 1, 2);addEdge(adjList, 1, 3);addEdge(adjList, 1, 4);addEdge(adjList, 2, 3);addEdge(adjList, 3, 4);printf("邻接表表示的无向图:\n");printAdjList(adjList, V);return 0;
}

邻接表的优点是节省存储空间,适用于稀疏图。但查找两个顶点之间是否有边的时间复杂度相对较高。

三、图的遍历

图的遍历是指按照一定的顺序访问图中的所有顶点。常见的图遍历算法有深度优先搜索(Depth-First Search,DFS)和广度优先搜索(Breadth-First Search,BFS)。

(一)深度优先搜索(DFS)

深度优先搜索从起始顶点开始,沿着一条路径尽可能深地访问顶点,直到无法继续,然后回溯到上一个未完全探索的顶点,继续探索其他路径。

以下是使用递归方式实现深度优先搜索的 C 语言示例代码:

#include <stdio.h>
#include <stdlib.h>#define V 5  // 顶点数量// 邻接矩阵
int adjMatrix[V][V] = {{0, 1, 0, 1, 0},{1, 0, 1, 0, 1},{0, 1, 0, 1, 0},{1, 0, 1, 0, 1},{0, 1, 0, 1, 0}
};// 用于标记顶点是否已被访问
int visited[V] = {0};// 深度优先搜索递归函数
void DFS(int v) {visited[v] = 1;printf("%d ", v);for (int i = 0; i < V; i++) {if (adjMatrix[v][i] == 1 && visited[i] == 0) {DFS(i);}}
}int main() {printf("深度优先搜索的结果: ");DFS(0);return 0;
}

(二)广度优先搜索(BFS)

广度优先搜索从起始顶点开始,先访问其所有相邻顶点,然后依次访问这些相邻顶点的相邻顶点,依此类推。

以下是使用队列实现广度优先搜索的 C 语言示例代码:

#include <stdio.h>
#include <stdlib.h>#define V 5  // 顶点数量// 邻接矩阵
int adjMatrix[V][V] = {{0, 1, 0, 1, 0},{1, 0, 1, 0, 1},{0, 1, 0, 1, 0},{1, 0, 1, 0, 1},{0, 1, 0, 1, 0}
};// 用于标记顶点是否已被访问
int visited[V] = {0};// 队列结构体
typedef struct Queue {int* items;int front;int rear;
} Queue;// 创建队列
Queue* createQueue(int size) {Queue* queue = (Queue*)malloc(sizeof(Queue));queue->items = (int*)malloc(size * sizeof(int));queue->front = -1;queue->rear = -1;return queue;
}// 判断队列是否为空
int isEmpty(Queue* queue) {return queue->front == -1;
}// 判断队列是否已满
int isFull(Queue* queue, int size) {return (queue->rear + 1) % size == queue->front;
}// 入队
void enqueue(Queue* queue, int item) {if (isFull(queue, V)) {printf("队列已满\n");return;}if (isEmpty(queue)) {queue->front = 0;}queue->rear = (queue->rear + 1) % V;queue->items[queue->rear] = item;
}// 出队
int dequeue(Queue* queue) {int item;if (isEmpty(queue)) {printf("队列为空\n");return -1;}item = queue->items[queue->front];if (queue->front == queue->rear) {queue->front = -1;queue->rear = -1;} else {queue->front = (queue->front + 1) % V;}return item;
}// 广度优先搜索函数
void BFS(int start) {Queue* queue = createQueue(V);visited[start] = 1;printf("%d ", start);enqueue(queue, start);while (!isEmpty(queue)) {int current = dequeue(queue);for (int i = 0; i < V; i++) {if (adjMatrix[current][i] == 1 && visited[i] == 0) {visited[i] = 1;printf("%d ", i);enqueue(queue, i);}}}free(queue->items);free(queue);
}int main() {printf("广度优先搜索的结果: ");BFS(0);return 0;
}

四、图的应用

图在计算机科学中有广泛的应用,以下是一些常见的应用场景:

(一)网络路由

在计算机网络中,图可以用于表示网络拓扑结构,通过图算法找到最优的路由路径。

(二)社交网络分析

分析社交网络中人与人之间的关系,例如找出朋友关系中的社群结构。

(三)任务调度

在操作系统中,安排任务的执行顺序和资源分配。

(四)地图导航

地图可以被看作是一个图,通过图算法找到最短路径或最优路径。

五、总结

在 C 语言中实现图结构需要对图的基本概念有清晰的理解,选择合适的表示方法(邻接矩阵或邻接表),并掌握图的遍历算法(深度优先搜索和广度优先搜索)。根据具体的应用场景和图的特点,选择最优的实现方式和算法,以提高程序的效率和性能。


分割线

🎉相关推荐

  • 📙C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。
  • 🍅博客首页-关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
  • 📙CSDN专栏-C语言修炼
  • 📙技术社区-墨松科技

分割线



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

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

相关文章

[图解]分析模式-01-概述1

1 00:00:01,380 --> 00:00:01,770 好 2 00:00:02,340 --> 00:00:06,440 非常感谢大家能够来上我们 3 00:00:06,450 --> 00:00:07,960 分析模式高阶的课程 4 00:00:09,310 --> 00:00:13,440 这个内容之前在分析设计高阶 5 00:00:13,450 --> 00:00:17,840 也就…

电气常用知识

1、常开、常闭 在不加外力作用下&#xff0c;展示的状态就是常 因此&#xff0c;常开就是在不加外力作用下的 开的状态&#xff0c;也就是断开的状态 常闭就是在不加外力作用下的闭合的状态&#xff0c;也就是闭合的状态 2、单控双控 单控&#xff1a;一个东西只有两种状态…

Ubuntu 修改~/.bashrc终端选择是否使用annconda环境

首先需要明白的是anaconda虽然自带了python&#xff0c;但安装anaconda后并不会覆盖掉你原来的python&#xff08;pip也是一样的&#xff09;&#xff0c;但安装anaconda后它会把自己的bin目录&#xff08;里面有python、pip、conda等命令&#xff09;加到PATH上&#xff0c;而…

宝马退出价格战,19万买不到i3了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 宝马退出价格战 这一消息&#xff0c;源自知名汽车博主孙少军。 7月11日他发文称&#xff0c;“因价格战导致门店亏损严重&#xff0c;宝马7月将会开始降量保价。” 第二天他又做了补充&#xff0c…

FastAPI 学习之路(四十二)利用Docker部署发布

我们之前的部署都是基于本地的部署&#xff0c;我们这次来看下&#xff0c;如何使用docker部署我们的fastapi项目。 编写Dockerfile ①&#xff1a;首先编写一个docker镜像的制作文件Dockerfile FROM python:3.10RUN pip install fastapi uvicorn aiofiles sqlalchemy pytho…

基于蓝牙iBeacon定位技术的商场3D楼层导视软件功能详解与实施效益

在现代商场的繁华与复杂中&#xff0c;寻找目的地往往令人头疼。维小帮3D楼层导视软件以其创新技术&#xff0c;为顾客带来无缝、直观的跨楼层导航体验&#xff0c;让每一次商场消费都成为享受。 商场3D楼层导视软件功能服务 3D多楼层导视地图&#xff0c;商场布局一览无遗 …

Linux进程——进程的概念

文章目录 PCB进程排队进程标识符pid终止进程获取进程id父进程与子进程 我们在上一节内容中有简单谈到进程的感性理解&#xff0c;他在课本上的概念是&#xff0c;程序的一个执行实例或正在执行的程序 但在本质上&#xff0c;他其实就是一个被分配了系统资源&#xff08;CPU&am…

EtherCAT总线耦合器:在欧姆龙SysmacStudio软件里的配置步骤

EtherCAT总线适配器&#xff1a;在欧姆龙SysmacStudio软件里的配置步骤 EtherCAT总线适配器XD7000作为网络接口&#xff0c;连接主控制器&#xff08;如PLC&#xff09;和其他EtherCAT设备&#xff0c;实现实时、高效的数据交换。通过EtherCAT总线耦合器&#xff0c;用户能够将…

类和对象(初)

目录 一、面向过程和面向对象初步认识 二、类的引入 命名规则 三、类的定义 四、访问限定符 五、类的作用域 六、类的实例化 七.类对象模型 一、面向过程和面向对象初步认识 1.C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;…

鸿蒙语言基础类库:【@ohos.data.storage (轻量级存储)】

轻量级存储 轻量级存储为应用提供key-value键值型的文件数据处理能力&#xff0c;支持应用对数据进行轻量级存储及查询。数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据类型包括数字型、字符型、布尔型。 说明&#xff1a; 开发前请熟悉鸿蒙开发…

第一个基于FISCOBCOS的前后端项目(发行转账)(已开源)

本文旨在介绍一个简单的基于fiscobcos的前后端网站应用。Springbootjs前后端不分离。 所使用到的合约也是一个最基本的。首先您需要知道的是完整项目分为三部分&#xff0c;1是区块链平台webase搭建&#xff08;此项目使用节点前置webase-front即可&#xff09;&#xff0c;2是…

游戏AI的创造思路-技术基础-行为树

行为树源自于游戏&#xff0c;但又不单单局限在游戏中&#xff0c;现代的行为树为游戏提供了一套快速简洁的控制NPC/AI的方法。所以本篇来讲讲行为树这个老祖宗~~~~ 目录 1. 行为树的定义 2. 发展历史 2.1. 起源与早期发展 2.2. 关键节点与重要进展 2.3. 当前现状与未来 …

人工智能大模型讲师培训老师叶梓介绍及多模态大模型原理与实践提纲

培训需要解决的问题 通过本次培训&#xff0c;拓展对多模态AI应用领域的视野&#xff0c;帮助团队聚焦AI赋能创新突破&#xff0c;提升对AI服务的技术认知与理解&#xff0c;更好地助力业务智能化业务建设。 培训时长 1天 培训老师介绍 叶梓&#xff0c;工学博士&#xff0…

python零基础爬虫教程,(实战案例手把手教你Python爬虫教程!)

前言 女朋友看了都能学会的爬虫教学 自己断断续续学习练习了两三年python爬虫&#xff0c;从网上看了无数教程&#xff0c;跟大神们学习了各种神奇的操作&#xff0c;现在虽然没成为大神&#xff0c;但是想通过这篇教程来分享自己学习的爬虫实战案例。 通过本教程&#xff0c;你…

Linux程序替换

前言 上一期对进程的创建、终止、以及等待做了详细的介绍&#xff0c;对于进程控制的内容基本介绍的差不多了&#xff0c;本期来介绍进程控制的最后一个内容即进程的程序替换&#xff01; 本期内容介绍 • 什么是进程的程序替换 • 单进程的程序替换 • 程序替换的基本原理 •…

在 IVS 2024 加密盛会上开拓创新:CESS 引领去中心化云存储和 CD²N 之发展

作为基于区块链的去中心化云存储网络和 CDN 基础设施网络&#xff0c;CESS 在日本年度加密创业大会 IVS 2024 上成为焦点&#xff01;此次活动在历史悠久的京都举办&#xff0c;围绕“跨越边界”这一主题&#xff0c;吸引了超过15,000 名参会者&#xff0c;其中包括 3,000 创始…

SpringCloudAlibaba基础五 Nacos配置中心

一 Nacos配置中心介绍 官方文档&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos C…

2024 福州市延安中学“拿云杯”复赛试题

回忆版&#xff08;持续更新&#xff09; 目录 答案 答案

风光摄影:相机设置和镜头选择

写在前面 博文内容为《斯科特凯尔比的风光摄影手册》读书笔记整理涉及在风景拍摄中一些相机设置&#xff0c;镜头选择的建议对小白来讲很实用&#xff0c;避免拍摄一些过曝或者过暗的风景照片理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好…

【matlab】周期性信号分析

目录 信号预处理 周期性特征提取方法 频谱分析 傅里叶变换 快速傅里叶变换&#xff08;FFT&#xff09; 周期图法 Welch法 自相关分析 时频分析 基于模型的方法 时间序列分解 应用实例 提取信号的周期性特征是一个在信号处理领域广泛应用的技术&#xff0c;特别是在…