数据结构教材全书详细笔记总结(c语言版严蔚敏编)
对数据结构中的主要内容做学习过程分享和学习心得体会
Yumpie_
“骏马自知前程远,不必扬鞭自奋蹄♂️”
展开
-
初识单链表
当链表不设头结点时,假设L为单链表的头指针,它应该指向首元结点,则当单链表为长度n为0的空表时,L指针为空(判定空表的条件可记为:L==NULL)。为了更加方便对链表进行操作,会在单链表的第1个结点前附设一个头结点.头结点的数据域可以不存储任何信息,也可以存储如线性表的长度等附加信息,头结点的指针域存储指向线性表第1个元素的结点。用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的,甚至是零散的分布在内存的任意位置,链表中元素的逻辑次序与物理次序不一定相同。原创 2023-03-27 20:06:11 · 55 阅读 · 0 评论 -
头插法和尾插法建立单链表
创建单链表的过程就是动态生成链表的过程,即从空表的初始状态起依次建立各元素结点,并逐个插入链表。采用的是插队的办法新生成的结点在头结点之后在第一的位置。头插法(前插法)建立单链表。原创 2023-03-29 15:42:28 · 335 阅读 · 0 评论 -
线性表的基本操作
在查找时,为确定元素在顺序表中的位置,需和给定值进行比较的数据元素个数的期望值称为查找算法在查找成功时的平均查找长度。存储密度大(结点本身所占用的空间/结点结构所占存储量=1)无需为表示表中元素之间的逻辑关系,而增加额外的存储空间。插入位置在最前在原线性表的第1个元素之前插入一个新的元素,线性表的所有元素都要移动移动次数最多。当线性表长度变化较大时,难以确定存储空间的容量,数据元素的个数不能自由扩充(存储空间不灵活)比较的次数与输入的定值e有关(假设7个数字出现的概率均为1/7)线性表置空/清空线性表。原创 2023-03-26 20:03:59 · 82 阅读 · 0 评论 -
双向链表和循环链表
为了克服单链表的这一缺点,老科学家们设计了双向链表(double linked list)是在单链表的每个结点中再设计一个指向其前驱结点的指针域。=L或p->next!在双向链表中有些操作(ListLength,GetElemment等因为只涉及一个方向的指针他们的算法与线性表的相同)但在插入和删除需要修改两个方向上的指针两者的算法复杂度均为O(n)当每个结点的数据域所占的字节数不多时,指针域所占的存储空间的比重显得很大。循环链表是头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环)原创 2023-03-30 19:09:37 · 356 阅读 · 0 评论 -
单链表的基本操作
③退出循环时,如果指针p为空,或者计数器j>i,说明指定的序号i值不合法大于表长n或小于1), 取值失败返回ERROR;否则取值成功,此时j=i时,p所指的结点就是要找的第l个结点,用参数e保存当前结点的数据域,返回OK。[算法步骤]①用指针p指向首元结点,用j做计数器初值赋为1。[算法步骤]1.找到第i-1个结点,如果有必要的话保存ai的值且将地址存于在q中以备释放。2.找到ai+1的位置赋值给,ai-1的next域。先用p指向ai-1结点再用用q指针指向ai结点。指向下一结点p=p->next;原创 2023-03-28 19:05:36 · 192 阅读 · 0 评论 -
线性表的顺序实现
1.malloc()函数是在程序运行时分配内存的重要工具接受一个参数:所需的内存字节数但并不会为其赋名.然而,但他确实返回了动态分配内存块的首地址.因此可以把该地址赋给一个指针变量,并使用指针访问这块内存注意要强制类型转换。一个教室最多容纳50人(数组长度/线性表的最大存储容量),但现在教室里坐着34(线性表中当前元素个数)个数。顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。线性表的顺序存储结构是指用一段地址连续的存储单元依次存储线性表的数据元素。原创 2023-03-25 10:16:17 · 40 阅读 · 0 评论 -
图的应用
U={V1,V3,V6},V-U={V2,V4,V5}在V1V2,V1V4,V3V2,V3V4,V3V5,V4V6,V5V6中V4V6权为2最小V4加入U,V4V6加入TE。U={V1,V3},V-U={V2,V4,V5,V6}在V1V2,V1V4,V3V2,V3V4,V3V5,V3V6中,V3V6的权是4最小V6加入U,V3V6加入TE。U={V1,V3,V6,V4},V-U={V2,V5}边中V2V3权为5最小,V2加入U,V2V3加入TE。把树的所有顶点都加入最小生成树的顶点集合中。原创 2023-04-13 19:30:12 · 53 阅读 · 0 评论 -
栈和队列定义和特点
由于栈的操作具有后进先出的固有特性,使栈成为程序设计中有用的工具。在表一端(表尾)插入,在另一端(表头)删除。栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为限定性的数据结构。栈和队列的区别:栈是吃进去的东西吐出来(嘴【栈顶】)队列是吃进去的东西拉出来(队首和队尾)栈和队列是限定插入和删除只能在表的“端点”进行的线性表。1.定义:只能在表的一端进行插入运算在表的另一端进行删除操作运算的线性表(头删尾插)1.定义:限定只能在表的一端进行插入和删除操作运算的线性表(只能在栈顶操作)原创 2023-04-01 10:35:10 · 829 阅读 · 2 评论 -
插入排序
拿x和已经排好序的部分比较(从前往后可以,从后往前也可以 这里以从16开始往前为例)再设置应该变量j表示查找位置的下标,j的初始值是i-1 a[j]>x x插在a[j]之前,a[j]后移 a[j+1]=a[j] 然后 j--循环停止另一种情况(当插入元素x=2)比较了所有元素 比较的最后一个元素是a[0] 3>2 a[j]后移 j-- (此时j=-1 循环停止 j的值(-1)不满足循环条件 条件可以是j>=0)a[j]和x比较 5<7 =a[j+1]x a[j]<x停止比较。原创 2023-04-18 19:35:14 · 44 阅读 · 1 评论 -
栈的顺序表示
存储方式:同一般的线性表的顺序存储结构完全相同,利用(数组)一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,栈底一般在低地址端。另外用stacksize表示栈可使用的最大容量(栈最多可以存放的元素个数)C语言中下标不能越界否则就有语法错误。顺序栈的初始化(开辟指定大小的空栈)[maxsize太大可能分配不成功报错加上这样一个判断就可以了]top和base可以定义为整型存储数组的下标/定义为指针(指针相减的前提是两指针指向同一数组)附设top指针,指示栈顶元素在顺序栈的位置。原创 2023-04-02 16:44:25 · 89 阅读 · 1 评论 -
哈夫曼树详解
权(weight)又称权重:将树中结点赋给一个有着某种含义的数值,(具体的意义根据树使用的场合确定)则这个数值称为该结点的权。在parent=0的树(其实parent不为0是对应根结点的子树)中再选2小造新树。在构造哈夫曼树之前先要了解他的存储结构(哈夫曼树=二叉树)有顺序存储和链式存储。给3号和6号的parent赋值9号(构造出的根结点)并修改9号的左右孩子。结点的带权路径长度:从根结点到该结点之间的路径长度与结点上权的乘积。2.循环1-->n存叶子结点从n+1-->2n-1(总个数)原创 2023-04-09 19:33:47 · 3607 阅读 · 0 评论 -
哈夫曼编码
G是7号结点,他的parent是8 找到8号,判断G是8号的左孩子还是右孩子(8号的哪个域是7)-->8号的lch为7-->G是8号的左孩子-->标记0....直到根结点(parent=0)哈夫曼编码从根结点到叶子结点而现在是叶子到根哈夫曼编码需要把得到的值倒过来(很容易想到后进先出的栈)当i=1(求A的编码) A的parent=13 13的lch=1(左孩子)标注0-->存到cd[5]-->start--(start=4)13号parent=0循环结束-->字符串复制函数复制到HC[1]原创 2023-04-09 19:44:42 · 102 阅读 · 0 评论 -
一分钟让你彻底掌握查找
查找22 22mod11=0 先去0号位置 结果没找到 去1(0+1)号找 1号找不到去2(0+2)号找[线性探测的增量是 1 2 3 ...]字典块间是有序的(按照A-Z的顺序)块内在M块的单词也是有序的。平均查找长度(1+2+1+1+1+4+1+2+2)/9(假设概率相同P=1/9)=1.67。第二块的元素都大于第一块的最大值22.第三块的元素都大于第二块的最大值48。平均查找长度:ASL=(1*6+2+3*3+4+9)/12=2.5。平均查找长度:ASL=(1*6+2*4+3+4)/12=1.75。原创 2023-04-14 19:24:41 · 187 阅读 · 0 评论 -
排序概述
在数据库原理中 见过 数据域的概念的 二维表(关系)中的一列。比如针对学生信息表往往是按学号/姓名进行排序。原创 2023-04-17 21:03:06 · 39 阅读 · 1 评论 -
二叉树的概念、性质、逻辑结构和存储结构
一般情况我们说数组不需要存储地址,存储密度达到1很大 但对于树而言顺序结构通过编号来表示双亲和孩子/直接前驱后继的关系。当出现空结点时对应编号储存0或者不储存元素。这些位置就都被浪费掉了。树的层数(结点):根节点的层数为1,其他结点的层数为根节点到该结点的分支数+1。二叉树顺序存储的缺点顺序结构大小固定当树的元素个数变化比较大时,顺序存储不合适。树的高度(深度):树中结点的最大层数。原创 2023-04-05 18:48:27 · 98 阅读 · 0 评论 -
二叉树的广度优先遍历
二叉树的层次遍历设计思路:原创 2023-04-06 20:15:42 · 37 阅读 · 0 评论 -
树表平衡调整方法
60比根结点大 插入到右子树 60比53大 插入到右子树 60比70小 插入其左子树。LL型删除的结点在左子树的左子树上。2<5 左子树 2<4 左子树。(把A转下来 平衡旋转)原创 2023-04-15 10:09:25 · 45 阅读 · 0 评论 -
二叉树的深度优先遍历
遍历二叉树算法描述先序遍历中序遍历后序遍历遍历算法分析。原创 2023-04-06 20:15:04 · 41 阅读 · 0 评论 -
二叉树遍历算法的应用
根据遍历序列构造二叉树。原创 2023-04-06 20:20:36 · 44 阅读 · 0 评论 -
图的基本概念
顶点数达到最大再加一个顶点就不连通了。原创 2023-04-10 20:30:48 · 55 阅读 · 0 评论 -
图的存储结构
链式:图有多个前驱和多个后继需要多个指针域但图不像线性表一个前驱一个后继用pre和next两个域(双向链表)二叉树一个前驱两个后继用lch和rch(二叉链表)有必要时候可以增加parent(三叉链表)图前驱和后继数量不确定(重点介绍邻接矩阵和邻接表)复习:()无方向不区分起始端点和终止端点<>有向i(弧尾)-->j(弧头)i出发指向j。(1)输入了顶点数和边数就可以确定输入一维数组的顶点信息和邻接矩阵的边的关系的循环次数。邻接表示两个顶点之间的关系:(有边/弧相连的两个顶点之间的关系)原创 2023-04-11 19:22:03 · 101 阅读 · 0 评论 -
树与二叉树的转换
树与森林树的表示方法双亲表示法代码实现孩子链表代码带双亲的孩子链表孩子兄弟表示法树与二叉树的转换例子:二叉树-->树森林转化为二叉树二叉树转化为森林森林的遍历。原创 2023-04-08 09:28:15 · 42 阅读 · 1 评论 -
图的遍历
没有访问过<看visit数组对应的值是不是0>)2--》1,访问1之后修改visited[1]=1-->找1没有被访问过的邻接点(行下标为1个这行依次判断<第一个不行值为0没有边看下一个值是1visited数组值为1访问过了>继续看下一个经过判断3号可以的)1--》3 访问3之后修改visited[3]=1 ...3--》5,(5第一个邻接点2访问过了第二个邻接点3也访问过了)--?回退回3--》回退回1--》4--》6--》退到4--》退回1--》退回2(退回起点)访问完毕。邻接表会了邻接矩阵更简单。原创 2023-04-12 20:08:36 · 33 阅读 · 0 评论 -
线性表的合并
比较大小)1<2即pa->data<pb->data=>pa指向的结点插入到pc后(pc->next=pa)(而pc指向当前表尾(pc=pa;问题描述:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc且Lc中的数据元素按值非递减有序排列(不一定是严格递增的可能出现相等的元素)如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素如果p的初值为&a[0],则:p+i和a+i 就是 a[i]的地址,*(p+i)即为a[i]原创 2023-03-31 09:44:33 · 352 阅读 · 0 评论 -
串的模式匹配算法——BF算法
有用的算法如文章中查找关键字、搜索引擎、拼写检查、语言翻译、数据压缩。Brute-Force简称BF算法(简单匹配算法)采用穷举法的思路。算法目的:确定主串中所含子串(模式串)第一次出现的位置(定位)串的模式匹配算法——BF算法。原创 2023-04-04 19:15:41 · 161 阅读 · 0 评论 -
一分钟教你学懂串
线性表更关注单个元素的操作,比如查找一个元素插入或删除一个元素但串中更多的是查找子串的位置、得到指定位置的子串、替换子串的操作。串的应用非常广泛,计算机的大多数非数值处理的对象大多数是字符串数据,例如:文字编辑、符号处理,各种信息系统等等。串相等:当且仅当两个串长度相等,并且各个对应位置上的字符都相同时,这两个串才是相等的。子串:串中任意个连续的字符组成的子序列(含空串)称为该串的子串。串的顺序存储结构(物理位置的前后表示逻辑上的前后)字符位置:字符在序列中的序号为该字符在串中的位置。原创 2023-04-03 11:25:17 · 48 阅读 · 0 评论 -
数据结构绪论
做好笔记“最淡的墨水也胜过最强的记忆”即使你不去复习你的笔记也没有什么,其实写字的过程中大脑也在学习,写字放慢了你的速度,从而让你更好的去消化学习的内容主动学习;必须真真切切的可以写出代码去实现算法并且可以详细的说出每一步是做什么的;【建立相应方程】<一般建立方程容易数据元素之间的关系简单但运算量大,人们就利用计算机来快速的完成复杂的计算>设计算法编程调试运行。因此,数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。具体问题抽象成数学模型;找出操作对象之间的关系;原创 2023-03-20 19:07:47 · 67 阅读 · 1 评论 -
数据结构基本介绍
4.数据对象(DataObject)是性质相同的数据元素的集合,是数据的一个子集。由此可以看出,不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表)的集合,只要集合内元素的性质均相同,都可称之为一个数据对象。换句话说,数据结构是带”结构"的数据元素的集合,“结构”就是指数据元素之间存在的关系。顺序存储结构是把数据元素存放在连续的存储单元里,数据元素之间的逻辑关系是通过数据元素的位置。物理结构:数据的逻辑结构在计算机中(内存)的存储形式。原创 2023-03-21 16:47:35 · 74 阅读 · 0 评论 -
初识线性表
的多项式时,就要用一个长度为20001的线性表来表示,而表中仅有3个非零元素,此时将会造成存储空间的很大浪费,由此可改变元素设定,对多项式的每一项,可用(系数,指数)唯一确定。在非空的线性表,有且仅有一个开始结点a1,它没有直接前趋,而仅有一个直接后继a2;线性表中元素的个数n(n≥O)定义为线性表的长度,n=O时称为空表。A=((7,0),(3,1),(9,8),(5,17))[4项]将非空的线性表(n>O)记作(a1,a2,a3,...,an)B=((8,1),(22,7),(-9,8),)[3项]原创 2023-03-24 20:49:38 · 101 阅读 · 0 评论 -
数据结构——算法和算法分析
你说你写一个算法,计算机需要算上20年,一定会结束,他在数学上是有穷的,媳妇都熬成婆了,算法的意义。3.健壮性(Robustness):当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。可读性强的算法有助于人们对算法的理解,而难懂的算法易于隐藏错误,且难于调试和修改。类C语言介于伪码语言和程序设计语言之间的一种表示形式,保留了C语言的精华,不拘泥于C语言的语法细节,同时也添加了一些C++的成分。c.算法程序对典型、苛刻、有刁难性的几组输入可以产生正确的结果;原创 2023-03-22 17:34:26 · 82 阅读 · 0 评论 -
时间复杂度和空间复杂度
另外一种方法是,事先建立一个有2050个元素的数组,然后把所有的年份按下标的数字对应,如果是闰年,则此数组元素的值是1,如果不是元素的值则为0。而对于一个算法来说,需要考虑各种可能出现的情况,以及每一种情况出现的概率,一般情况下,可假设待查找的元素在数组中所有位置上出现的可能性均相同。若输入数据所占据的空间只取决于问题本身和算法无关,这样只需分析该算法在实现时所需的辅助单元即可,若算法执行时所需的辅助单元相对于输入数据量而言是个常数,则称此算法为原地施工,空间复杂度为O(1)(下文对函数的底数全部省略)原创 2023-03-23 17:38:51 · 69 阅读 · 0 评论