当前位置: 首页 > news >正文

图的表示法以及实现

一、图的表示

1.邻接矩阵

邻接指的是将所有元素用表相邻的连接起来,而矩阵是指用一个二维数组存储边的关系

2.邻接表

正常邻接表每个节点上记录出度链表的首地址,为了方便查找入度出现了逆邻接表,每个节点记录入度链表的首地址

3.十字链表

每个节点既要记录出度首地址,也要记录入度首地址

4.邻接多重表

当存储无向表时,会重复记录边的关系,邻接多重表就是为了解决这种情况出现的

5.边集数组

二,代码实现

1.邻接矩阵实现图

a.头文件

//
// Created by 27893 on 2025/7/20.
//#ifndef MATRIXGRAPH_H
#define MATRIXGRAPH_H#define MaxNodeNum 20//矩阵最大容量#define INF 1E5//顶点结构
typedef struct {int no;const char*show;
}MatrixVertex;
//边的结构
typedef int MatrixEdge;//邻接矩阵表示图结构
typedef struct {MatrixVertex vex[MaxNodeNum];MatrixEdge edges[MaxNodeNum][MaxNodeNum];int nodeNum;int edgeNum;int directed;
}MGraph;void initMGragh(MGraph*graph,const char*names[],int num,int directed,int edgeValue);void addMGraph(MGraph*graph,int x,int y,int w);
#endif //MATRIXGRAPH_H

b.将接口实现 

//
// Created by 27893 on 2025/7/20.
//#include "MatrixGraph.h"
#include <stdio.h>
#include <string.h>;
static int isEdge(int weight) {if (weight>0&&weight<INF) {return 1;}return 0;
}void initMGragh(MGraph *graph, const char*names[], int num, int directed, int edgeValue) {graph->nodeNum=num;graph->directed=directed;graph->edgeNum=0;memset(graph->vex,0,sizeof(graph->vex));memset(graph->edges,0,sizeof(graph->edges));for (int i=0;i<num;++i) {graph->vex[i].no=i;graph->vex[i].show=names[i];for (int j=0;j<num;j++) {graph->edges[i][j]=edgeValue;}}
}void addMGraph(MGraph*graph,int x,int y,int w) {//判断传入的x,y是否合法if (x<0||x>graph->nodeNum) {return;}if (y<0||y>graph->nodeNum) {return;}if (!isEdge(graph->edges[x][y])) {graph->edges[x][y]=w;if (graph->directed==0) {graph->edges[y][x]=w;}graph->edgeNum++;}
}

http://www.dtcms.com/a/289199.html

相关文章:

  • 【人工智能99问】长短期记忆网络(LSTM)的结构和原理是什么?(12/99)
  • ROS_INFO_STREAM, 模拟cout流输出机制的ROS输出接口
  • 《棒球知识科普》NBA、MLB选秀状元·棒球1号位
  • Everything介绍
  • 《杜甫传》读书笔记与经典摘要(一)
  • 事务的传播行为,分别在spring和mysql中讲解
  • PyTorch模型Ensemble实现
  • 14.多播与广播
  • Vue3.6 无虚拟DOM模式
  • 基于本机如何建立一个vue项目
  • Linux主机 ->多机器登录
  • Openlayers 面试题及答案180道(121-140)
  • Chapter 3 Design of Switching Power Regulators
  • 两个数据表的故事:第 1 部分
  • MacBook的ARM架构(M芯片)操作虚拟机的docker拉取镜像问题
  • 深入浅出理解动态规划
  • 【Lua】大G表
  • C++STL之stack和queue
  • C++string类简介
  • MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案
  • 解锁Phpenv:轻松搭建PHP集成环境指南
  • C++运算符重载
  • 【智能协同云图库】第一期:用户管理接口设计与功能实现
  • 08_Opencv_基本图形绘制
  • Java SpringBoot 对接FreeSwitch
  • 【图像处理基石】什么是畸变校正?
  • AG32:解锁MCU+FPGA应用新姿势,功能与实战全解析
  • JavaScript 语言基础详解
  • 金融大前端中的 AI 应用:智能投资顾问与风险评估
  • SSE和WebSocket区别到底是什么