数据结构
文章平均质量分 86
参考:(1)王道2023年数据结构考研复习指导
(2)严薇敏-数据结构(C语言版)
(3)青岛大学-王卓数据结构视频课
北京地铁1号线
这个作者很懒,什么都没留下…
展开
-
1.数据结构基本概念和术语
数据结构基本概念原创 2023-08-02 18:20:04 · 370 阅读 · 0 评论 -
2.C语言实现抽象数据类型-复数的定义
以复数的加,减,乘为例,说明抽象数据类型的定义,使用方式原创 2023-08-02 19:56:07 · 1447 阅读 · 0 评论 -
3.算法的时间复杂度与空间复杂度
算法定义:对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。程序:是用某种程序设计语言对算法的具体实现。程序=数据结构+算法,数据结构通过算法实现操作,算法根据数据结构设计程序。算法特性:一个算法必须具备以下五个重要特性:(1)有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。原创 2023-08-02 23:20:09 · 86 阅读 · 0 评论 -
4.线性表的定义与特点
线性表(Linear List):是具有相同特性的数据元素的一个有限序列。一些基本术语如下:例如:26个英文字母组成的线性表(A,B...Z),数据元素都是字母,元素之间都是线性。同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系。线性表的逻辑特征是:(1)在非空的线性表,有且仅有一个开始结点a_1,它没有直接前趋而仅有一个直接后继a_2;(2)有且仅有一个终端结点a_n,它没有直接后继,而仅有一个直接前趋a_(n-1);原创 2023-08-03 11:46:05 · 308 阅读 · 0 评论 -
5.线性表的顺序表示和实现
顺序表的特征可类似于一维数组,考虑用数组表示线性表;然而,线性表的长度是可变的,C语言中一维数组的长度不可动态定义。考虑用一变量表示顺序表的长度属性。// 存储空间的基地址int length;// 当前长度}SqList;// 顺序表的结构类型为 SqListSqList是定义的结构数据类型,数组名是elem,前面的Elemtype是数组的类型。存储线性表分为两部分内容:一部分是数组,另一部分是一个整型变量,用来存储线性表中元素的个数。原创 2023-08-11 20:43:07 · 384 阅读 · 0 评论 -
6.类C语言有关操作
类C语言有关操作,为后续代码细节的补充说明原创 2023-08-11 12:49:25 · 86 阅读 · 0 评论 -
7.线性表的链式表示和实现
链式存储与链表:用一组物理位置任意的存储单元来存放线性表的数据元素。这组存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中元素的逻辑次序和物理次序不一定相同。原创 2023-08-16 18:59:31 · 98 阅读 · 0 评论 -
8.C语言知识回顾-结构体
int a;double d;int main()//初始化//结构体类型的地址用箭头,结构体类型的话用点//访问结构体变量的元素return 0;double b;int a;struct T t;double d;int main()//访问结构体变量T中的整数元素return 0;原创 2023-08-14 19:14:18 · 83 阅读 · 0 评论 -
9.循环链表,双向链表,几种表的比较
链式存储结构的缺点:(1)存储密度小(存储密度是指结点数据本身所占的存储量和整个结点结构中所占的存储量之比,显然顺序表的存储密度是1),每个结点的指针域需额外占用存储空间。eg.给定La=(1,7,8)和Lb=(2,4,6,8,10,11),合并后Lc=(1,2,4,6,7,8,8,10,11)(尾指针寻找头尾结点的时间复杂度都是O(1),头指针找最后一个结点的时间复杂度为O(n))类似的也可以定义双向循环链表:让头结点的前驱指针指向链表的最后一个结点,让最后一个结点的后继指针指向头结点。原创 2023-08-17 09:32:32 · 357 阅读 · 0 评论 -
10.栈的定义,表示与实现
栈和队列是两种常用的,重要的数据结构。栈和队列是限定的线性表。其中,栈只能插入在表尾,删除也只能在表尾。由于栈的操作具有的固有特性,栈成为程序设计中的有用工具。原创 2023-08-19 15:10:57 · 247 阅读 · 0 评论 -
11.队列的表示与实现
队列原创 2023-08-19 19:20:52 · 371 阅读 · 0 评论 -
12.串,串的存储结构与模式匹配算法
串的抽象数据类型定义:同线性表,只不过处理对象是字符。数据对象:D={ ai | ai ∈ElemSet, i=1,2..,n, n≥0 }数据关系:R1= { | ai-1, ai∈D, i=2,...,n }基本操作:StrAssign (&T,chars) //串赋值StrCompare (S,T) //串比较StrLength (S) //求串长Concat(&T,S1,S2) //串连结Index(S,T,pos) //求子串的位置...还有其他操作...原创 2023-08-20 22:42:17 · 422 阅读 · 0 评论 -
13.数组
这里:n为数组的维数,bi为数组第i维的长度,ji为数组元素第i维的下标。显然ji应该在[0,bi-1]之间,因为下标从0开始。原创 2023-08-21 15:01:54 · 376 阅读 · 0 评论 -
14.广义表
例:(1)A=();空表,长度为0。(2)B=(());长度为1,表头、表尾均为()。长度为2,由原子a和子表(b,c)构成。表头为a;表尾为((b,c))。长度为3,每一项都是原子。表头为x;表尾为(y,z)。长度为2,每一项都是子表。表头为C;表尾为(D)。(6)F=(a,F);长度为2,第一项为原子,第二项为它本身。表头为a;表尾为F。原创 2023-08-21 15:40:25 · 148 阅读 · 0 评论 -
15.树与二叉树基础
树形结构:结点之间有分支,具有层次关系。原创 2023-08-21 20:37:01 · 1688 阅读 · 1 评论 -
16.遍历二叉树,线索二叉树
需要注意的是,在函数中使用了引用传递(&)来传递目标二叉树NewT的地址,这是为了能够在函数内部修改目标二叉树NewT的指针,以便将复制得到的子树链接到正确的位置上。如果去掉输出语句,从递归的角度看,三种算法是完全相同的,或说这三种算法的访问路径是相同的,只是访问结点的时机不同。规定先左后右,即必须先访问左子树,再访问右子树,则根据什么时候访问根结点有:DLR——先(根)序遍历,LDR———中(根)序遍历,LRD———后(根)序遍历三种遍历方式。函数的参数是二叉树T,返回值为二叉树的深度。原创 2023-08-22 22:54:00 · 833 阅读 · 1 评论 -
17.树与森林
把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存储,则n个结点有n个孩子链表(叶子的孩子链表为空表)。由于树和二叉树都可以用二叉链表作存储结构,则以二叉链表作媒介可以导出树与二叉树之间的一个对应关系。此外还存储两个数r和n,r记录根结点在数组中的下标,n记录树的元素个数。先根(次序)遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。后根(次序)遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其。原创 2023-08-23 00:22:02 · 95 阅读 · 0 评论 -
18.哈夫曼树及其应用
引例:将百分制成绩转换为五级制成绩:<60:E;60-69: D;70-79:C;80-89:B;90-100:A;这个决策过程可以画出判断树,判断树是用来描述分类过程的二叉树。如果学生数据量很大,则应该考虑程序操作的时间。原创 2023-08-23 19:52:28 · 366 阅读 · 0 评论 -
19.图,图的两种存储结构
ADT Graph{数据对象V:具有相同特性的数据元素的集合,称为顶点集。数据关系R:R={VR}<v,w>表示从v到w的弧,p(v,w)定义了弧<v,w>的信息(权)}基本操作P:Create_Graph() //图的创建操作。初始条件:无。操作结果:生成一个没有顶点的空图G。GetVex(G,v) //求图中的顶点v的值。初始条件:图G存在,v是图中的一个顶点。操作结果:生成一个没有顶点的空图G。初始条件:V是图的顶点集,VR是图中弧的集合。操作结果:按V和VR的定义构造图G。原创 2023-08-23 23:27:31 · 682 阅读 · 0 评论 -
20.图的遍历
图的遍历算法和二叉树不同的是,图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。为了避免重复访问,我们的解决思路是:设置辅助数组visited[n],用来标记每个被访问过的顶点。初始状态visited[i]都为0,当顶点i被访问,改visited[i]为1,防止被多次访问。图的遍历算法主要有深度优先搜索(Depth_First Search——DFS)和广度优先搜索(Breadth_Frist Search———BFS)两种。原创 2023-08-24 16:21:00 · 120 阅读 · 0 评论 -
21.图的应用
V-U={V2,V3,V4,V5,V6},连接U,V-U的边有(v1,v2),(v1,v3),(v1,v4),最小的是(v1,v3)=1,则这条边必被包含在这个最小生成树内。在生成树的构造过程中,图中n个顶点分属两个集合:已落在生成树上的顶点集U和尚未落在生成树上的顶点集V-U,接下来则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性序列称为。原创 2023-08-26 11:20:14 · 145 阅读 · 0 评论 -
22.查找,线性表的查找
由于对查找表来说,在集合中查询或检索一个“特定的”数据元素时,若无规律可循,只能对集合中的元素一一加以辨认直至找到为止。而这样的“查询”或“检索”是任何计算机应用系统中使用频度都很高的操作,因此设法提高查找表的查找效率,是本节讨论问题的出发点。或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素,此类表为动态查找表。方法:(1)将表分成几块,且分块有序(若i<j,则第j块中所有记录的关键字均大于第i块中的最大关键字),每块内的元素可以有序或无序;分块查找的实质是索引顺序表上的查找。原创 2023-08-26 19:32:47 · 220 阅读 · 0 评论 -
23.树表和哈希表的查找
当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。基于此,我们可以改用动态查找表——几种特殊的树。表结构在查找过程中动态生成。对于给定值key,若表中存在,则成功返回;否则,插入关键字key的记录。原创 2023-08-26 23:42:22 · 227 阅读 · 0 评论 -
24.排序,插入排序,交换排序
排序:将一组杂乱无章的数据按一定规律顺次排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。如果参加排序的数据结点包含多个数据域,那么排序往往是针对其中某个域而言。衡量排序算法的指标有时间复杂度,空间复杂度和稳定性等。对于稳定性做一点说明。稳定排序指的是能够使任何数值相等的元素,排序以后相对次序不变。例如,下面的示例1是稳定排序,示例2就不是稳定排序。排序的稳定牲只对结构类型数据排序有意义。原创 2023-08-27 23:57:23 · 1187 阅读 · 1 评论 -
25.选择排序,归并排序,基数排序
如果rc的值小于R[j]的值,则将R[j]的值赋给R[s],即将较大的子节点的值上移到根节点的位置。例:给定待排序序列(614,738,921,485,637,101,215,530,790,306)。例如,给定8,5,8*,7,9;例如,对下面的小根堆,把13输出,最后一个元素97作为根结点,它的左右孩子是38和27,27较小,所以把97和27交换。本章讨论的各种排序方法,除基数排序外,其它方法都是基于“比较关键字”进行排序的排序方法,可以证明,这类排序法可能达到的最快的时间复杂度为O(nlogn)。原创 2023-08-28 16:10:14 · 605 阅读 · 0 评论 -
26.顺序表的C++代码实现
用C++实现顺序表的初始化,建立,增加,查找,删除等操作。这里写的就是真正可运行的代码而非教材中的伪代码。在写代码的时候踩了一个坑:vscode报cout不明确的错误。(1)将using namespace std;删除后按ctrl+S保存cpp文件,(2)再加上using namespace std;按ctrl+S保存cpp文件。原创 2023-09-14 23:21:31 · 135 阅读 · 0 评论 -
27.顺序表练习题目(1)(2023王道数据结构2.2.3前8题)
王道数据结构2.2.3节综合题1-8代码解答原创 2023-09-15 14:25:47 · 134 阅读 · 0 评论 -
28.顺序表练习题目(2)(2023王道数据结构2.2.3节9-14题)
如果数组中存在大于一半的相同元素,首先假设第一个元素为主元素的候选元素【统计个数为1】,如果目前元素统计的个数大于0,遇到相同的数字——个数加1,不同的数字——个数减1;例如,若序列S1=(11, 13, 15, 17, 19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。推广之,去掉等量的最高和最低的元素之后,序列的中位数不会发生变化。注意:如果折半查找找不到的话,最后退出while循环的时候,low指针指向的是高于x的第一个元素,high指针指向的是低于x的最后一个元素。原创 2023-09-17 12:18:38 · 125 阅读 · 0 评论 -
29.单链表的C语言完整实现
单链表的数据结构,初始化,打印输出,建立单链表(尾插法),元素按位插入,按位删除,按值查找。原创 2023-09-17 16:54:23 · 200 阅读 · 0 评论 -
30.链表练习题(1)(王道2023数据结构2.3.7节1-15题)
如果不是,这时候执行Del(L->next, x),如果第2个是被删掉的元素,进入if(L->next->data==x)分支,此时p=L实际上执行p=L->next,p指向了第2个被删除的结点;第2行L = L->next执行的是L->next=L->next->next,把首元结点的next域修改为指向第3个结点;试题14:设A和B是两个单链表(带头结点),其中元素递增有序,设计一个算法从A和B中公共元素产生单链表C,要求不破坏A,B的结点。试题6:有一个带头结点的单链表L,设计算法使其递增有序。原创 2023-09-20 14:25:20 · 396 阅读 · 0 评论 -
31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)
试题20:设头指针为L的带有表头结点的非循环双向链表,其每个结点中除有prior(前驱指针),data(数据),next(后继指针)域外,还有一个访问频度域freq。每当在连表中进行一次Locate(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度非递增的顺序排列,同时最近访问的结点排在频度相同的结点的前面,以便使频繁访问的结点总是靠近表头。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。原创 2023-09-23 00:07:54 · 284 阅读 · 0 评论 -
32.栈的应用补充-表达式求值
仍然以(三)中的第2张图为例:A入操作数栈—+入运算符栈—B入操作数栈—扫描到-,弹出运算符等级相同的+,并从操作数栈弹出A和B,计算A+B后压回操作数栈,最后-号入运算符栈—C入操作数栈—*入运算符栈—D入操作数栈—扫描到/,弹出运算符*,同时弹出C和D,计算C*D后压回操作数栈,最后把/压入运算符栈—E入操作数栈—扫描到+,/和-依次弹出。在后缀表达式中,1 1 +先作为一个操作数,然后用7减去,就是7 1 1 + -,再用15除,就是15 7 1 1 + - /,以此类推。客观来看两种都正确。原创 2023-09-25 23:55:00 · 322 阅读 · 1 评论 -
33.栈,队列练习题(王道2023数据结构第3章综合应用)
设有两个栈S1,S2都采用顺序栈方式,并共享一个存储区[0...Maxsize-1],为了尽量利用空间,减少溢出可能,可采用栈顶相向,迎面增长的存储方式,试设计S1,S2的入栈和出栈算法。若希望队列中的元素都能得到利用,需设置一个标志域tag,并以tag为0或1来区分头指针front和尾指针rear相同时的队列状态是空还是满,试编写此结构的入队和出队算法。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅有 I 和 O 组成的序列,可以操作的序列为合法序列,否则称为非法序列。试题2:(3.1.4节题4)原创 2023-09-27 20:22:20 · 377 阅读 · 0 评论 -
34.二叉链树的C语言实现
包含二叉链树的建立,计数,查找,各种遍历算法的具体实现(包含递归和非递归算法)。原创 2023-10-05 22:03:15 · 172 阅读 · 0 评论 -
35.树与二叉树练习(1)(王道第5章综合练习)
树与二叉树练习(1)(王道第5章综合练习)原创 2023-10-10 23:02:01 · 1045 阅读 · 0 评论 -
36.树与二叉树练习(2)(王道第5章综合练习)
(3)结点没有左右孩子——找中序遍历前驱结点的左孩子结点,找不到就继续往前直到找到有左孩子结点,或者就是第一个结点(左孩子指针为空)返回NULL。分析:二叉树中(1)叶子结点(2)只有右孩子没有左孩子的结点是原森林的叶子结点。设计算法将二叉树的叶结点按从左到右的顺序连成单链表,连接时使用叶结点的右指针域存放单链表指针。从树转化成二叉树:左孩子向下走相当于深度+1,右孩子向下走相当于访问同深度兄弟结点。(1)结点有右孩子——右孩子就是后序遍历的前驱结点;(2)结点只有左孩子——左孩子是后序遍历的前驱结点;原创 2023-10-15 12:16:17 · 203 阅读 · 0 评论 -
37.图练习(王道第6章综合练习)
图成为树的标准:n个顶点,n-1条边,而我们建立的图的数据结构种numetex, numedge刚好对应这两个参数,所以此题等于白给。分别采用广度优先遍历和深度优先遍历算法判断以邻接表方式存储的有向图中是否存在由顶点i到顶点j的路径(i与j不相等)。图的存储结构,可以有邻接表表示和矩阵表示两种。写出图的深度优先搜索DFS算法的非递归算法(图采用邻接表形式)。假设图用邻接表表示,设计算法输出从顶点i到顶点j的所有简单路径。写出从图的邻接表表示转换成邻接矩阵表示的算法。和前面的练习题相比,此题几乎就是白给。原创 2023-10-18 16:42:49 · 181 阅读 · 0 评论 -
38.红黑树(王道第7章查找补充知识)
红黑树是二叉排序树-左子树结点值≤根结点值≤右子树结点值。①每个结点或是红色,或是黑色的②根节点是黑色的③叶结点(外部结点、NULL结点、失败结点)均是黑色的④不存在两个相邻的红结点(即红结点的父节点和孩子结点均是黑色)⑤对每个结点,从该节点到任一叶结点的简单路径上,所含黑结点的数目相同struct RBnode { //红黑树的结点定义int key;//关键字的值//父节点指针//左孩子指针//右孩子指针int color;原创 2023-10-24 09:11:31 · 380 阅读 · 0 评论 -
39.B树,B+树(王道第7章查找补充知识)
我们首先从二叉查找树到m叉查找树:如下是一个5叉查找树,这里每个结点最多可以有4个关键字,一个关键字可以把区间分成两个部分。为了保证查找效率,防止树过高的策略:(1)m叉查找树中,规定除了根节点外,任何结点至少有个分叉,即至少含有个关键字。如对于5叉排序树,每个结点至少要有3个分叉,2个关键字。(2)仿照平衡二叉树:在m叉查找树中,规定对于任何一个结点,其所有子树的高度都要相同。原创 2023-10-24 17:15:55 · 499 阅读 · 1 评论 -
40.查找练习题(王道2023数据结构第7章)
在链表被启用前,其值均初始化为零。每当在连表中进行一次Locate(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度非递增的顺序排列,同时最近访问的结点排在频度相同的结点的前面,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的Locate(L,x)运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型。线性表中各结点检索概率不等时,可用如下策略提高顺序检索的效率:若找到指定的结点,则将该结点与前驱结点(若存在)交换,使得经常被检索的结点尽量位于表的前端。原创 2023-10-25 21:11:41 · 397 阅读 · 0 评论