C数据结构——无向图(邻接矩阵方式) 创建与基本使用

源码+注释

//
// Created by Lenovo on 2022-05-13-上午 9:06.
// 作者:小象
// 版本:1.0
//#include <stdio.h>
#include <malloc.h>#define MAXSIZE 1000 // BFS队列可能达到的最大长度
#define MAX_AMVNUMS 100 // 最大顶点数typedef enum {FALSE,TRUE
} Boolean;typedef struct { // 定义队列int *base; // 存储空间的基地址int front; // 头指针int rear; // 尾指针
} SqQueue;typedef struct { // 定义图char verxs[MAX_AMVNUMS]; // 顶点表int arcs[MAX_AMVNUMS][MAX_AMVNUMS]; // 邻接矩阵int numVertexes, numEdges; // 图的当前顶点数和边数
} AMGraph;Boolean visited[MAX_AMVNUMS]; // 访问标志数组,其初值为"false"void CreateAMGraph(AMGraph *G); // 用邻接矩阵表示法创建无向图
void PrintAMatrix(AMGraph G); // 打印邻接矩阵
void DFSTraverse(AMGraph G, int v); // 非连通图 深度优先搜索遍历
void DFS_AM(AMGraph G, int v); // 邻接矩阵 深度优先搜索遍历(连通图)
void BFSTraverse(AMGraph G, int v); // 非连通图 广度优先搜索遍历
void BFS_AM(AMGraph G, int v); // 邻接矩阵 广度优先搜索遍历(连通图)
Boolean InitQueue(SqQueue *queue); // BFS队列初始化
Boolean EnQueue(SqQueue *queue, int elem); // BFS队列入队列
Boolean DeQueue(SqQueue *queue, int *elem); // 循环队列出队列
Boolean IsFull(SqQueue *queue); // 判队满
Boolean IsEmpty(SqQueue *queue); // 判队空/*** <h2>无向图的创建和遍历(无向网同理)</h2>* <h3>无向图邻接矩阵特点: <br>* 1.边值对称 <br>* 2.若有相邻点,一定在矩阵同一行里</h3>* @return 0*/
int main() {AMGraph *G;G = (AMGraph *) malloc(sizeof(AMGraph)); // 为图G生成内存空间CreateAMGraph(G); // 创建PrintAMatrix(*G); // 打印DFSTraverse(*G, 1); // 深度遍历printf("\n");BFSTraverse(*G, 3); // 广度搜索getchar();
}// 使用邻接矩阵表示法,创建无向图
void CreateAMGraph(AMGraph *G) {// 输入总顶点数和边数printf("输入无向图的顶点数和边数,用空格分开:");scanf("%d %d", &(G->numVertexes), &(G->numEdges));getchar();// 依次输入顶点的信息for (int i = 0; i < G->numVertexes; i++) {
/*        printf("输入第%d个顶点信息:", (i + 1));scanf("%c", &G->verxs[i]);getchar();*/G->verxs[i] = i;}// 初始化邻接矩阵for (int i = 0; i < G->numVertexes; i++) {for (int j = 0; j < G->numVertexes; j++) {G->arcs[i][j] = 0;}}// 构造邻接矩阵
//    int sub1, sub2;int arrSub1[] = {0, 0, 1, 1, 2, 2, 3, 4, 5};int arrSub2[] = {1, 2, 3, 4, 5, 6, 7, 7, 6};for (int i = 0; i < G->numEdges; i++) {
/*        printf("请输入第%d条边(v1,v2)上的下标i和下标j:", (i + 1)); // 输入一条边依附的顶点scanf("%d %d", &sub1, &sub2); // 确定v1和v2在G中的位置,即顶点数组的下标getchar();*/G->arcs[arrSub1[i]][arrSub2[i]] = G->arcs[arrSub2[i]][arrSub1[i]] = 1; // 边 <v1, v2>的顶点值为 1// 因为无向图是对称边,所以边<v2, v1>的顶点值也为 1}
}// 打印邻接矩阵
void PrintAMatrix(AMGraph G) {for (int i = 0; i < G.numVertexes; i++) {for (int j = 0; j < G.numVertexes; j++) {printf("%d ", G.arcs[i][j]);}printf("\n");}
}// 对非连通图G做 深度优先遍历
void DFSTraverse(AMGraph G, int v) {// 注意:对于以下所有循环次数解析,最多有numVertexes顶点个连通图,所以循环numVertexes次就足够保证整个非连通图都被遍历到for (int i = 0; i < G.numVertexes; i++) {visited[i] = FALSE; // 访问标志数组初始化}for (int i = 0; i < G.numVertexes; i++) { // 循环调用遍历连通图的算法函数if (!visited[i]) {DFS_AM(G, v); // 对尚未访问的顶点调用DFS_AM()}}
}// 图G为邻接矩阵类型,从第v个顶点出发 深度优先搜索遍历 图G
void DFS_AM(AMGraph G, int v) {printf("V%d ", v);visited[v] = TRUE; // 访问第v个顶点,并置访问标志数组相应分量值为truefor (int i = 0; i < G.numVertexes; i++) { // 依次检查邻接矩阵 v 所在的行// G.arcs[v][i]!=0 表示i是v的邻接点。如果i未访问,则递归调用DFS_AMif ((G.arcs[v][i] != 0) && (!visited[i])) {DFS_AM(G, i); // 相邻点放入,递归遍历}}
}// 对非连通图G做 广度优先遍历
void BFSTraverse(AMGraph G, int v) {// 注意:对于以下所有循环次数解析,最多有numVertexes顶点个连通图,所以循环numVertexes次就足够保证整个非连通图都被遍历到for (int i = 0; i < G.numVertexes; i++) {visited[i] = FALSE; // 访问标志数组初始化}for (int i = 0; i < G.numVertexes; i++) { // 循环调用遍历连通图的算法函数if (!visited[i]) {BFS_AM(G, v); // 对尚未访问的顶点调用BFS_AM()}}
}// 图G为邻接矩阵类型,从第v个顶点出发 广度优先搜索遍历 图G
void BFS_AM(AMGraph G, int v) {printf("V%d ", v);visited[v] = TRUE; // 访问第v个顶点,并置访问标志数组相应分量值为 trueSqQueue queue;InitQueue(&queue); // 辅助队列queue初始化,置空EnQueue(&queue, v); // v 进队int u;while (!IsEmpty(&queue)) {DeQueue(&queue, &u); // 队头元素出队并置为 ufor (int i = 0; i < G.numVertexes; i++) { // 依次检查邻接矩阵 u 所在的行// G.arcs[u][i]!=0 表示i是u的邻接点。如果i未访问,则递归调用BFS_AMif ((G.arcs[u][i] != 0) && (!visited[i])) {printf("V%d ", i);visited[i] = TRUE; // 访问第i个顶点,并置访问标志数组相应分量值为trueEnQueue(&queue, i);  // i 进队}}}
}// 构造一个空队列 queue
Boolean InitQueue(SqQueue *queue) {queue->base = (int *) malloc(sizeof(int) * MAXSIZE); // 为队列分配一个最大容量为 MAXSIZE 的数组空间if (!(queue->base)) {return FALSE; // 存储分配失败}queue->front = queue->rear = 0; // 头指针和尾指针置为0 , 队列为空return TRUE;
}// 插入元素 elem 为 queue 的新的队尾元素
Boolean EnQueue(SqQueue *queue, int elem) {if (IsFull(queue)) {return FALSE;}queue->base[queue->rear] = elem; // 新元素插入队尾queue->rear = (queue->rear + 1) % MAXSIZE; // 队尾指针加 1return TRUE;
}// 删除 queue 的队头元素,用 elem 返回其值
Boolean DeQueue(SqQueue *queue, int *elem) {if (IsEmpty(queue)) {return FALSE;}*elem = queue->base[queue->front]; // 保存队头元素queue->front = (queue->front + 1) % MAXSIZE; // 队头指针加 1return TRUE;
}// 尾指针在循环意义上加1 后等于头指针,表明队满
Boolean IsFull(SqQueue *queue) {return (queue->rear + 1) % MAXSIZE == queue->front; // 循环
}// 队空
Boolean IsEmpty(SqQueue *queue) {return queue->front == queue->rear;
}

