图的结构定义

图是由一个顶点集 V 和一个弧集 E构成的数据结构。

Graph = (V , E )

其中,E = {<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为弧尾,w 为弧头。谓词 P(v,w) 定义了弧 <v,w>的意义或信息。

由顶点集和边集构成的图称作无向图。

如果”弧”是有方向的,则称由顶点集和弧集构成的图为有向图。

邻接矩阵

定义:矩阵的元素为

有向图的邻接矩阵为非对称矩阵, 而无向图的邻接矩阵为对称矩阵;

//无向图的邻接矩阵
const int MAX_VERTS = 20;
//顶点
template <typename Type>
class Vertex
{
public:Vertex(const Type &_node = Type()): node(_node) {}private:Type node;
};
//图
template <typename Type>
class Graph
{
public:Graph();~Graph();void addVertex(const Type &vertex);void addEdge(int start, int end);void printMatrix();private:Vertex<Type>* vertexList[MAX_VERTS];int nVerts;int adjMatrix[MAX_VERTS][MAX_VERTS];
};
template <typename Type>
Graph<Type>::Graph():nVerts(0)
{for (int i = 0; i < MAX_VERTS; ++i)for (int j = 0; j < MAX_VERTS; ++j)adjMatrix[i][j] = 0;
}
template <typename Type>
Graph<Type>::~Graph()
{for (int i = 0; i < nVerts; ++i)delete vertexList[i];
}
template <typename Type>
void Graph<Type>::addVertex(const Type &vertex)
{vertexList[nVerts ++] = new Vertex<Type>(vertex);
}
template <typename Type>
void Graph<Type>::addEdge(int start, int end)
{//无向图adjMatrix[start][end] = 1;adjMatrix[end][start] = 1;
}
template <typename Type>
void Graph<Type>::printMatrix()
{for (int i = 0; i < nVerts; ++i){for (int j = 0; j < nVerts; ++j)cout << adjMatrix[i][j] << ' ';cout << endl;}
}
//测试代码
int main()
{Graph<char> g;g.addVertex('A');   //0g.addVertex('B');   //1g.addVertex('C');   //2g.addVertex('D');   //3g.addVertex('E');   //4g.addEdge(0, 1);    //A-Bg.addEdge(0, 3);    //A-Dg.addEdge(1, 0);    //B-Ag.addEdge(1, 4);    //B-Eg.addEdge(2, 4);    //C-Eg.addEdge(3, 0);    //D-Ag.addEdge(3, 4);    //D-Eg.addEdge(4, 1);    //E-Bg.addEdge(4, 2);    //E-Cg.addEdge(4, 3);    //E-Dg.printMatrix();return 0;
}

邻接表

注意:在有向图的邻接表中不易找到指向该顶点的弧。

//无向图的邻接表
template <typename Type>
class Graph
{
public:Graph(int _size = 10);~Graph();void addVertex(const Type &vertex);void addEdge(int start, int end);void printVertex();void printAdjList();private:Type *vertexList;list<int> *headNode;int size;int nVertex;
};
template <typename Type>
Graph<Type>::Graph(int _size):size(_size), nVertex(0)
{vertexList = new Type[size];headNode = new list<int>[size];
}
template <typename Type>
Graph<Type>::~Graph()
{delete []vertexList;delete []headNode;
}
template <typename Type>
void Graph<Type>::addVertex(const Type &vertex)
{vertexList[nVertex ++] = vertex;
}
template <typename Type>
void Graph<Type>::addEdge(int start, int end)
{headNode[start].push_back(end);
}
template <typename Type>
void Graph<Type>::printVertex()
{cout << vertexList[0];for (int i = 1; i < nVertex; ++i)cout << ' ' << vertexList[i];cout << endl;
}
template <typename Type>
void Graph<Type>::printAdjList()
{for (int i = 0; i < nVertex; ++i){cout << i;for (list<int>::iterator iter = headNode[i].begin();iter != headNode[i].end();++iter)cout << " -> " << *iter;cout << endl;}
}
//测试代码
int main()
{Graph<char> g;g.addVertex('A');   //0g.addVertex('B');   //1g.addVertex('C');   //2g.addVertex('D');   //3g.addVertex('E');   //4g.printVertex();g.addEdge(0, 1);    //A-Bg.addEdge(0, 3);    //A-Dg.addEdge(1, 0);    //B-Ag.addEdge(1, 4);    //B-Eg.addEdge(2, 4);    //C-Eg.addEdge(3, 0);    //D-Ag.addEdge(3, 4);    //D-Eg.addEdge(4, 1);    //E-Bg.addEdge(4, 2);    //E-Cg.addEdge(4, 3);    //E-Dg.printAdjList();return 0;
}

数据结构基础(20) --图的存储结构相关推荐

  1. 【数据结构基础】图的存储结构

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  2. 数据结构基本概念——图的存储结构和遍历算法

    1图的存储方式 邻接矩阵和邻接表 1.邻接矩阵: 表示顶点之间相邻关系的矩阵. 设G=(V,E)是具有n个顶点的图,顶点序号依次为0,1,-,n-1,则表示G的邻接矩阵是具有如下定义的n阶方阵A: A ...

  3. 【数据结构基础】图的遍历方法与应用

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  4. 20.0、C语言数据结构——图的存储结构

    20.0.C语言数据结构--图的存储结构 图的存储结构相比较线性表与树来说就复杂很多了: 1. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放:树结构是一对多的关系,所以我 ...

  5. 数据结构——图:极大小连通子图、图的存储结构、图的遍历

    图的基本概念: 极大连通子图就是连通分量. 极大连通子图与连通分量在无向图(undirected graph)这个前提下是等同的概念. 极小连通子图: 减去任何一条边就不再连通. 不管树还是二叉树:n ...

  6. 数据结构基础:图结构的学习笔记

    1.图的定义 图是比树更加复杂的数据结构,在图的结构当中,任意两个节点之间都有可能有直接关系,所以图中一个节点的前驱和后继的数目是没有限制的. 2.图的用途 用于描述各种复杂的数据对象,在自然科学.社 ...

  7. 数据结构——图(存储结构)

    数据结构--图 图的定义和基本术语 图的类型定义 图的存储结构 数组(邻接矩阵表示法) 网(即有权图)的邻接矩阵表示法 邻接表 邻接表表示法(链式) 图的邻接表存储表示 采用邻接表表示法创建无向网 邻 ...

  8. 【数据结构——图和图的存储结构】

    目录 一.图的定义和基本术语(Graph) (一)图的定义 (二)图的基本术语 一.图的存储结构 (一)邻接矩阵(Adjacency Matrix) 1.无向图的邻接矩阵 2.有向图的邻接矩阵 3.网 ...

  9. 数据结构之图的存储结构:邻接多重表

    图的存储结构:邻接多重表 产生条件: 邻接多重表的定义: 邻接多重表的代码定义: 删除: 性能分析: 十字链表与邻接多重表的对比 产生条件: 当用邻接矩阵法存储时:空间复杂度为O(|V|^2),太大 ...

最新文章

  1. YML(2)yml 语法
  2. 2014-12-27 迎接15年前夕,原来时间是这样过的
  3. C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
  4. unity 角度限制_喵的Unity游戏开发之路 推球:游戏中的物理
  5. 深度学习《Transfer Learning》
  6. 如何反编译.apk(注:CSDN上提供的资源过时了,都用不了)
  7. 怎么看电脑有没有蓝牙_怎么选购电脑音响?挑选到性价比高的电脑桌面音箱,看完这篇推荐指南就懂了!...
  8. 卧槽!这个价值百万的Github开源项目绝对要火!涵盖OCR、目标检测,NLP,语音合成多方向...
  9. 【语音增强】基于matlab匹配滤波器语音识别【含Matlab源码 514期】
  10. 通过 Socket 实现 TCP 编程入门
  11. 使用jad反编译Java文件
  12. Python——球面两点距离及两条直线夹角的计算
  13. 喜报!芝诺大数据教学科研平台入选重庆市重点软件公共服务平台
  14. Jetson tx2 使用 jetpack 4.3刷机全过程
  15. Android 模拟登陆正方教务系统
  16. 群晖docker下载失败_支持自动下载的 人人影视 客户端
  17. java原神抽卡器(可查询版本)
  18. python中的range()函数
  19. 二本毕业,银行外包测试工作 4 个月有余。浅谈一下我的真实感受...
  20. 极客时间学习笔记☞《苏杰的产品创新课》(二)

热门文章

  1. (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法1
  2. 1-5:学习shell之命令的使用
  3. 红队技巧:绕过ESET_NOD32抓取密码(ESET_NOD32是一款杀毒软件)
  4. Shell通过过滤条件(比如IP)分类流量包,最后合并流量包
  5. 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码
  6. 判断浏览器是pc端还是移动端
  7. Spring基础系列-参数校验
  8. Python中MRO
  9. poj1753 Flip Game(枚举Enum+dfs)
  10. 理解Storm Metrics