
数据结构
本专栏为计算机数据结构课程的学习心得,使用的语言为C/C++,课程资源来自王卓老师的视频课,链接为https://space.bilibili.com/40323036/。
daocaoren_
这个作者很懒,什么都没留下…
展开
-
数据结构索引
数据结构与算法序数据结构之线性表(一)——定义数据结构之线性表(二)——操作类型数据结构之线性表(三)——顺序存储结构(1 定义与特点)数据结构之线性表(三)——顺序存储结构(2 C/C++语言有关操作)数据结构之线性表(三)——顺序存储结构(3 顺序表基本操作的实现)数据结构之线性表(三)——顺序存储结构(4 顺序表小结)数据结构之线性表(四)——链式存储结构(概念)数据结构之线...原创 2019-09-16 10:40:40 · 732 阅读 · 0 评论 -
代码区——排序算法
#include<iostream>#include<vector>using namespace std;//直插法排序void Insertsort(vector<int>& v){ int i, j; for (i = 2; i < v.size(); i++) { if (v[i] < v[i - 1]) ...原创 2019-09-26 17:14:10 · 205 阅读 · 0 评论 -
数据结构之查找(二)——顺序查找
应用范围顺序表或线性链表表示的静态查找表表内元素之间无序顺序表的表示数据元素类型定义:typedef struct{ KeyType key; //关键字域 ...... //其他域}ElemType;顺序表定义:typedef struct{ ElemType *R; //数组 int length; ...原创 2019-08-09 09:51:02 · 1244 阅读 · 0 评论 -
数据结构之图(三)——邻接表
邻接表表示法(链式)顶点: 按编号顺序将顶点数据存储在一维数组中。关联同一顶点的边: 用线性链表存储。如果有边\弧的信息,还可以在表结点中增加一项,无向图的邻接表例子:特点:邻接表不唯一若无向图中有n个顶点、e条边,则其邻接表需要n个头结点和2e个表结点。适宜存储稀疏图。无向图中顶点viv_ivi的度为第i个单链表中的结点数。有向图的邻接表...原创 2019-08-06 19:25:38 · 81881 阅读 · 11 评论 -
数据结构之查找(一)——基本概念
在哪里查找?——查找表查找表是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着松散的关系,没有严格的前驱和后继的关系,因此查找表是一种应用灵活的结构。什么是查找?根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。关键字: 用来标识一个数据元素(或记录)的某个数据项的值。主关键字:可唯一地标识一个记录的关键字次关键字:用以识...原创 2019-08-09 08:27:45 · 798 阅读 · 0 评论 -
数据结构之排序(四)——选择排序(简单选择排序、堆排序)
简单选择排序基本思想:在待排序的数据中选出最大(小)的元素放在其最终的位置。基本操作:1.首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将其与第一个记录交换2.再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将其与第二个记录交换3.重复上述操作,共进行n-1趟排序后,排序结束。算法描述void SelectSort(SqList &K)...原创 2019-08-13 16:29:19 · 1905 阅读 · 0 评论 -
数据结构之图(二)——邻接矩阵
图的逻辑结构为多对多,图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,即数组表示法(邻接矩阵)。图的链式存储结构可以用多重链表来描述,如邻接表,邻接多重表以及十字链表等。邻接矩阵数组(邻接矩阵)表示法:建立一个邻接表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点间的关系)。1.设图A=(V,E)有n个顶点,则有顶点表Vexs[n]如下,i012⋯\cdot...原创 2019-08-06 16:20:46 · 83861 阅读 · 3 评论 -
数据结构之图(十)——关键路径
AOE网定义: 把工程计划表示为边表示活动的网络,叫AOE网。用顶点表示事件,弧表示活动,弧的权表示活动持续时间。例子:事件:表示在它之前的活动已经完成,在它之后的活动可以开始。例如,菜单定制(活动A)表示为,其中,结点v1:表示A之前的活动已经完成,边:表示活动A,边的权值:表示活动A持续30分钟,结点v2:表示活动A完成之后的后续活动可以开始。上述问题的AOE网为,...原创 2019-08-08 18:49:10 · 765 阅读 · 0 评论 -
数据结构之树(二)——二叉树(5 遍历的非递归实现)
遍历的非递归算法(以中序遍历为例,用栈实现)二叉树中序遍历的顺序是LDR,所以该算法的关键就在于:在中序遍历过某结点的整个左子树后,如何找到该结点的根以及右子树。基本思想:建立一个栈根结点进栈,遍历左子树根结点出栈,输出根结点,遍历右子树。过程描述:对上图所示的二叉树进行中序遍历,首先将A入栈,访问A的左子树。此时同样不能先访问B,所以将B入栈,访问B的左子树,发现其为...原创 2019-08-02 10:00:16 · 317 阅读 · 1 评论 -
数据结构之图(九)——拓补排序
有向无环图:无环的有向图,简称DAG图(Directed Acycline Graph)。有向无环图常用来描述一个工程或系统的进行过程。(通常把计划、施工、生产、程序流程等当成是一个工程)一个过程可以分为若干个子工程,只要完成了这些子工程,就可以导致整个过程的完成。两种表示法:AOV网:用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约...原创 2019-08-08 15:53:38 · 478 阅读 · 0 评论 -
数据结构之树(二)——二叉树(4 遍历算法的递归实现)
先序遍历实现方法描述:若二叉树为空,则空操作:若二叉树非空, 访问根结点(D) 先序遍历左子树(L) 先序遍历右子树®例子:上图中的二叉树,访问顺序如下图,如果用二叉链表来表示上图的访问,则有,在二叉链表中,对各结点的访问也是递归的,所以对于先序遍历的...原创 2019-08-01 22:30:01 · 441 阅读 · 0 评论 -
数据结构之图(一)——图的相关概念和术语
数据的逻辑结构:集合:数据元素间除“同属于一个集合外”,无其它关系。线性结构:一对一,如线性表,栈,队列。树形结构:一对多,如树。图形结构:多对多,如图。图: G=(V,E)。其中V代表顶点(数据元素)的有穷非空集合;E代表边的有穷集合。无向图:每条边都是无方向的。有向图:每条边都是有方向的。完全图: 任意两个点都有一条边相连。n个顶点,无向完全图有Cn2=n...原创 2019-08-06 10:44:45 · 1092 阅读 · 0 评论 -
数据结构之图(八)——最短路径问题
最短路径问题抽象典型用途:交通网络问题——从甲地到乙地是否有公路连通?在有许多条公路连通的情况下,哪一条最短?交通网络用有向网表示:顶点——表示地点弧——表示两个地点有路连通弧上的权值——表示两地点之间的距离、交通费或途中所花费的时间的等。如何能够使一个地点到另一个地点的运输时间最短或运费最省?这就是一个求两个地点的最短路径问题。问题抽象: 在有向网中A点(源点)到达B点...原创 2019-08-08 12:15:03 · 5159 阅读 · 0 评论 -
数据结构之树(八)——哈夫曼编码
哈夫曼编码思想问题描述: 在远程通讯中,要将待传送的字符先编码再解码,编码过程就是将字符转换成由二进制组成的字符串。假设传送的字符为:ABACCDA,如果我们采用等长的编码方式,若每个字符的编码为A:00B:01C:10D:11A:00\\B:01\\C:10\\D:11A:00B:01C:10D:11则待传送字符的编码为00010010101100。这种编码方式的一个很明显的缺点就是浪费空...原创 2019-08-05 16:55:02 · 2339 阅读 · 0 评论 -
数据结构之线性表(十三)——队列(1 循环队列)
队列类型定义有关队列的相关概念,可以参考数据结构之线性表(十一)——栈和队列的定义和特点。抽象类型定义如下:ADT Queue{ 数据对象:D={ai∣ai∈ElemSet,i=1,2,...,n,n≥0}D=\{a_i|a_i \in ElemSet,i=1,2,...,n,n\geq 0 \}D={ai∣ai∈ElemS...原创 2019-07-27 18:19:52 · 527 阅读 · 0 评论 -
数据结构之线性表(十四)——队列(2 链队列)
链队列的类型定义在用户无法估计所用队列的长度时,宜采用链队列,其形式如下图,与普通线性表不同的是,它定义了头尾两个指针。普通的链表结点定义如下:typedef struct Qnode{ QElemType data; struct Qnode* next;}Qnode, *QueuePtr;加入头尾指针的链队列定义如下:typedef struct{ QueuePtr...原创 2019-07-27 22:18:10 · 431 阅读 · 0 评论 -
数据结构之树(二)——二叉树(3 二叉树的遍历)
遍历的含义遍历含义: 顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问依次,而且仅被访问一次,又称周游。“访问”的含义很广,可以是对结点作各种处理,如:输出结点的信息,修改结点的数据值等,但要求这种访问不能破坏原来的数据结构。遍历目的: 得到树中所有结点的一个线性排列,以便于后续操作。遍历用途: 它是插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和...原创 2019-08-01 10:12:58 · 396 阅读 · 0 评论 -
数据结构之图(四)——十字链表和邻接多重表
在邻接表表示法中,对于有向图,它的缺点就是求结点的度困难,因为有向图的邻接表很难求结点的入度,而逆邻接表很难求出度,所以可以把邻接表和逆邻接表结合起来——十字链表。在邻接表表示法中,对于无向图,它的缺点是每条边都要存储两次。而邻接多重表就是为了克服这个缺点,即出现两次的边只存一次。十字链表——有向图的一种存储结构含义: 十字链表是有向图的另一种链式存储结构。可以看成是将有向图的邻接表...原创 2019-08-07 10:19:13 · 2126 阅读 · 1 评论 -
数据结构之查找(三)——折半查找(二分查找)
折半查找:每次将待查记录所在区间缩小一半。具体查找过程: 在一个非递减的有序表中,查找值为21的元素。1.在表的两端设置两个指针high和low,2.计算中间位置:mid=(low+high)/2。若关键字的值小于中间位置的值,则在前半区找。即,key<mid,则:high=mid+1。3.再计算中间位置:mid=(low+high)/2。若关键字的值大于中间位置的值,则在后...原创 2019-08-09 11:11:29 · 2083 阅读 · 0 评论 -
代码区——栈
#include "stdafx.h"#include<iostream>#define MAXSIZE 100using namespace std;//栈的数据类型定义typedef struct { int *base; int *top; int stacksize;}SqStack;//初始化一个栈int InitStack...原创 2019-09-17 18:21:03 · 133 阅读 · 0 评论 -
代码区——顺序表
#include "stdafx.h"#include<iostream>#define MAXSIZE 100using namespace std;//顺序表类型定义typedef struct { int *data; int length;}SqList;//初始化顺序表void InitList(SqList& L){...原创 2019-09-17 11:12:39 · 231 阅读 · 0 评论 -
代码区——单链表
#include "stdafx.h"#include<iostream>using namespace std;typedef struct Lnode //链表类型定义{ int data; struct Lnode* next;}Lnode,*LinkList;void CreateList_Head(Link...原创 2019-09-17 09:54:57 · 199 阅读 · 0 评论 -
数据结构之排序(三)——交换排序(冒泡排序、快速排序)
交换排序基本思想:两两比较,如果发生逆序则交换,直到所有记录都排好序为止。常用方法:冒泡排序和快速排序。冒泡排序基本思想:每趟不断将记录两两比较,并按“前小后大”规则交换。——基于简单交换思想例子冒泡排序过程初始状态如下,第1趟,交换过程如下, 第1趟结束后,最大的元素到了最后,所以只需要管前面n-1个元素,第2趟,交换过程如下,第2趟结束后,最后两...原创 2019-08-13 09:49:57 · 462 阅读 · 0 评论 -
数据结构之排序(二)——插入排序(直接插入排序、折半插入排序、希尔排序)
插入排序基本思想:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。边插入边排序的思想,保证子序列中随时都是排好序的。基本操作:有序插入在有序序列中插入一个元素,保持序列有序,有序长度不断增加。起初,a[0]是长度为1的子序列。然后,逐一将a[1]至a[n-1]插入到有序子序列中。有序插入方法:在插入a[i]之...原创 2019-08-12 18:33:15 · 974 阅读 · 0 评论 -
数据结构之排序(一)——基本概念
排序:将一组杂乱无章的数据按一定规律顺次排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。如果参加排序的数据结点包含多个数据域,那么排序往往是针对其中某个域而言的。排序的应用:软件中的直接应用,如按某个域排序,方便查找程序中的简介应用二分查找法最短路径、最小生成树等排序方法的分类:按数据存储介质:内部排序和外部排序按比较器个数:串行排序...原创 2019-08-12 09:33:26 · 835 阅读 · 0 评论 -
数据结构之排序(六)——各种排序方法的比较
时间性能按平均时间性能来分,有三类排序方法:时间复杂度为O(nlogn)O(nlogn)O(nlogn)方法有:快速排序、堆排序和归并排序,其中以快速排序为最好;时间复杂度为O(n2)O(n^2)O(n2)方法有:直接插入排序 、冒泡排序和简单选择排序,其中以直接插入为最好,特别是对那些关键字近似有序的记录序列尤为如此;时间复杂度为O(n)O(n)O(n)方法有:基数...原创 2019-08-15 11:01:46 · 1900 阅读 · 0 评论 -
数据结构之查找(七)——散列表(哈希表)
基本概念基本思想:记录的存储位置与关键字之间存在对应关系,这种对应关系通过hash函数来体现,Loc(i)=H(keyi)Loc(i)=H(keyi)Loc(i)=H(keyi),其中H(keyi)为hash函数。例子:例子1上图中,学生学号的存储位置为学号的后两位。·* 例子2如何查找?以上两例为例,若查找2001011810216的信息,可直接访问V[16]...原创 2019-08-11 13:03:21 · 694 阅读 · 0 评论 -
数据结构之排序(五)——其他类型排序(归并排序、基数排序)
归并排序基本思想:将两个或两个以上的有序子序列“归并”为一个有序序列。在内部排序中,常采用2-路归并排序。即,将两个位置相邻的有序子序列R[l…m]和R[m+1…n]归并为一个有序序列R[l…n]。例子:初始序列为{48,34,60,80,75,12,26,48*}方法: 上图是一个倒着的树(归并树),总共需要⌈log2n⌉\left\lceil {\log _2^n...原创 2019-08-15 10:40:23 · 357 阅读 · 0 评论 -
数据结构之查找(六)——平衡二叉树
定义平衡二叉树(balanced binary tree),又称AVL树(Adelson-Velskii and Landis),其定义如下:一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树:左子树与右子树的高度之差的绝对值小于等于1;左子树和右子树也是平衡二叉排序树平衡因子: 给每个结点附加一个数字,给出该结点左子树和右子树的高度差。平衡因子=结点左子树的高度-结点...原创 2019-08-10 14:50:35 · 1273 阅读 · 0 评论 -
数据结构之图(七)——最小生成树
生成树生成树:所有顶点均由边连接在一起,但不存在回路的图。一个图可以有许多棵不同的生成树。含n个顶点n-1条边的图不一定是生成树。特点:生成树的顶点个数与图的顶点个数相同。生成树是图的极小连通子图,去掉一条边则非连通。一个有n个顶点的连通图的生成树有n-1条边。在生成树中加一条边必然形成回路。生成树中任意两个顶点间的路径是唯一的。构造无向图生成树:通过DF...原创 2019-08-07 21:49:41 · 2161 阅读 · 0 评论 -
数据结构之查找(五)——二叉排序树
当表插入、删除操作频繁时,为了维护表的有序性,需要移动表中的很多记录。所以改用动态查找表——几种特殊的树。其表结构在查找的过程中动态生成。对于给定的key,若表中存在,则成功返回;否则,插入关键字等于key的记录。这样的动态查找表有:二叉排序树,平衡二叉树,红黑树,B-树,B+树以及键树等。二叉排序树的定义定义:二叉排序树或是空树,或是满足如下性质的二叉树:若其左子树非空,则...原创 2019-08-09 18:55:11 · 4342 阅读 · 1 评论 -
数据结构之图(六)——广度优先搜索(BFS)
BFS思想方法:从图的某一结点出发,首先依次访问该结点的所有邻接点Vi1,Vi2,⋯ ,VinVi_1,Vi_2,\cdots,Vi_nVi1,Vi2,⋯,Vin再按这些顶点被访问的先后次序依次访问与它们相邻接的所有未被访问过的点。重复此过程,直至所有顶点均被访问为止。例子:BFS——邻接表实现因为图的BFS的实实现过程与树的层次...原创 2019-08-07 16:53:41 · 426 阅读 · 0 评论 -
数据结构之图(五)——深度优先搜索(DFS)
图的遍历含义: 从已给的连通图中的某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历。遍历实质: 找每个顶点的邻接点的过程。图的特点:图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。如何避免重复访问?设置辅助数组visited[n],用来标记每个被访问过的顶点。初始状态...原创 2019-08-07 15:52:16 · 1890 阅读 · 0 评论 -
数据结构之查找(四)——分块查找(索引顺序查找)
条件:将表分为几块,且表或者有序,或者分块有序(块间有序,块内无序);分块有序含义: 若i<j,则第j块中所有记录的关键字均大于第i块中的最大关键字。建立“索引表”,每个结点含有最大关键字域和指向本块第一个结点的指针,且按关键字有序。查找过程:先确定待查记录所在块(顺序或折半查找),再在块内查找(顺序查找)。例子: 在上述表中查找值为38的元素。方法:首先...原创 2019-08-09 15:50:32 · 3132 阅读 · 0 评论 -
数据结构之线性表(十二)——栈(4 栈与递归)
递归定义: 若一个对象部分地包含自己,或者它自己给自己定义,则这个对象是递归的。若一个过程直接地或间接地调用自己,则这个过程为递归过程。以下三种情况会用到递归:递归定义的数学函数具有递归特性的数据结构可递归求解的问题分治法求解递归问题算法的一般形式:void p(参数表){ if (递归结束条件) 可直接求解步骤; //基本项...原创 2019-07-27 13:02:32 · 280 阅读 · 0 评论 -
数据结构之树(七)——哈夫曼树
哈夫曼树的引入哈夫曼树是一种树的最优结构,以哈夫曼博士命名。那么为什么要用哈夫曼树,下面以一个例子引入。编程:将学生的百分制成绩转换成五分制成绩。<60:E        60−69:D    &Thic...原创 2019-08-04 21:05:05 · 2557 阅读 · 0 评论 -
数组结构之矩阵(特殊矩阵的存储)
矩阵的常规存储与压缩存储矩阵: 一个由m∗nm*nm∗n个元素排成的m行n列的表。[a11a12⋯a1na21a22⋯a2n⋯⋯⋯⋯am1am2⋯amn]\left[ {\begin{array}{}{{a_{11}}}&{{a_{12}}}& \cdots &{{a_{1n}}}\\{{a_{21}}}&{{a_{22}}}...原创 2019-07-30 12:38:10 · 2679 阅读 · 0 评论 -
数据结构之线性表(五)——单链表(1 定义)
单链表的定义单链表:每个结点只有一个指针域的链表。以下主要针对带头结点的单链表来进行描述的。非空表:由头指针L指向头节点,再经由头节点指向首元结点,随后一个元素的指针域为空。空表:该链表中只有一个头结点,并且头结点的指针域为空。由于单链表由表头唯一确定,所以单链表用头指针的名字来命名。若头指针名是L,则把该链表称为表L。单链表的表示单链表的存储结构其存储结构如上图,那么怎...原创 2019-07-17 21:51:09 · 565 阅读 · 0 评论 -
数据结构之线性表(六)——循环链表
循环链表的定义1.概念与特点循环链表:是一种头尾相接的链表。表中的最后一个结点的指针域指向头结点,整个链表形成环状结构。优点:从表中任意一个结点出发均可找到表中其他结点。补充: 由于循环链表中没有NULL指针,所以涉及到遍历操作时,其终止条件不再像单链表那样判断p或者p->next是否为空,而是判...原创 2019-07-20 14:59:44 · 1107 阅读 · 0 评论 -
数据结构之线性表(五)——单链表(4 单链表的建立)
建立单链表的方法有两种:头插法和尾插法。头插法建立单链表头插法:元素插入到链表头部,也叫前插法。算法步骤:1.从一个空表开始,重复读入数据。2.生成新结点,将读入数据存放到新结点的数据域中。3.从最后一个结点开始,依次将各结点插入到链表的前端。例子:建立链表L (a,b,c,d,e)从线性表中最后一个元素开始,依次插入到链表的前面。具体做法:1.建立头节点。L = n...原创 2019-07-19 21:47:29 · 2196 阅读 · 0 评论