运行结果

在这里插入图片描述

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

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

相关文章

电脑剪辑视频的软件有哪些?试试这几种视频剪辑工具

视频剪辑可以帮助人们在不同情境下更好地理解和消化视频内容。通过剪辑&#xff0c;可以去除不必要的素材并突出重点&#xff0c;使观看者能够更快地获取信息&#xff0c;并且更容易保持注意力的集中。此外&#xff0c;剪辑可以提高视频质量&#xff0c;例如通过添加音乐、图形…

CVPR2023新作:源数据集对迁移学习性能的影响以及相应的解决方案

Title: A Data-Based Perspective on Transfer Learning (迁移学习的基于数据的观点) Affiliation: MIT (麻省理工学院) Authors: Saachi Jain, Hadi Salman, Alaa Khaddaj, Eric Wong, Sung Min Park, Aleksander Mądry Keywords: transfer learning, source dataset, dow…

Git分布式版本控制工具和GitHub(二)--Git指令入门

一.指令入门前的准备 1.Git全局设置 2.获取Git仓库 例如&#xff1a;将我GitHub上的first_resp仓库克隆到本地。 点击进入first_rep&#xff0c;后面本地仓库操作的学习就是在这个界面右键打开Git Bash 3.工作区&#xff0c;暂存区&#xff0c;版本库概念 注&#xff1a;如果空…

Reinforcement-Learning

文章目录 Reinforcement-Learning1. RL方法分类汇总&#xff1a;2. Q-Learning3. SARSA算法4. SARSA&#xff08;λ&#xff09; Reinforcement-Learning 1. RL方法分类汇总&#xff1a; &#xff08;1&#xff09;不理解环境&#xff08;Model-Free RL&#xff09;&#xff…

【【51单片机的红外遥控】】

