数据结构图代码

图抽象数据类型

ADT Graph
{数据对象:D={ai | 1<=i<=n, n>=0, ai为ElemType类型;}数据关系:R = {<ai,aj> | ai,aj属于D, 1 <= i,j <= n, 其中每个元素可以有零个或多个前驱元素,可以有0个或多个后继元素; }基本运算:CreateGraph(&g):创建图DestroyGraph(&g):销毁图DispGraph(g):输出图DFS(g,v):从v出发的深度优先遍历图gBFS(g,v): 从v出发的广度优先遍历图g
}

 邻接矩阵存储

//邻接矩阵
#define MAXV 105
#define INF 32767typedef int InfoType;
typedef struct
{int no;InfoType info;
}VertexType;
typedef struct
{int edges[MAXV][MAXV]; //起点 终点int n, e; //总顶点数 总边数VertexType vexs[MAXV]; //顶点信息数组
}MatGraph;

邻接表存储

//邻接表
typedef struct ANode
{int adjvex;  //边的邻接点编号struct ANode* nextarc; //指向下一条边的指针int weight;  //边信息
}ArcNode;  //边结点 -- 存该点邻接点编号 指向下一边的指针 边的信息
typedef struct VNode
{InfoType info; //顶点信息ArcNode* firstarc; //指向表的第一个边结点
}VNode; //头结点类型 -- 存信息 指向第一个记录的边
typedef struct
{VNode adjlist[MAXV]; //头结点的数组int n, e; //总顶点数,边数
}AdjGraph;  // -- 头结点数组 点数 边数

由矩阵创建图

void CreateAdj(AdjGraph*& G, int A[MAXV][MAXV], int n, int e)
{int i, j;ArcNode* p; //用于建立结点G = (AdjGraph*)malloc(sizeof(AdjGraph));for (i = 0; i < n; i++)G->adjlist[i].firstarc = NULL; //初始化for (i = 0; i < n; i++)for (j = n - 1; j >= 0; j--)if (A[i][j] != 0 && A[i][j] != INF){p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->weight = A[i][j];//链表头插法p->nextarc = G->adjlist[i].firstarc;G->adjlist->firstarc = p;}G->n = n; G->e = e;
}

输出图

void DispAdj(AdjGraph* G)
{int i;ArcNode* p; //用于建立结点for (i = 0; i < G->n; i++){p = G->adjlist[i].firstarc; //第一个的边结点cout << i << ":";while (p != NULL){cout << p->adjvex << "[" << p->weight << "] -> ";  //遍历链p = p->nextarc;}cout << endl;}
}

销毁图

