• 图的应用:
    • 社交网络
    • 村庄路线
  • 什么是图
  • 抽象数据类型定义
  • 图的常见术语
  • 怎么在程序中表示一个图?
    • 邻接矩阵
      • 优点(邻接点、度)
      • 缺点
      • 练习
    • 邻接表
  • 图的邻接矩阵表示法代码
  • 图的邻接表表示法代码

图的应用:

社交网络

在这个社交网络中,每个人占了一个顶点,顶点和顶点之间的边代表着这两个顶点之间的某种关系。

六度空间理论:任何两个人之间,可以通过不超过6个人来认识。

村庄路线

什么是图

图是一种多对多的关系

图之所以强大是因为图将线性表和树都包含在内了。
线性关系表示的是1对1的关系。
树表示的是1对多的关系。

线性表和树都可以认为是图的一种特殊情况。

图可以没有边,但不能没有顶点,一个图至少必须要包含一个顶点。

无向边使用()表示
有向边使用 <> 表示

图不考虑重边和自回路
重边:两个顶点如果是无向边,我们默认只有一条边,不能有多条边。
自回路:就是当我们说到一个有向边的时候,他一定从一个顶点指向另一个顶点,不可能指回向自己。

抽象数据类型定义

抽象数据类型定义三要素:
数据名称、数据对象集、操作集

图的常见术语

怎么在程序中表示一个图?

邻接矩阵

他的对角阵必须全部都是0,因为我们不允许自回路的边,所以一个顶点到它自己是不需要边的。

无向图的邻接矩阵的表示是关于对角线对称的。

上图中i表示的是行的下标,j表示的是列的下标,N表示的是行数(列数也可以),N=i+1.

如果两个顶点之间存在边,那么可以用1来表示,也可以用边的权重来表示。
如果两个顶点之间不存在边,那么可以用0来表示。

省一半的空间,那就真正的就存储一半的数据,原本查看两个顶点之间是否有边相连直接查看下标是不是1就可以了。
但是现在我们只存储了一半的数据,那要查找两个顶点之间是否存在边相连,就需要先找到这个边再数组中存放的下标,再去判断这个下标下的数值是不是1.

优点(邻接点、度)

邻接点:有直接的边跟它相连的所有的顶点叫做这个点的邻接点。
度:度就是跟这个顶点相关的所有的边的个数叫做度。

缺点

稀疏图:顶点很多,边很少,矩阵中含有大量的0元素(无效元素),很浪费空间的。
完全图:任意两个顶点之间都有边,也就是说边数达到极大的,完全图在矩阵中所有的值都是1.
完全图是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。

练习

邻接表

在链表上,每个结点出现的顺序可能不一样,但是没关系,我们不讲究这个顺序。

在邻接表中每条边都被存储了两遍。

图的邻接矩阵表示法代码

/* 图的邻接矩阵表示法 */#define MaxVertexNum 100    /* 最大顶点数设为100 */
#define INFINITY 65535        /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 *//* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{Vertex V1, V2;      /* 有向边<V1, V2> */WeightType Weight;  /* 权重 */
};
typedef PtrToENode Edge;/* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{int Nv;  /* 顶点数 */int Ne;  /* 边数   */WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */DataType Data[MaxVertexNum];      /* 存顶点的数据 *//* 注意:很多情况下,顶点无数据,此时Data[]可以不用出现 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */MGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */Vertex V, W;MGraph Graph;Graph = (MGraph)malloc(sizeof(struct GNode)); /* 建立图 */Graph->Nv = VertexNum;Graph->Ne = 0;/* 初始化邻接矩阵 *//* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */for (V=0; V<Graph->Nv; V++)for (W=0; W<Graph->Nv; W++)  Graph->G[V][W] = INFINITY;return Graph;
}void InsertEdge( MGraph Graph, Edge E )
{/* 插入边 <V1, V2> */Graph->G[E->V1][E->V2] = E->Weight;    /* 若是无向图,还要插入边<V2, V1> */Graph->G[E->V2][E->V1] = E->Weight;
}MGraph BuildGraph()
{MGraph Graph;Edge E;Vertex V;int Nv, i;scanf("%d", &Nv);   /* 读入顶点个数 */Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */ scanf("%d", &(Graph->Ne));   /* 读入边数 */if ( Graph->Ne != 0 ) { /* 如果有边 */ E = (Edge)malloc(sizeof(struct ENode)); /* 建立边结点 */ /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */for (i=0; i<Graph->Ne; i++) {scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); /* 注意:如果权重不是整型,Weight的读入格式要改 */InsertEdge( Graph, E );}} /* 如果顶点有数据的话,读入数据 */for (V=0; V<Graph->Nv; V++) scanf(" %c", &(Graph->Data[V]));return Graph;
}