红外遥控&#xff0c;完全把控 红外遥控 利用红外光进行通信的设备&#xff0c;由红外LED将调制后的信号发出&#xff0c;再由专门的红外接收头进行解调输出 通信方式&#xff1a;单工 异步 红外LED波长&#xff1a;940nm 通信协议标准&#xff1a;NEC标准 用那种一体化红红外…

【MySQL】模具数据转移处理

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

SQL注入之布尔盲注

SQL注入之布尔盲注 一、布尔盲注介绍二、布尔盲注的特性三、布尔盲注流程3.1、确定注入点3.2、判断数据库的版本3.3、判断数据库的长度3.4、猜解当前数据库名称&#xff08;本步骤需要重复&#xff09;3.5、猜解数据表的数量3.6、猜解第一个数据表名称的长度3.7、猜解第一个数据…

初识Java - 概念与准备

本笔记参考自&#xff1a; 《On Java 中文版》 目录 写在第一行 Java的迭代与发展 Java的迭代 Java的参考文档 对象的概念 抽象 接口 访问权限 复用实现 继承 基类和子类 A是B和A像B 多态 单根层次结构 集合 参数化类型 对象的创建和生命周期 写在第一行 作为一…

从SQL注入绕过最新安全狗WAF中学习fuzz

前言 SQL注入并不是很精通&#xff0c;通过实战绕过WAF来进行加强SQL注入能力&#xff0c;希望对正在学习的师傅能有一丝帮助。 安装 安装前言 我是本地搭建的环境进行测试的 环境是windows11phpstudy2018sqli-labs phpstudy的安装我不再复述&#xff0c;这里简单说一下安全…

PDF文件忘记密码,怎么办?

PDF文件设置密码分为打开密码和限制密码&#xff0c;忘记了密码分别如何解密PDF密码&#xff1f; 如果是限制编辑密码忘记了&#xff0c;我们可以试着将PDF文件转换成其他格式来避开限制编辑&#xff0c;然后重新将文件转换回PDF格式就可以了。 如果因为转换之后导致文件格式…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块, 文件路径拼接,目录操作

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…

Day03-作业(AxiosElementUI)

作业1&#xff1a; 根据需求完成如下页面数据列表展示 需求&#xff1a;Vue挂载完成后,通过axios发送异步请求到服务端,获取学生列表数据,并通过Vue展示在页面上 获取数据url&#xff1a;http://yapi.smart-xwork.cn/mock/169327/student 素材&#xff1a; <!DOCTYPE html…

springboot2实现图片文件上传与mysql存储路径并回显

环境介绍 技术栈 springbootmybatismysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis 2.3.1 springboot是基于spring 4.0&#xff0c;springboot2是基于spring5.0,springboot2由pivotal公司在2018发布,这个框架主要用来…

螺旋矩阵 II——力扣59

文章目录 题目描述法一 模拟 题目描述 法一 模拟 初始化一个二维向量&#xff0c;名为matrix&#xff0c;它有n行和n列。向量的每个元素都是一个整数&#xff0c;初始化为0。初始化二维向量的语法如下&#xff1a;vector<vector<int>> matrix(n, vector<int>…

WPS本地镜像化在线文档操作以及样例

一个客户项目有引进在线文档操作需求&#xff0c;让我这边做一个demo调研下&#xff0c;给我的对接文档里有相关方法的说明&#xff0c;照着对接即可。但在真正对接过程中还是踩过不少坑&#xff0c;这儿对之前的对接工作做个记录。 按照习惯先来一个效果&#xff1a; Demo下载…

【phaser微信抖音小游戏开发002】hello world!

执行效果&#xff1a; 将以下代码文本内容&#xff0c;放入到game.js中即可。目录结构如下图 import ./js/libs/weapp-adapter import ./js/libs/symbolGameGlobal.window.scrollTo () > { };//防止真机出错 import Phaser from ./js/phaser//引入Phaservar {windowWidth, …

vue项目环境 搭建

1、安装nodejs 2、安装vue-cli, npm i -g vue/cli-init 3、初始化项目 vue init webpack test 4、运行 cd test npm run dev

无人机影像配准并发布(共线方程)

无人机影像 DEM 计算四个角点坐标&#xff08;刚性变换&#xff09; 像空间坐标&#xff08;x,y,-f&#xff09; 像空间坐标畸变纠正 deltax,deltay 已知(x,y)&#xff0c;求解(X,Y, Z)或者(Lat,Lon) 这里的Z是DEM上获取的坐标和Zs为相机坐标的高程&#xff0c;如果均为已…

应用无线鼠标中的2.4GHz无线收发芯片

无线键盘和无线鼠标作为现代办公环境中常见的工具&#xff0c;为我们的工作带来了便利。无线键盘和无线鼠标的工作原理都是基于无线技术实现的&#xff0c;其中常见的是2.4GHz无线技术。让我们一起来详细了解一下它们的工作原理。 无线鼠标的原理非常简单,鼠标部分工作与传统鼠…

html富文本编辑器

接了个单子&#xff0c;需要添加一个文章模块&#xff0c;一看用到的技术这么老&#xff0c;人傻了&#xff0c;纯html css js 。 在普通页面中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…