void DestroyAdj(AdjGraph*& G)
{int i;ArcNode* pre, * p;for (int i = 0; i < G->n; i++){pre = G->adjlist[i].firstarc; //pre也freeif (pre != NULL){p = pre->nextarc; //p往下保存结点while (p != NULL){free(pre); //先free掉prepre = p;p = p->nextarc;}free(pre);}}free(G);
}

邻接矩阵转邻接表

void MatToList(MatGraph g, AdjGraph*& G)
{int i, j;ArcNode* p;G = (AdjGraph*)malloc(sizeof(AdjGraph));for (i = 0; i < g.n; i++)G->adjlist[i].firstarc = NULL; //置初值for (i = 0; i < g.n; i++)for (j = g.n - 1; j >= 0; j--)if (g.edges[i][j] != 0 && g.edges[i][j] != INF){p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->weight = g.edges[i][j];p->nextarc = G->adjlist[i].firstarc;G->adjlist[i].firstarc = p;}G->n = g.n; G->e = g.e;
}

邻接表转邻接矩阵

void ListToMat(AdjGraph* G, MatGraph& g)
{int i;ArcNode* p;for (int i = 0; i < G->n; i++){p = G->adjlist[i].firstarc;while (p != NULL){g.edges[i][p->adjvex] = p->weight;p = p->nextarc;}}g.n = G->n; g.e = G->e;
}

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

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

相关文章

WIN10系统自带硬盘测速工具使用

前段时间在捣腾电脑硬盘这一块&#xff0c;因为现在固态硬盘价格比较低了&#xff0c;所以想换一下&#xff0c;给自己的电脑升个级。现在硬盘有多种接口&#xff0c;常见的就是SATA&#xff0c;mSATA&#xff0c;m.2, NVME&#xff0c;PCIE。这里PCIE的接口是直连的&#xff0…

C语言--每日选择题--Day31

第一题 1. 下面程序 i 的值为&#xff08;&#xff09; int main() {int i 10;int j 0;if (j 0)i; elsei--; return 0; } A&#xff1a;11 B&#xff1a;9 答案及解析 B if语句中的条件判断为赋值语句的时候&#xff0c;因为赋值语句的返回值是右操作数&#xff1b; …

机器学习模型验证——以数据为中心的方法

构建机器学习模型时&#xff0c;人们往往将激情和精力集中于收集数据和训练模型&#xff0c;对测试模型和验证结果往往缺少应有的关注。正确的验证技术有助于估计无偏见的广义模型的性能&#xff0c;并更好地理解模型训练的效果。您需要确保机器学习模型经过准确的训练&#xf…

EUREKA: HUMAN-LEVEL REWARD DESIGN VIACODING LARGE LANGUAGE MODELS

目录 一、论文速读 1.1 摘要 1.2 论文概要总结 相关工作 主要贡献 论文主要方法 实验数据 未来研究方向 二、论文精度 2.1 论文试图解决什么问题&#xff1f; 2.2 论文中提到的解决方案之关键是什么&#xff1f; 2.3 用于定量评估的数据集是什么&#xff1f;代码有…

2023.11.28 使用tensorflow进行“三好“权重分析

2023.11.28 使用tensorflow进行"三好"权重分析 这是最基础的一个神经网络问题。许久没有再使用&#xff0c;用来做恢复训练比较好。 x1w1 x2w2 x3*w3 y&#xff0c;已知x1,x2,x3和y&#xff0c;求w1,w2,w3 这是一个三元一次方程&#xff0c;正常需要三组数据就能…

软件工程--需求工程--学习笔记(超详细)

软件需求工程是软件开发周期的第一个阶段&#xff0c;也是关系到软件开发成败最关键阶段&#xff0c;本章讲解需求的基础知识和需求工程的关键活动。这些知识对于结构化方法、面向对象方法、面向服务方法等都是适用的 本文参考教材&#xff1a;沈备军老师的《软件工程原理》 目…

js提取iconfont项目的图标

iconfont 可以让我们轻松使用字体图标&#xff0c;比如使用 iconfont 提供的 js&#xff0c;就可以愉快的码代码了。 //at.alicdn.com/t/c/font_xxxxx.js通常公司会有提供一套图标供所有系统使用&#xff0c;比如图标库里有 1000 个图标&#xff0c;但某个项目只需要使用 10 个…

系列十九、Spring实例化bean的方式

一、概述 所谓实例化bean&#xff0c;大白话讲就是Spring如何把这一个个的普通的Java对象创建为Spring bean的。 二、方式 Spring中实例化bean常用的有以下四种&#xff0c;即&#xff1a; ① 构造器方式&#xff1b; ② 静态工厂方式&#xff1b; ③ 实例工厂方式&#xff1b;…

关于mybatis插入返回主键id和SpringBoot事务注解自调用演示

文章目录 一. 插入返回任意规则主键ID二. SpringBoot自调用事务2.1 场景12.2 场景2 自调用结论总结 一. 插入返回任意规则主键ID 实体对象 TableName("bank") Data public class Entity {TableId("id")Integer id;TableField("money")Integer …

超详细!Opencv人脸识别!附源码!

一、新建环境 注意&#xff01;&#xff01;确定后需要关闭项目&#xff0c;重新打开&#xff0c;终端的环境才会变化&#xff01;&#xff01; 二、下载安装包&#xff08;只需要3个即可&#xff09; 1. 下载dlib包 pip install dlib-19.19.0-cp38-cp38-win_amd64.whl.whl …

GoLang语言Map用法

目录 Map 的内部结构 Map 的操作 1. 创建和初始化 2. 添加键值对 3. 获取值 4. 删除键值对 5. 遍历 map 6. 检查键是否存在 注意事项 在Go语言中&#xff0c;map 是一种无序的键值对集合&#xff0c;其中每个键必须是唯一的。以下是关于 map 内部结构和操作的详细解释…

Linux 如何在文件中查找指定内容,grep的用法

Linux 如何在文件中查找指定内容 1、 如我们 查找 log_file_catalina.out 文件中&#xff0c;包含 ‘总数&#xff1a;900’ 的字符内容 2、 在日志中查看 83910_law_21CFBC7EB25B1FF60255FE7F4BE1BCCF1CE726F6_0.bdyhf 的相关内容 grep 83910_law_21CFBC7EB25B1FF60255FE7…

互联网协议入门( 通俗易懂的网络协议层次结构讲解)

转载&#xff1a;互联网协议入门&#xff08; 通俗易懂的网络协议层次结构讲解&#xff09;-CSDN博客 我们每天使用互联网&#xff0c;你是否想过&#xff0c;它是如何实现的&#xff1f; 全世界几十亿台电脑&#xff0c;连接在一起&#xff0c;两两通信。上海的某一块网卡送…

人工智能概论

一、关键技术 人工智能包含了七项关键技术: 1. 机器学习: 机器学习是研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能&#xff0c;是人工智能技术的核心。 从学习模式划分&#xff0c;分…

浅谈java中的锁

根据标准锁的分类 偏向锁 / 轻量级锁 / 重量级锁&#xff1b;可重入锁 / 非可重入锁&#xff1b;共享锁 / 独占锁&#xff1b;公平锁 / 非公平锁&#xff1b;悲观锁 / 乐观锁&#xff1b;自旋锁 / 非自旋锁&#xff1b;可中断锁 / 不可中断锁。 偏向锁 / 轻量级锁 / 重量级锁…

【管理运筹学】背诵手册(六)| 图与网络分析(最大流问题,最小费用最大流问题)

六、图与网络分析 最大流问题 最大流问题的数学规划模型为&#xff1a; max ⁡ v f 12 f 13 { f 12 f 13 − f 57 − f 67 0 f 13 f 23 f 34 f 35 . . . 0 ≤ f i j ≤ c i j \max vf_{12}f_{13}\\ \begin{cases} f_{12}f_{13}-f_{57}-f_{67}0 \\ f_{13}f_{23}f_{34}f…

虚拟数据生成_以Python为工具

生成虚拟数据_以Python为工具 生成虚拟数据技术在现实生活中具有多个重要的应用领域。它为数据隐私保护、机器学习算法开发、数据处理和可视化等方面提供了实用且有价值的解决方案。尤其是能满足定制化需求的虚拟数据&#xff0c;在预期的方向上让数据定向随机。 &#x1f339…

原生GPT本地及云端部署方式保姆级教程

前提条件 部署必须要有一个超过1年的Github账号 本地服务部署 运行效果 部署方法 下载安装包 暂时无法在飞书文档外展示此内容 GitHub授权登录&#xff1a; https://dash.pandoranext.com/ 登录后是这个样子&#xff1a; 复制下面红框里面这个License Id 编辑Config.js…

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级 在之前的开发过程中&#xff0c;需要实现卡片轮播效果&#xff0c;但是卡片轮播需要中间大、两边小一些的效果&#xff0c;这里就使用到了Swiper。具体效果如视频所示 添加链接描述 这里需要的效果是中间大、两边…

面试问题--Linux网络编程

Linux网络编程涉及在Linux操作系统上使用套接字&#xff08;socket&#xff09;等工具进行网络通信。以下是一些与Linux网络编程相关的主题&#xff1a; 套接字编程&#xff1a; 在Linux中&#xff0c;套接字是网络编程的基础。可以使用C语言中的socket库来创建套接字。套接字…