图的邻接表表示法代码

/* 图的邻接表表示法 */#define MaxVertexNum 100    /* 最大顶点数设为100 */
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 *//* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{Vertex V1, V2;      /* 有向边<V1, V2> */WeightType Weight;  /* 权重 */
};
typedef PtrToENode Edge;/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{Vertex AdjV;        /* 邻接点下标 */WeightType Weight;  /* 边权重 */PtrToAdjVNode Next;    /* 指向下一个邻接点的指针 */
};/* 顶点表头结点的定义 */
typedef struct Vnode{PtrToAdjVNode FirstEdge;/* 边表头指针 */DataType Data;            /* 存顶点的数据 *//* 注意:很多情况下,顶点无数据,此时Data可以不用出现 */
} AdjList[MaxVertexNum];    /* AdjList是邻接表类型 *//* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{  int Nv;     /* 顶点数 */int Ne;     /* 边数   */AdjList G;  /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */LGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */Vertex V;LGraph Graph;Graph = (LGraph)malloc( sizeof(struct GNode) ); /* 建立图 */Graph->Nv = VertexNum;Graph->Ne = 0;/* 初始化邻接表头指针 *//* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */for (V=0; V<Graph->Nv; V++)Graph->G[V].FirstEdge = NULL;return Graph;
}void InsertEdge( LGraph Graph, Edge E )
{PtrToAdjVNode NewNode;/* 插入边 <V1, V2> *//* 为V2建立新的邻接点 */NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->AdjV = E->V2;NewNode->Weight = E->Weight;/* 将V2插入V1的表头 */NewNode->Next = Graph->G[E->V1].FirstEdge;Graph->G[E->V1].FirstEdge = NewNode;/* 若是无向图,还要插入边 <V2, V1> *//* 为V1建立新的邻接点 */NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->AdjV = E->V1;NewNode->Weight = E->Weight;/* 将V1插入V2的表头 */NewNode->Next = Graph->G[E->V2].FirstEdge;Graph->G[E->V2].FirstEdge = NewNode;
}LGraph BuildGraph()
{LGraph Graph;Edge E;Vertex V;int Nv, i;scanf("%d", &Nv);   /* 读入顶点个数 */Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */ scanf("%d", &(Graph->Ne));   /* 读入边数 */if ( Graph->Ne != 0 ) { /* 如果有边 */ E = (Edge)malloc( sizeof(struct ENode) ); /* 建立边结点 */ /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */for (i=0; i<Graph->Ne; i++) {scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); /* 注意:如果权重不是整型,Weight的读入格式要改 */InsertEdge( Graph, E );}} /* 如果顶点有数据的话,读入数据 */for (V=0; V<Graph->Nv; V++) scanf(" %c", &(Graph->G[V].Data));return Graph;
}

