数据结构
qwe954443563
这个作者很懒,什么都没留下…
展开
-
树的学习——树的存储结构
树的存储结构:双亲表示法:采用一组连续的存储空间来存储每个结点,同时在每个结点中增设一个伪指针,指示双亲结点在数组中的位置。根节点的下标为0,其伪指针域为-1。孩子表示法:将每个结点的孩子结点都用单链表连接起来形成一个线性链表,n个结点具有n个孩子链表。...原创 2020-12-23 20:46:40 · 209 阅读 · 0 评论 -
图的学习(三)——BFS与DFS
1.图的广度优先搜索图的遍历:从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。广度优先搜索(1)首先访问起始顶点v;(2)接着由出发依次访问v的各个未被访问过的邻接顶点w1w_1w1,w2w_2w2,…,wtw_twt;(3)然后依次访问w1w_1w1,w2w_2w2,…,wtw_twt的所有未被访问过的邻接顶点;(4)在从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点;(5)…,以此类推;#define MAX_TREE_SIZE原创 2020-12-23 16:31:55 · 582 阅读 · 0 评论 -
图的学习(二)——图的基本操作
1. 图的基本操作(1)Adjacent(G,x,y)判断图G是否存在边<x,y>或(x,y)(2)Neighbors(G,x)列出图G中与结点x邻接的边;(3)InsertVertex(G,x)在图G中插入顶点x。(4)DeleteVertex(G,x)从图中删除顶点x。(5)AddEdge(G,x,y)若无向边(x,y)或者有向边<x,y>不存在,则向图G中添加该边。(6)RemoveEdge(G,x,y)若无向边(x,y)或者有向边<x,y>存在,则在图原创 2020-12-23 16:32:27 · 286 阅读 · 0 评论 -
图的学习(一)——图的存储结构
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。注意点:(1)图中数据元素叫做顶点;(2)顶点集合V要为有穷非空;(3)边集可以是空的;有向边称为弧;<v,w>即v指向w,v称为弧尾,w称为弧头。简单图:无自环和重边;连通图的生成树:是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一颗树的n-1条边。有向树是图,而不是树,其度为入度和出度之和。路径长度:路径上边的原创 2020-12-23 14:56:00 · 250 阅读 · 0 评论 -
树的学习(四)——哈夫曼树
结点的路径长度:从根节点到该结点的路径上的连接数。树的路径长度:树中每个叶子节点的路径长度之和结点带权路径长度:结点的路径长度与结点权值的乘积树的带权路径长度:WPL(Weighted Path Length)是树中所有叶子结点的带权路径长度之和。WPL的值越小,说明构造出来的二叉树的性能越优。哈夫曼树即是性能最优的二叉树。哈夫曼树的构造算法:(1)将n个结点作为n棵仅含有一个根结点的二叉树,构成森林F;(2)生成一个新结点,并从F中找出根结点权值最小的两棵树作为它的左右子树,且新结原创 2020-12-23 09:39:45 · 185 阅读 · 0 评论 -
树的学习(三)-树、森林及二叉树的相互转换
普通树转换为二叉树:(1)在树中所有的兄弟结点之间加一条线(2)对每个结点,除了保留与其长子的连线外,去掉该结点与其他孩子的连线。森林到二叉树的转换:(1)先将森林中的每棵树变为二叉树(2)将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一颗二叉树。二叉树到树、森林的转换(1)若结点x是其双亲y的左孩子,则把x的右孩子,右孩子的右孩子,…,都与y用连线连起来。(2)去掉所有双亲到右孩子之间的连线。树的遍历:按照某种方式访问树中的每个结点,且仅访问一次。先根遍历、后根遍历、层次遍历原创 2020-12-21 20:47:37 · 483 阅读 · 0 评论 -
线索二叉树
线索二叉树的作用:(1)将各结点的空指针利用起来;(2)左分支指向其前驱结点,右分支指向其后驱结点;原创 2020-12-16 15:32:51 · 333 阅读 · 0 评论 -
树的学习——(二)二叉树的存储结构及访问
1. 二叉树的顺序存储:用一组连续的存储单元依次自上而下、自左而右存储完全二叉树的结点元素。完全二叉树的逻辑关系的表示:利用了完全二叉树的双亲结点和孩结点的编号规则。即双亲结点编号为i,其左孩子结点为(2i),右孩子结点为(2i+1),反之亦可。因此为了保证完全二叉树的结点编号与内存数组中的结点编号一致的话,此时应该使数组内存前空一格。而这空的一格通常可以存储二叉树的结点个数。如下:对于非完全二叉树,是不可以采用之前方法对逻辑关系进行表示。其逻辑关系表示为:添加一下不存在的空结点,在数组中用0表原创 2020-12-14 11:02:46 · 779 阅读 · 0 评论 -
树的学习-二叉树的性质
二叉树:(1)n=0时,二叉树为空。(2)n>0时,由根节点和两个互不相交的被称为根的左子树和右子树。左子树和右子树也分别是一颗二叉树。所有非叶子结点最多有两个孩子结点。二叉树的孩子结点:左孩子和右孩子。它们是不同的结点。二叉树的五种形态:所以三个结点的二叉树有5种可能性,分别为:二叉树与度为2有序树:(1)二叉树可以为空(二叉树中子结点数最多为2个),而度为2的有序树至少有三个结点(因为度为2的有序树是表示子结点数最多为2,且至少存在一个度为2的结点)。(2)二叉树的孩子结点始原创 2020-12-10 21:05:32 · 784 阅读 · 0 评论 -
树的结构-树的各种定义及性质
树:n个结点组成的有限集合。(1)有且仅有一个特定的称为根的结点。(2)当n>1时,其余结点可分为m个互不相交的有限集合,其中每个集合本身又是一棵树,称为根节点的子树。注意:n个结点的树中只有n-1条边。除根节点外,每个结点都有一个前驱边,因此n个结点的树中n-1条边。树的基本概念:祖先结点和子孙结点双亲结点和孩子结点兄弟节点度:树中一个结点的子结点的个数称为该结点的度。结点的度即为它孩子结点的个数。树的度:所有结点的最大度数。度大于0的结点称为分支结点(存在分支结点)。度为0原创 2020-12-10 19:55:10 · 1223 阅读 · 0 评论 -
串的学习(一)-朴素模式匹配算法
1.串与线性表的区别串是一种特殊的线性表,数据元素之间呈线性关系。它与线性表的不同是线性表中的数据元素可以存放任意的数据元素,而串中数据元素只能存放字符集(中文字符、英文字符、数字字符、标点字符等)。串的增删改查通常以子串为数据对象。2.字符集编码字符集:英文字符-ASCII字符集(只含有英文字符),对于一个英文字母来说,一个英文字母占1B。中英文-Unicode字符集(既含有英文字符,又含有中文字符)Unicode字符集编码方式有UTF-8和UTF-16等编码方案(编码方案可看作字符集的加工函原创 2020-12-10 10:22:00 · 445 阅读 · 0 评论 -
特殊矩阵的压缩存储
1. 对称矩阵的压缩存储:只存储主对角线+下三角区按行优先原则将各元素存入一维数组中。矩阵下标 -》一维数组下标映射关系为:第aija_{ij}aij(当i>=j时)是一维数组中第(1+2+…+(i-1))+j-1个元素。当i<j时,可以利用aija_{ij}aij=ajia_{ji}aji2. 三角矩阵与带状矩阵的压缩存储:其思考方式也与对称矩阵的压缩存储一样。只需要找到aija_{ij}aij在一维数组中的哪一个元素即可。3. 稀疏矩阵的压缩存储:(1)压缩存储原创 2020-12-09 10:11:37 · 239 阅读 · 0 评论 -
队列的应用
1. 队列的应用-树的层次遍历对于树结构,当从根结点开始访问时,将根结点放入队列中,并将其子结点放入队列的队尾,并将该结点从队头弹出;不断循环这个过程,直至所有节点被访问完全。2. 队列的应用-图的广度优先遍历图的广度优先遍历:首先从任一结点出发,将其放入队列中,然后访问该节点的邻居结点,并将其放入队列的尾部,同时将该结点标记为已参观结点;然后依次对队列中的每个结点进行上述操作,最终可以实现图的广度优先遍历。3. 队列在操作系统中的应用操作系统处理多个多个进程:LILO(先进先出去)打印数据原创 2020-12-06 14:39:51 · 1525 阅读 · 0 评论 -
栈的应用(三)-栈在递归中的应用
函数调用栈:最后被调用的函数最先执行结束。函数调用的特点:后进先出(LIFO)函数调用时,需要一个栈存储,存储内容有:(1)函数返回地址(2)实参(3)局部变量每进入一层递归,就将递归调用所需信息压入栈顶。每弹出一层递归,就将弹出相应信息。递归算法:使用递归时可能包含很多次重复计算。太多层递归可能导致栈溢出。...原创 2020-12-06 14:27:08 · 1038 阅读 · 0 评论 -
栈的应用(二)-在前缀(后缀)表达式中求值
1. 后缀表达式(逆波兰表达式)运算符在两个操作数后面中缀转后缀的手算方法:(1)确定中缀表达式的各个运算符的运算顺序(2)选择下一个运算符,按照【左操作数 右操作数 运算符】的方式组合成一个新的操作数(3)如果还有运算符没被处理,就继续(2)注意:由于运算顺序不唯一,因此对应的后缀的表达式也不唯一但对于计算机来进行转化的话,只会产生第一种结果,因为算法的确定性,一种输入只能产生一种输出。计算机中缀转后缀的原则:左优先原则。左优先原则:只要左边的运算符能先计算,就优先算左边的。后缀表原创 2020-12-06 14:10:13 · 957 阅读 · 0 评论 -
栈的应用(一)-括号匹配问题
注意点(1)当扫描到右括号时,需要判断下栈是否为空;(2)当扫描完还未发现错误时,需要判断下栈是否为空,当栈为空时,此时左括号多了,也是不匹配的。c++代码如下:#define MaxSize 10typedef struct SqStack{ int data[MaxSize]; int top;//栈顶指针,存放着从栈底开始的栈顶元素的值的下标值。};void InitStack(SqStack &S);//初始化栈bool PushStack(SqStack &S原创 2020-12-06 09:31:29 · 156 阅读 · 0 评论 -
队列的学习-双端队列
1. 双端队列、栈、队列的区别2. 双端队列的区分可分为双端队列、输入受限的双端队列、输出受限的双端队列。3. 对输出序列合法性的1判断关键点:找出每次要删除一个元素之间的队列排列即可。...原创 2020-12-04 20:32:38 · 221 阅读 · 0 评论 -
队列的学习(三)-队列的链式存储
1. 队列的链式存储的定义//结点的定义typedef struct LinkNode{ int data; LinkNode* next;}LinkNode;//链式队列的定义;需要记录队头的指针,也需要记录队尾的指针typedef struct LinkQuene{ LinkNode *front, *rear;}LinkQuene;2. 链队列的初始化(带头结点)//链队列的初始化(带头结点)void InitQuene(LinkQuene &Q){ Q.f原创 2020-12-04 20:11:21 · 92 阅读 · 0 评论 -
队列的学习(二)-顺序队列(循环队列)
1.顺序存储的队列的定义物理存储空间为一片连续的内存空间。#define MaxSize 10//顺序队列的定义typedef struct SqQuene { int data[MaxSize]; int front, rear;//队头队尾指针;队尾指针指向接下来要插入数据元素的位置。};2. 顺序队列的初始化//顺序队列的初始化void InitQuene(SqQuene &Q){//rear指针指向队尾元素后一个位置,front指针指向队头元素 Q.front原创 2020-12-04 19:25:18 · 309 阅读 · 0 评论 -
队列的学习(一)-队列的初识
1. 队列的定义队列(Quene)是只允许在一端进行插入(叫做入队),在另一端删除(叫做出队)的线性表。队头:允许删除的一端。队尾:允许插入的一端。队列的特点:先进先出(FIFO)(First In First Out)2. 队列的基本操作InitQuene(&Q):初始化栈。构造一个空队列Q,分配内存空间。DestroyQuene(&Q):销毁栈。销毁并释放队列Q所占用的内存空间。EnQuene(&Q,x):入队,若队列未满,则将x加入使之成为新的队尾。DeQue原创 2020-12-04 15:51:22 · 279 阅读 · 0 评论 -
栈的学习(三)-链栈
1. 链栈的定义//链栈的定义typedef struct Linknode { int data; struct Linknode*next;}*LiStack;链栈的定义与链表定义十分相似,其唯一的不同是链表的数据操作可以在两端进行,而链栈的数据操作只能在一端进行。把链头当作栈顶即可。进栈/出栈都只能在栈顶一端进行(链头作为栈顶),因此其插入和删除只能在表头进行。...原创 2020-12-04 15:41:32 · 200 阅读 · 0 评论 -
栈的学习(二)-顺序栈
1. 顺序栈用顺序存储方式实现的栈2.基本操作(1)顺序栈的定义//顺序栈的定义#define MaxSize 10typedef struct SqStack{ int data[MaxSize]; int top;//栈顶指针,存放着从栈底开始的栈顶元素的值的下标值。};(2)初始化栈//初始化栈void InitStack(SqStack &S){ S.top = -1;//初始化栈顶指针}(3)进栈实现//进栈实现bool Push(SqStack原创 2020-12-04 15:31:59 · 133 阅读 · 0 评论 -
栈的学习(一)-栈的初识
1. 栈的定义栈是只允许在一端进行插入或删除操作的线性表。栈顶:允许插入或删除的一端。栈底:不允许插入和删除的一段。由于栈的结构特性,因此进栈顺序和出栈顺序是完全相反的,其特点为“后进先出”(LIFO)(Last In First Out)栈与普通线性表区别就在于数据的运算不同;即插入和删除的不同。2. 栈的基本操作InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。DestroyStack(&S):销毁栈。销毁并释放栈S所占用的内存空间。Push(&am原创 2020-12-04 14:59:25 · 190 阅读 · 0 评论 -
顺序表与链表的不同
顺序表与链表1.逻辑结构顺序表与链表的逻辑结构均为线性结构,都属于线性表。2.存储结构顺序表是顺序存储,因此其可以随机存取,只要知道顺序表的起始地址,则可以立即找到第i个元素的起始位置。且由于不存储其他冗余信息。因此顺序表优点为:可随机存储,存储密度高。缺点为:大片连续空间分配不方便,改变容量不方便。链表是链式存储,优点为:离散的小空间分配方便,改变容量方便。缺点为:不可随机存取,存储密度低。3.基本操作创销、增删改查创建的不同:顺序表:需要预分配大片连续空间;若分配空间过小,则原创 2020-12-02 20:33:47 · 1718 阅读 · 0 评论 -
静态链表
静态链表1.什么是静态链表静态链表:分配一整片连续的内存空间,各个结点集中安置。静态链表与单链表的区别为:静态链表不存储指向下一个结点的地址,而是存储数组下标(游标),由于链表数据元素存储在一整片连续空间,因此可以通过数组下标访问得到。当结点为链表最后一个结点时,其游标的值设为-1,即表示后面没有其他结点了。2.静态链表的定义//静态链表定义typedef struct Node{ int data; int next;}SLinkList[MaxSize];SLinkList a原创 2020-12-02 19:55:58 · 913 阅读 · 0 评论 -
循环链表
循环链表1.循环单链表与单链表的区别:单链表:从一个结点出发只能找到后续的各个结点循环单链表:从一个结点出发可以找到其他任何一个结点。2.循环单链表的初始化://初始化循环单链表bool InitList(LinkList &L){ L = new(Node); if (L == NULL) return false; L->next = L; return true;}3.判断循环单链表是否为空//判断循环单链表是否为空bool Empty(LinkLis原创 2020-12-02 19:20:53 · 217 阅读 · 0 评论 -
双指针
双指针1.双指针的定义//双链表的定义typedef struct DNode { int data; DNode *prior, *next;}*DLinkList;//这里DNode * 与DLinkList等效的2.初始化双链表(带头结点)//初始化双链表(带头结点)bool InitDLinkList(DLinkList &L){ L = new(DNode); if (L == NULL) { return false; } L->prio原创 2020-12-02 16:22:43 · 72 阅读 · 0 评论 -
链表-单链表
线性表-链式储存(链表)链表的优点是容易扩展容量,缺点是不易进行随机存储,即读取某个元素时,需要从第一个元素开始慢慢读取。链表可分为单链表、双链表、循环链表和静态链表。1. 单链表1.1 单链表定义单链表中每个数据内存中不只存放着单个元素的数据元素,还存放着指向下一个节点的指针。1.1.1 单链表定义代码//c++代码struct LNode{ int data; //存放数据 LNode * next;//指向下一个节点的指针};1.2单链表的插入和删除1.2.1 按位序插入原创 2020-11-24 17:08:38 · 184 阅读 · 1 评论 -
线性表-顺序存储(顺序表)
线性表的定义线性表是由具有相同数据类型的n个数据元素组成的有限序列(有次序),n为表长,当n=0时线性表是一个空表。用L表示线性表时,其一般表示为L = (a1a_1a1,a2a_2a2,…,aia_iai,ai+1a_{i+1}ai+1,…,ana_nan)aia_iai是线性表的第i个元素,i表示其位序,位序是从1开始的。a1a_1a1是表头元素,ana_nan是表尾元素。线性表的基本操作InitList(&L):初始化表。构造一个空的线性表L,分配内存空间。Des原创 2020-11-23 15:44:48 · 308 阅读 · 0 评论 -
数据结构-线性表
1.线性表的定义线性表是由具有相同数据类型的n个数据元素组成的有限序列(有次序),n为表长,当n=0时线性表是一个空表。用L表示线性表时,其一般表示为L = (a1a_1a1,a2a_2a2,…,aia_iai,ai+1a_{i+1}ai+1,…,ana_nan)aia_iai是线性表的第i个元素,i表示其位序,位序是从1开始的。a1a_1a1是表头元素,ana_nan是表尾元素。2.线性表的基本操作InitList(&L):初始化表。构造一个空的线性表L,分配内存空间。原创 2020-11-23 15:40:28 · 122 阅读 · 0 评论