Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

标签:C

数据结构之图-创建邻接矩阵图结构-学习笔记-65

发表于 2018-12-14 | 分类 笔记&教程 | 评论数: 3 | 阅读次数: 526

引入

我们知道如何构建一个图的数据结构,那么现在,我们看看如何根据一棵图的图形,创建一张图到内存中去。

创建数据结构

#define MAX_VEX_NUM 50  //最大的容量暂定为50
typedef enum {DG, UDG} GraphType;  //选择有向图还是无向图
typedef struct {
    char vexs[MAX_VEX_NUM];  //一维数组存储顶点
    int arcs[MAX_VEX_NUM][MAX_VEX_NUM];   //二维数组(邻接矩阵)存储边
    int vexnum, arcnum;  //记录顶点的数量和边的数量,等下用作循环判断条件
    GraphType type;  //记录图得类型
} MGraph;

数据结构中

  • 记录顶点的数量和边的数量,等下用作循环判断条件
  • 记录图得类型,等下用于写入矩阵
阅读全文 »

数据结构之图-图的存储结构-学习笔记-64

发表于 2018-12-14 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 86

引入

学了那么多图的知识,是时候动手设计一下图的存储结构了,图跟线性表、树有那么大得差别,所以图的数据结构要复杂很多。

思考

我们先回忆一下线性表和树得存储结构

  • **线性表:**一对一的关系,用数组和链表就能很好的表示。
  • **树:**一对多得关系,用数组和链表得特性结合在一起就可以很好的表示。

那么图呢?

  • 图上的任意一个顶点都可以是第一个顶点,谁开始都行。
  • 任意一个顶点的邻接点也不存在次序关系,多对多,大家都一样。

我们观察下面的四张图

阅读全文 »

数据结构之图-图结构的简介和引入(下)-学习笔记-63

发表于 2018-12-13 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 98

引入

前面我们基本讲了什么是图结构,以及顶点、边和弧之间不同状态的特殊图结构,我们今天继续,看看这些顶点、边和弧之间的关系。

关系

我们来讲讲顶点和边的一些关系

顶点和边的关系

我们说,如果存在一个无向图,G(V,E)

  • 图中的两个顶点构成的边$(V1 , V2)\in E$属于 E 的集合
  • 那么我们就说 V1 和 V2 互为邻接点(Adjacent)
  • 也就说明 V1 和 V2 相邻接,不是连接!。
  • 对于边(V1 , V2)来说
  • 边(V1 , V2)依附(Incident)于 顶点 V1和 V2
  • 也可以说边(V1 , V2)与顶点 V1 、V2 相关联

无向图中的度

阅读全文 »

数据结构之图-图结构的简介和引入(上)-学习笔记-62

发表于 2018-12-13 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 90

引入

终于,我们迎来了新的数据结构,图结构。之前的线性表,主要是一对一的关系,一个元素和另一个元素的关系。树结构,主要层与层之间一对多的关系,即一个结点可以有 N 个子树,N 个子树也只对应一个双亲结点。那么大家也应该猜到了,图解决的是多对多的数据关系。

图的定义


(顶点1有一个环的图结构)

**图(Graph):**是有顶点的又穷非空集合和顶点之间的边集合组成。

  • 通常表示为G(V,E)
  • G 是一个图
  • V 是图 G 中顶点的集合
  • E 是图 G 中边的集合。
阅读全文 »

数据结构之树-哈夫曼编码-学习笔记-61

发表于 2018-12-13 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 41

未完待续…

阅读全文 »

数据结构之树-哈夫曼编码-学习笔记-60

发表于 2018-12-13 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 4

未完待续…

阅读全文 »

数据结构之树-哈夫曼树-学习笔记-59

发表于 2018-12-12 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 114

引入

上一节我们发现,树、森林和二叉树之间竟然有这么多有趣的关联,前根和后根遍历结果竟然都可以跟二叉树相同。二叉树竟然这么的独特,今天我们就来看看,如何打造一棵完美二叉树!

从一个问题出发

我们在使用二叉树的时候,会遇到类似这样的问题

  • 这是一棵二叉树,结点连接线上的数字,是访问这个结点的概率
  • 我们有5%的几率访问 A、15%访问 B、70%访问 C、10%访问 D
  • 那么问题来了,既然绝大多数都是访问 C 的
  • 那访问 C 必须要先判断是否是 A 或者 B,这样太麻烦了

要弄清楚这个问题,我先首先要弄清楚刚才哪些加了数字的结点是什么。

阅读全文 »

数据结构之树-树、二叉树、森林的相互转换-学习笔记-58

发表于 2018-12-11 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 159

引入

我们学习了树、二叉树、以及森林的知识。我们直到遍历二叉树非常的方便,甚至学会了给二叉树增加线索,提高效率。那么问题来了,如果一棵树,不是二叉树,一个结点下有 N 个孩子,那么我们遍历和操作起来,就会很复杂,因为不知道这棵树是深度长还是宽度广,如果都能转换成二叉树来操作就爽了!今天我们就看看普通树和森林,如何转换成二叉树。

普通树转换为二叉树

既然二叉树最方便操作,我们如何能够将普通树转换成二叉树呢?

上面是一棵普通树,有三层,我们将这棵树转换成二叉树

阅读全文 »

数据结构之树-线索二叉树(二)-学习笔记-57

发表于 2018-12-08 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 76

引入

上一节,我们试着解决了树在存储时空间浪费和没法找到双亲结点的问题,这一节,我们着重看一下如何用代码实现。这篇难度有一点大,请务必沉住气,认真仔细。

思路拆解

我们一步一步的拆解代码来看看。

创建树结构体

我们首先声明我们重新设计的线索二叉树结点

  • char data 存放结点数据
  • 左孩子、右孩子这个不用细说了吧,
  • Ltag 和 Rtag 主要是判断左孩子和右孩子究竟是指向左右孩子还是前驱后继
  • 我们定义结构体的时候,使用了 typedef
  • 后面所有的 BiTNode 你可以理解为 struct BiTNode,代表该结构体
  • 后面所有的 BiTree 你可以理解为 struct BiTNode *,代表结构体指针
  • 注意上面有个星号哈!
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct BiTNode)

typedef enum{link,thread} NodeState;
typedef struct BiTNode{
    char data;
    struct BiTNode *Lchild;
    struct BiTNode *Rchild;
    NodeState Ltag;
    NodeState Rtag;
}BiTNode,*BiTree;
阅读全文 »

数据结构之树-线索二叉树(一)-学习笔记-56

发表于 2018-12-08 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 54

引入

前面,我们说过,二叉树的遍历方法,以及如何使用代码创建二叉树并将三种遍历顺序都输出出来。如果你还对单链表有印象,我们会发现上节我们树的创建过程其实就是根结点指向左右子树,很像单链表指向唯一后继,对不对?还记得为什么我们要使用双向链表嘛?因为双向链表在找寻唯一前驱的时候方便。因此,二叉树也遇到了相同的问题,左右子树不知道自己的双亲是谁,我们该怎么解决呢?

问题

现在的二叉树

  • 一个结点下,数据域和指针域
  • 数据域,存放数据
  • 指针域,指向该结点下的左右子树

问题一

如果我要找这个结点的双亲该怎么办呢?

  • 麻烦了!我们要重新遍历这个棵二叉树
  • 直到遇到这个结点,然后记录它得双亲

问题二

阅读全文 »
上一页 1 2 ... 14 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

关于GTD中项目“复盘”的一想法
© 2008 - 2026 Bliner
鲁ICP备13021673号