![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Predator .
Life is too short for us to wake up in the morning with regrets.
展开
-
有向图 -- 十字链表实现
对于有向图来说,基本的邻接表只存储了顶点集以及对应顶点出度的单链表。这样的结构仅仅能方便的访问对应顶点的所有出度,要访问入度是很麻烦的,需要遍历整个邻接表。那有没有办法方便遍历入度呢?当然是有的,使用逆邻接表。就相当于我们的出度域不再存储出度单链表,改成存储入度单链表的信息。这样的话需要邻接表+逆邻接表才能实现方便遍历对应顶点的出度+入度。用了两个邻接表才表示一个有向图,这是很浪费空间的。那有...原创 2020-01-20 22:32:52 · 846 阅读 · 0 评论 -
图 -- 邻接表实现
何为邻接表?由于邻接矩阵存储图的方式,需要固定的开辟一块空间,比如顶点多,但是边很少,这样的邻接矩阵中存在大量的未利用空间。同时,使用数组的方式,虽然查询遍历方便,但是有时需要增删操作时,会比较麻烦且耗时。于是乎,引申出了邻接表,采用数组+单链表的方式实现链式存储。原创 2020-01-18 23:57:22 · 346 阅读 · 0 评论 -
图 -- 邻接矩阵实现
如果只是为了快速的实现图这样一种关系,采用邻接矩阵直接实现会非常方便。原创 2020-01-18 19:41:45 · 357 阅读 · 0 评论 -
Graph 图 -- 定义与存储
何为图?一种描述多对多关系的一种数据结构。更正式的定义是将图描述成有限非空顶点集+有限边集。从这个定义来看,自然是不存在空图的。与线性表及树的区别:链表(一对一),元素至多有且仅有一个前驱和一个后继;树(一对多),元素至多有且仅有一个父节点和任意个子节点。其实树可以看作一种特殊的图结构。也就是说图可以简化成类似树形的结构(如果是连通图,可简化成一棵生成树;非连通图,可简化成若干生成树组成...原创 2020-01-18 13:04:36 · 563 阅读 · 0 评论 -
Huffman树
Huffman树哈夫曼树,也叫最优二叉树,含n个带权叶子结点带权路径长度最短的二叉树。基本概念:路径长度? 路径上所经历边的数目。结点的权? 结点所经路径被赋予的权重。树的带权路径长度? 树中所有叶子结点带权路径长度之和。(WPL = ∑ WL)构造算法将n个结点(每个结点带有一定权值)构造为一棵Huffman树:n个结点自成森林集;选取两棵权值最小的树作左右子树构成一棵...原创 2020-01-16 19:14:17 · 466 阅读 · 0 评论 -
C -- 线索二叉树
线索二叉树什么是线索二叉树?简单点说就是,线索化后的二叉树。线索是指结点中指向前驱和后继的指针。二叉树即,先前提到过的二叉树,若二叉树中的结点存在空指针域,则我们可以利用此空域作为线索。那如何在二叉树的基础上构建线索二叉树?即利用基本二叉树中的空指针域,避免浪费,用来指示前驱或者后继结点,这个过程即线索化。那问题来了当我们遍历这种线索化后的二叉树的时候,怎么知道当前节点的指针域是子树域还是线...原创 2019-12-31 16:58:58 · 265 阅读 · 0 评论 -
C -- 循环链表
循环链表什么是循环链表?单链表(仅含一个指针域,每个节点存在直接后继)尾指向头(形成一个循环)单链表的话只能从链表头开始遍历,才能访问到所有的节点,而循环链表,由于形成了一个圈,从任意一个节点出发我们都可以访问到所有的元素。所以定义循环链表类型时,我们可以用一个指针标识头,一个指针标识尾,在之后的操作中添加一条语句,将tail->next = head; 添加这样一条语句,我们...原创 2019-12-22 18:40:39 · 262 阅读 · 1 评论 -
如何快速找到长度未知单链表的中间节点 -- 快慢指针法
据说是腾讯的一个面试题问题:已知一个长度未知单链表,如何快速找到中间位置的节点?长度未知单向链表分析问题目的:找到最中间位置的节点。其实就是一个我们如何去遍历这个单链表的问题。初步上手单链表的特性大家都知道,只能单向遍历,而且此处还不知道链表的长度。一种方法是:先遍历找到链表长度n,然后我们遍历(n+1)/2次,让指针指向链表一半的位置出的节点,此时就是链表的中间位置(忽略偶数长...原创 2019-12-22 16:00:18 · 607 阅读 · 0 评论 -
C -- 二叉树(含递归以及非递归算法实现)
二叉查找树什么是二叉查找树?是树的一种,即度为2的树。简单点说就是,每个节点至多只有两个子节点(也就是说存在0、1、2个结点);描述的是一种一对多的关系,可由一个根节点衍生出一棵左子树,一棵右子树,每一棵子树又可以看成一一个根节点发散的树;节点据此我们可以定义树的基本单元为一个节点包含:Data域和指针域(两个指针,一个指向节点,一个指向右节点)typedef struct _n...原创 2019-12-21 19:27:46 · 615 阅读 · 3 评论 -
C -- 二分查找
二分查找二分查找,实现很简单,但是有的同学第一次接触的时候可能会踩一些坑。本文以排好序的整数数组为例。讨论并实现二分查找。二分查找,又叫折半查找,顾名思义,可以通过比较中间位置是否与要查找的相等。如果相等即找到了目标,否则,看目标落在中间位置左侧还是右侧,然后再同样的到对应区间去找。分析考虑假设我们有这样一个数组#define MAXSIZE 10int array[MAXSI...原创 2019-12-19 22:08:28 · 115 阅读 · 0 评论 -
C -- 栈
什么是栈(stack)?栈,也是一种链表系列的另一种数据结构。和队列恰恰相反。队列(Queue)First in first out,即先进先出,通俗点说就是只能从尾添加,从头开始删。栈(Stack)Last in first out, 即后入先出,通俗点说就是从尾部添加(入栈),只能从尾部开始删除(出栈)。其实之前学到过一个函数,好像是叫atexit(),参数是一系列函数指针,这个函...原创 2019-12-19 17:03:29 · 161 阅读 · 0 评论 -
C -- 队列
队列一、什么是队列?队列可类比为有两个特殊属性的简单链表:新项只能添加到链表末尾只能从链表头开始删除项通常简称为先进先出,可类比为排队,后来的人跟在链表末尾,然后前面排完队的人先离开。二、实现队列清楚了队列的先进先出这一特性,我们似乎可以很快想到这其实不就是链表吗(而且是相当简单的链表。。。),只是赋予了链表一些固定的属性,因此我们可以采用链表实现队列,当然它的一些接口也受链表属...原创 2019-12-13 16:42:05 · 166 阅读 · 0 评论 -
C -- 双向链表
C双向链表第一步:建立抽象类型,定义接口//实现双向链表#ifndef _LIST_H#define _LIST_H#include <stdbool.h>#define SIZE 20//抽象一个数据类型typedef struct _item{ char title[20]; double value;}Item;//定义节点,每个结点包括指向上一个和...原创 2019-12-12 20:58:40 · 227 阅读 · 0 评论 -
C -- linked_list
链表(Linked List)定义结点类型,链表的基本单元:typedef struct _node{ int value; struct _node * next;}Node;定义列表类型,存放链表头结点指针和尾结点指针,表示一个链表类型:typedef struct _list{ Node * head; Node * tail;}List;声明一个结点...原创 2019-12-07 18:51:11 · 280 阅读 · 0 评论