图的邻接矩阵是用两个数组来表示图
一个一维数组vexs[MAXVER];用来存储顶点元素
一个二维数组arc[MAXVER][MAXVER];用来存储图的边或者弧度以及证明其存在

无向图的的二维数组 主对角元素不存在 二维数组呈现对称分布
因为边是双向的。

有向图的二维数组 主对角元素也是不存在 不呈现对称分布

arc[i][j]=w i=j时 arc为0 存在边是为w 边不存在时定义为无穷∞ 意味大于所有权值的值 也就是一个极限值

图的定义

#include<iostream>
#include <iomanip>
using namespace std;typedef char vertextype;//顶点类型
typedef int edgetype;//边缘权值
typedef int Status;
#define MAXVER 25//最大顶点数
#define INF 65535//代表无穷
#define NULL 0//定义一个图结构
typedef struct Graph
{vertextype vexs[MAXVER];//保存顶点元素edgetype arc[MAXVER][MAXVER];//保存边界的权值int numver, numedg;//顶点数目 边界数目
}MGhaph;//输入图  其实就是给顶点表和边输入数据的过程

图的构造

Status CreatGhaph(MGhaph &G)
{int i, j, k, w;cout << "Please enter the number of verticesof the graph : "<< endl;cin >> G.numver;cout << "Please enter the number of edges the graph : " << endl;cin >> G.numedg;for (i = 0; i < G.numver; i++){cout <<"Please enter the NO."<<i+1<<"%d name of vex : " << endl;cin >> G.vexs[i];}cout << "Diagonal infinity ..."<< endl;for (i = 0; i < G.numver; i++)for (j = 0; j < G.numver; j++){G.arc[i][j] = INF;//简单图  不循环//cout << G.arc[i][j] << endl;//不理解为啥是1}cout << "...Diagonal infinity" << endl;for (int k = 0; k < G.numedg; k++){//因为具体哪条边存在不一定 所以选择性输入边cout << "Enter the subscripts and weights from vertex vi to vertex vj : " << endl;cin >> i>>j>>w;/*cout << "Please enter the subscript j of the edge : " << endl;cin >> j;cout << "Please enter the weight from vertex "<<i<<" to vertex "<<j<<" : " << endl;cin >> w;*/G.arc[i][j] = w;G.arc[j][i] = G.arc[i][j];//无向图  边的信息  是对称的  //有向图的话 无需设置}return 0;
}

有向图相较于无向图 它的每一个权值都要分别定义

输出图

Status DispGraph(MGhaph &G)
{int i, j, k, w;//输出顶点元素for (i = 0; i < G.numver; i++){cout << i + 1 << " : " << G.vexs[i] << endl;}//输出边界权值for (i = 0; i < G.numver; i++){for (j = 0; j < G.numver; j++){if (G.arc[i][j] == INF){cout.flags(ios::left);//设置对齐方式cout << setw(6) << "∞";}else{cout.flags(ios::left);cout << setw(6) << G.arc[i][j];}}cout << endl;}return 0;
}

代码实现
所有部分

#include<iostream>
#include <iomanip>
using namespace std;typedef char vertextype;//顶点类型
typedef int edgetype;//边缘权值
typedef int Status;
#define MAXVER 25//最大顶点数
#define INF 65535//代表无穷
#define NULL 0//定义一个图结构
typedef struct Graph
{vertextype vexs[MAXVER];//保存顶点元素edgetype arc[MAXVER][MAXVER];//保存边界的权值int numver, numedg;//顶点数目 边界数目
}MGhaph;//输入图  其实就是给顶点表和边输入数据的过程//例子 无向图的构造
Status CreatGhaph(MGhaph &G)
{int i, j, k, w;cout << "Please enter the number of verticesof the graph : "<< endl;cin >> G.numver;cout << "Please enter the number of edges the graph : " << endl;cin >> G.numedg;for (i = 0; i < G.numver; i++){cout <<"Please enter the NO."<<i+1<<"%d name of vex : " << endl;cin >> G.vexs[i];}cout << "Diagonal infinity ..."<< endl;for (i = 0; i < G.numver; i++)for (j = 0; j < G.numver; j++){G.arc[i][j] = INF;//简单图  不循环//cout << G.arc[i][j] << endl;//不理解为啥是1}cout << "...Diagonal infinity" << endl;for (int k = 0; k < G.numedg; k++){//因为具体哪条边存在不一定 所以选择性输入边cout << "Enter the subscripts and weights from vertex vi to vertex vj : " << endl;cin >> i>>j>>w;/*cout << "Please enter the subscript j of the edge : " << endl;cin >> j;cout << "Please enter the weight from vertex "<<i<<" to vertex "<<j<<" : " << endl;cin >> w;*/G.arc[i][j] = w;G.arc[j][i] = G.arc[i][j];//无向图  边的信息  是对称的  //有向图的话 无需设置}return 0;
}//输出图
Status DispGraph(MGhaph &G)
{int i, j, k, w;//输出顶点元素for (i = 0; i < G.numver; i++){cout << i + 1 << " : " << G.vexs[i] << endl;}//输出边界权值for (i = 0; i < G.numver; i++){for (j = 0; j < G.numver; j++){if (G.arc[i][j] == INF){cout.flags(ios::left);cout << setw(6) << "∞";}else{cout.flags(ios::left);cout << setw(6) << G.arc[i][j];}}cout << endl;}return 0;
}
//若图存在顶点u  返回图的顶点u的位置
Status LocateVex(MGhaph &G)
{int i, j;vertextype vex;cout << "Please enter a vertex"<< endl;cin >> vex;for (i = 0; i < G.numver; i++){if (G.vexs[i] == vex){j = i;}else{continue;}}return j;
}
//将图的顶点替换  略//销毁图
Status DelGraph(MGhaph &G)
{for (int i = 0; i < G.numver; i++){free((void *)G.vexs[i]);}free(G.arc);for (int i = 0; i < G.numver; i++)for (int j = 0; j < G.numver; j++){free((void *)G.arc[i][j]);}free(G.arc);return 0;
}//返回顶点V的邻接顶点  若没有则返回为空
Status FirstVex(MGhaph &G)
{int i, j;vertextype vex,fis;cout << "Please enter a vertex" << endl;cin >> vex;for (i = 0; i < G.numver; i++){if (G.vexs[i] == vex){for (j = 0; j < G.numver; j++){if (G.arc[i][j]!=INF){//如果存在cout << G.vexs[j] << endl;}/*if (G.arc[j][i]!=INF){//有向图 加这一步cout << G.vexs[j]<<endl;}*/}}}return 0;
}//新增顶点
Status ADDVex(MGhaph &G)
{vertextype vex;int k, w, edg_num, v;if (G.numver >= MAXVER){//静态的  一旦确定不能扩大cout << "Graph memory is full and cannot be expanded ";return NULL;}else{cout << "Please enter a new vertex :" << endl;cin >> vex;G.numver++;G.vexs[G.numver - 1] = vex;cout << "Please enter the number of new edges" << endl;//新增边的数目cin >> edg_num;G.numedg = G.numedg + edg_num;for (int j = 0; j < G.numver; j++){G.arc[j][G.numver-1]=G.arc[G.numver-1][j] = INF;//简单图  不循环//cout << G.arc[i][j] << endl;}for (k = 0; k < edg_num; k++){cout << "Enter the weights : " << endl;cin >> w;cout << "Enter the vertex of the edge" << endl;cin >> v;G.arc[v][G.numver - 1] = w;G.arc[G.numver - 1][v] = G.arc[v][G.numver - 1];}}return 0;
}
//删除相关顶点和弧   偷个懒 //增加弧//删除弧
int main()
{MGhaph G;CreatGhaph(G);DispGraph(G);cout << LocateVex(G) << endl;FirstVex(G);ADDVex(G);DispGraph(G);DelGraph(G);DispGraph(G);return 0;
}

数据结构——图的邻接矩阵实现相关推荐

  1. C语言 数据结构 图的邻接矩阵存储 基本操作(附输入样例和讲解)

    代码参照了严蔚敏.吴伟民编写的数据结构(C语言版). 部分内容参考了这位大佬: https://blog.csdn.net/jeffleo/article/details/53326648 所有代码采 ...

  2. c语言邻接表的构建_c语言数据结构--图的邻接矩阵和邻接表操作的基本操作

    #include #include #include #define MAX 100 typedef char DataType; typedef int VectorRelationType; ty ...

  3. 数据结构——图的定义和实现

    这里写目录标题 图的定义 各种图的定义 无向边 有向边 图的顶点与边的关系 连通图生成树 图的各种实现 在引入邻接矩阵之前先介绍一下图的相关概念(概念比前树啥的面稍微复杂一点) 图的定义 之前学了线性 ...

  4. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1...

    import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...

  5. 数据结构之图(二)——邻接矩阵

    图的逻辑结构为多对多,图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,即数组表示法(邻接矩阵).图的链式存储结构可以用多重链表来描述,如邻接表,邻接多重表以及十字链表等. 邻接矩阵 数组(邻 ...

  6. 数据结构 图的邻接表和邻接矩阵实现———c语言

    图的邻接矩阵实现 逻辑结构分为两部分:V和E集合.因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵.邻接矩阵又分为有向图邻接矩阵和无向图 ...

  7. 数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法

    目录 算法描述 算法预期效果 重难点 思路 个人解法 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An, ...

  8. 数据结构--图(Graph)详解(二)

    数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...

  9. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

最新文章

  1. HTML全局属性data-
  2. IDBA-UD:组装非均匀覆盖度的宏基因组和单细胞数据
  3. Plant Com:中科院遗传发育所白洋组开发定量检测宿主微生物组的HA-QAP技术(王二涛点评)...
  4. 以太坊 智能合约 简介
  5. 算法 --- [map的使用]求最大和谐子序列
  6. python量化数据处理小细节2
  7. 简单的解释,让你秒懂“最优化” 问题
  8. 收藏 | OpenCV新手入门预处理
  9. Mybatis 逆向工程使用姿势不对文档全被清空,一怒之下写了个插件……
  10. 虚拟机上的linux里安装ngnix,虚拟机(linux)下安装nginx的步骤教程
  11. kettle的hello world
  12. pypdf2 存储pdf_PyPDF2:用于PDF文件操作的Python库
  13. 优酷路由宝文件服务器,优酷路由宝L1刷breed加刷高恪路由,最新可用包含工具及所有文件2019年10月13...
  14. OverFeat论文解析
  15. 新手小白也看得懂的电脑win10安装教程
  16. 一分钟了解QPS TPS RPS
  17. 量子计算机 液体核磁共振,用液体核磁共振实现量子计算
  18. 前端清除缓存的集中方法
  19. 手机怎么解决同ip多账号_游戏工作室如何实现手游多开多窗口多IP
  20. uniapp canvas绘图生成海报

热门文章

  1. Android Drawable图标生成工具
  2. 【每日早报】2019/08/08
  3. 融合知识图谱的电影推荐_算法与交互界面的实现
  4. Threejs实现模拟河流,水面水流,水管水流,海面
  5. Pivotal中国研发中心总经理冯雷受邀参加2017金融证券行业大数据高峰论坛
  6. ASP.NET Form Authentication - Membership Authentication
  7. 2021icpc亚洲赛区沈阳站总结
  8. ClickOnce 通过URL传递参数
  9. 单工、半双工及全双工之间的区别
  10. ChatGPT所代表的人工智能的意义