数据结构6-1:什么是图相关推荐

  1. 数据结构——树的思维导图,帮助自己记忆。

    数据结构--树的思维导图,帮助自己记忆.

  2. 数据结构(二十一)——图和图的应用

    文章目录 前言 图(graph) 1)图的基本概念及特性 2)图的描述 a. 无权图描述 b. 加权图描述 3)图的类实现 4)图的遍历 a. 广度优先搜索 b. 深度优先搜索 c. 两种搜索算法的比 ...

  3. 数据结构与算法思维导图(学习笔记)

    版本 数据结构与算法思维导图V1.0 V1.0分享版本这个可以直接看,不需要下载. 说明 1.free 2.目前内容主要包含内容包含: 数据结构与算法思维导图 包含:线性表.顺序结构.链式结构,栈与队 ...

  4. 数据结构-线性表-思维导图+小结

    数据结构-线性表思维导图+小结 1 数据结构-第二章-线性表-思维导图 2 数据结构-第二章-线性表-习题小结 2.1 概念性习题小结 2.2 操作性习题小结 1 数据结构-第二章-线性表-思维导图 ...

  5. 数据结构基本框架思维导图

    数据结构基本框架思维导图 数据结构的学习过程: 初识 第一次上数据结构课程时,学校提前在放假前发了严版的教材,于是放暑假时我志气满满的将这本书放到了自己的书包中,回到家中,玩够了后我翻开神秘的书页,用 ...

  6. 最值得收藏的 数据结构 全部知识点思维导图整理(王道考研), 附带经典题型整理

    本文的思维导图根据王道的数据结构书本整理而来并标记出重点内容,包括了知识点和部分课后习题 思维导图源文件已经发布在我的资源当中, 点击获取全部导图和配套OneNote笔记, 有需要的可以去 我的主页 ...

  7. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

  8. 数据结构和算法 -- 学习导图

    数据结构和算法 是作为程序员写出高效代码的基础,为了今后的两年在高效代码之路上持续精进,将按照此学习导图进行 算法和数据结构的刻意练习,同时也希望为同样有高效代码追求的伙伴们提供一条学习路径,共同进步 ...

  9. 数据结构与算法09 之图

    在计算机程序设计中,图是最常用的结构之一.图是一种与树有些相像的数据结构,实际上,从数学意义上说,树是图的一种.然而在计算机程序设计中,图的应用方式与树不同. 前面讨论的数据结构都有一个框架,这个框架 ...

  10. Python数据结构学习笔记——树和图

    目录 一.树的概念 二.二叉树的实现 (一)列表的列表 (二)结点与引用 三.图的概念 四.图的实现 (一)邻接矩阵 (二)邻接表 一.树的概念 树是一种数据结构,树由结点及连接结点的边组成,每个树有 ...

最新文章

  1. Hadoop 2.X 从入门到精通系列视频课程套餐
  2. linux c++ 调用matlab,ubuntu系统下C++调用matlab程序的方法详解
  3. 你真的懂break和continue吗?这篇文章让你明白
  4. 公司新来的小可爱,竟然把内存搞崩了!
  5. linux下添加apt-get命令,Ubuntu Linux系统下apt-get命令整理
  6. 【SpringMVC框架】注解的处理器映射器和适配器配置
  7. ZNYW.20180201_02_YunWeiJianXiu_ShouYe.svg
  8. 陕西师大计算机考研专业考408嘛,2021考研计算机408考试趋势分析
  9. 论文写作之WPS安装Mathtype插件编写数学公式
  10. FlashFXP使用阿里云ECS私钥登录
  11. linux打开dwg格式文件怎么打开软件,DWG 文件扩展名: 它是什么以及如何打开它?...
  12. java英文单词断行_CSS样式解决英文换行断词问题
  13. 虚拟机Ubuntu设置屏幕分辨率
  14. 初次 使用RuoYi 若依框架总结(前端)
  15. 李笑来《自学是门手艺》
  16. LINUX NVME SSD 大容量存储设计
  17. 局域网下 mac和Windows 互相访问共享文件
  18. nodejs和npm版本升级
  19. 学习黑客必须要掌握的DOS命令全集
  20. 分页请求时,有新数据加入时,下一页会出现重复数据问题

热门文章

  1. OpenStack腾讯云部署_Nova部署
  2. 守望先锋世界观架构 ——(一款好的游戏是怎么来的)
  3. 腾讯 Techo Hub 2022 年首站落地福州|723,与开发者们探讨工业数字化!
  4. 舰r最新服务器,战舰少女R官方网站—战舰少女-与心爱的舰娘一起守护这片海域...
  5. mc服务器物品给予,我的世界网易版给予物品指令1.12谢谢
  6. 2022年施工员-土建方向-岗位技能(施工员)考题模拟考试平台操作
  7. NOIp2017——追求那些我一直追求的
  8. 用malloc开辟二维数组的三种办法
  9. 2022-2028年中国商业智能化行业发展现状调查及前景战略分析报告
  10. 解决网页无法选中文字,无法复制的问题