
C&&C++
数据结构学习笔记
CS_Mr M
菜是原罪
展开
-
【4】1 树 定义和基本术语
结点的层次有时题目会说明从0开始!原创 2020-08-04 17:37:03 · 184 阅读 · 2 评论 -
【3】5 KMP 手算 next 数组及 nextval 数组
考研中最常考的就是求一个模式串的 next 数组(手算即可)!串的前缀:包含第一个字符,且不包含最后一个字符的子串。串的后缀:包含最后一个字符,且不包含第一个字符的子串。当第 j 个字符匹配失败,由前 1~j-1 个字符组成的串记为 S。则: next[ j ] = S 的最长相等前后缀长度 +1 。 特别的next[ 1]=0==> 所以很容易得出 next[1] =0 , next[2] =1如果不经常出现子...原创 2020-08-04 15:27:00 · 497 阅读 · 0 评论 -
【3】4 KMP算法思想
KMP 算法: 朴素模式匹配算法的优化!朴素模式匹配算法缺点:当某些子串与模式串能部分匹配的时候,主串的扫描指针 i 经常回溯,导致时间开销增加!分析:oo 都是o 开头,肯定不匹配,然后 g 开头但是紧跟 l 所以也不行, l 开头的也不匹配! 所以不需要像朴素模式匹配算法那样从 g 后面一个一个验证!oogl 开头的不用考虑,那么接下来能够配对上的情况是:如果这个问号是 g,然后后面说不定就是 oogle 呢。用代码描...原创 2020-08-04 14:40:37 · 302 阅读 · 0 评论 -
【3】3 串_朴素模式匹配算法
==> 在上篇文章(【3】2 ) 中用的是其它的基本操作比如( 取子串、子串的对比),来实现定位操作!==> 朴素模式匹配算法和上节的定位内容差不多,只不过这里不适用其它基本操作而是直接通过访问数组元素的方式来实现!==> 第二个 if 判断句中的条件是为了解决 while 循环跳出是因为 S 超出了 主串的边界,而 j 指向还是字符(没有超出边界),这说明主串中没有足够的字符了,那就可以直接返回0 (即失败)。如下图:...原创 2020-08-03 15:53:32 · 187 阅读 · 0 评论 -
【3】2 串的存储结构
1. 串的顺序存储串是一种特殊的线性表,只不过线性表中的元素是 ElemType ,但在串中为 char 类型!静态数组实现 ==> 内存空间由系统自动回收。而动态数组实现 ==> 由于malloc 申请的内存在系统的堆区,需要用 free函数 手动释放相关的内存。这些东西和线性表是差不多的,只是将数据元素类型改为了 char 类型,所以在简答题中遇到有关顺序存储的方式实现串有什么优缺点,结合顺序表的知识思考优缺点即可!方案二...原创 2020-08-02 20:21:40 · 389 阅读 · 0 评论 -
【3】1 串(字符串) 定义和基本操作
1. 概念理解1.位序从 1 开始。2.空格也是一种字符!2. 基本操作计算机只能识别 0 和 1 组成的二进制数。空格在 ASCII 中的位置!原创 2020-08-02 19:58:29 · 417 阅读 · 0 评论 -
【2】特殊矩阵的压缩存储
1. 一维数组、二维数组矩阵很方便的使用数组来存储,所以先介绍下数组相关知识点!规定行优先或者列优先存储原则,本质目的都是想要把非线性的二维数组把它拉成一个线性的形状,因为计算机内存的存储空间都是线性的!把这些数据有规律的存入内存之后,带来的好处就是可以实现随机存取,即只要给出元素在数组中的行号和列号,计算机根据起始地址就可以直接算出这个行号和列号所对应元素存放地址!行优先存储下,如何计算某一元素存放地址:所以,二维数组也具...原创 2020-08-02 14:41:15 · 524 阅读 · 1 评论 -
【2】9 栈在递归中的应用
=> 递归算法即递归函数调用自身的过程,递归的过程背后就是函数调用的过程!1. 函数调用的背后过程任何一段代码、任何一个程序调用之前,系统都会开辟一个函数调用栈。用这个栈来保存各个函数在调用过程当中所必须保存的一些信息。包括:调用返回地址、实参、局部变量。程序的入口是 main 函数,刚开始运行 main 函数的时候,会把 main函数相关的一些必要信息压入栈中,比如 main 函数里面的局部变量 a、b、c。为了保证程序运行顺序的正确性 (从计算机的思维),...原创 2020-08-02 14:12:56 · 1080 阅读 · 1 评论 -
【2】8 表达式求值_机算(栈)
这一块是考试重点!原创 2020-08-02 13:03:08 · 186 阅读 · 0 评论 -
【2】7 栈的应用_表达式求值 理论
1. 中缀表达式算数表达式中由三部分组成: 操作数、运算符(加减乘除)、界限符(括号)。界限符是必不可少的,反映了计算的先后顺序。可以不通过界限符也能无歧义地表达运算顺序吗?(波兰数学家)===> 逆波兰表达式 = 后缀表达式, 波兰表达式 = 前缀表达式。操作数的相对顺序不能变!运算符生效的先后顺序是一一对应的。如果要用计算机实现一个中缀转后缀算法的话,输入同一个中缀表达式,我们只应该得到一种结果。...原创 2020-08-01 17:26:13 · 315 阅读 · 0 评论 -
【2】6 栈的应用_括号匹配问题
拓展:IDE是什么!IDE的意思是Integrated Development Environment,集成开发环境。是用于提供程序开发环境的应用程序,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套,所有具备这一特性的软件或者软件套都可以叫集成开发环境。比如:Microsoft Visual Studio(简称VS)是微软公司的开发工具包系列产品。Visual Studio产品包含C++、C#和VB.NET语言。Eclipse等。 ...原创 2020-08-01 15:42:15 · 397 阅读 · 0 评论 -
【2】5. 双端队列输出合法性
1. 概念区分栈: 只允许从一端插入和删除的线性表。队列: 只允许从一端插入、另一端删除的线性表。双端队列: 只允许从两端插入、两端删除的线性表输入受限的双端队列:只允许从一端插入、两端删除的线性表。输出受限的双端队列:只允许从两端插入、一端删除的线性表。2. 考点<1> 判断输出序列的合法性以栈为例分析思路: 输入序列为 1,2,3,4。 如果第一个输出数是3,那么就意味着 1、2 已经入栈,所以后面无论如何都是2比1先出栈,违背这...原创 2020-08-01 15:03:03 · 1149 阅读 · 0 评论 -
【2】4. 队列的链式代码实现
目录1. 初始化链队列2. 链队列的入队3. 链队列的出队4. 链队列满队条件5. 小结==> 队列其实是单链表的一个阉割版。(插入和删除操作相对单链表有限制)==> 可分为 带头结点 和 不带头结点 的两种方式1. 初始化链队列2. 链队列的入队3. 链队列的出队4. 链队列满队条件顺序存储的时候,内存空间都是预分...原创 2020-07-30 17:55:09 · 291 阅读 · 0 评论 -
【2】3. 队列的顺序存储
目录1. 概念理解2. 基本操作3. 用顺序存储的方式实现队列1. 概念理解队列 (Queue) => 定义 和 基本操作栈(Stack) 是只允许在一段进行插入和删除操作的线性表。 进栈 和 出栈。队列(Queue) 是允许在一端进行插入,在另一端删除的线性表。 入队 和 出队。实质上是一种操作受限的线性表。队尾: 允许插入数据的这一端队头:允许删除的一端队列特点: 先进先出 (FIFO)2. 基本操作InitQue...原创 2020-07-30 15:53:39 · 719 阅读 · 0 评论 -
【2】2 顺序栈_链栈 基本操作
1. 顺序栈操作上面的操作都是基于: 初始化栈的时候将 top 指针指向了 -1,有数据时指向栈顶元素。如果初始化的时候将 top 指针指向 0 位置,这种方式是将 top 指针指向下一个我们可以插入元素的位置。在这种情况下,进行进栈操作的时候,代码应该为 S.data[S.top++]=x;进行出栈操作的时候,代码应该为 x=S.data[--S.top];栈满条件: top==MaxSzie;=...原创 2020-07-29 17:13:32 · 657 阅读 · 0 评论 -
【2】1. 栈的定义和基本操作
1. 概念理解数据结构三要素: 逻辑结构、数据的运算、存储结构(物理结构) . 存储结构不同,运算实现的方式不同!定义 => 逻辑结构 基本操作 => 运算栈(Stack):只允许在一端进行插入或删除操作的线性表栈顶: 允许插入和删除的一段栈底: 不允许插入和删除的一段特点: 后进先出 Last In First Out (LIFO)逻辑结构:与普通的线性表相同数据的运算: 插入、删除操作有区别 (只能在栈顶进行!!!!!...原创 2020-07-29 16:08:41 · 439 阅读 · 0 评论 -
【1】8. 静态链表综合知识点
目录1. 概念理解2. 代码定义3. 实现基本操作4. 小结1. 概念理解<1>. 和单链表的区别单链表:各个结点在内存中星罗棋布、散落天涯。每个结点包含 数据域 和 指针域, 指针域 指向下一结点的位置。静态链表:分配一整片连续的空间,多个结点集中安置。 每个结点包含了 数据域 和 下一个结点的数组下标 ( 游标 ) 。各个数据元素存放在这一整片连续空间中某个位置。<2>. 细节说明<1> 静态链表中数组下标为 0 ...原创 2020-07-29 15:00:10 · 504 阅读 · 0 评论 -
【1】7. 循环列表综合操作代码
分为 循环单链表 和 循环双链 表1. 循环单链表单链表:表尾结点的 next 指针指向 NULL,循环单链表:最后一个结点的 next 指针指回了头结点。区分1:单链表:从一个结点出发只能找到后续的各结点,(前面结点情况不可知,除非获得了头结点)循环单链表:从一个结点出发可以找到其它任何一个结点。应用:删除结点 (p)要删除的话,需要对前驱结点修改其 next 指针,但是对于单链表,只知道 p 的指针,找不到它的前驱结点。而对于循环单链...原创 2020-07-29 06:31:10 · 252 阅读 · 0 评论 -
【1】6. 双链表综合操作代码
1. 结点类型定义定义双链表结点类型:prior : 先前的、优先的2. 初始化双链表3. 双链表的插入操作后插操作:前插操作: 在某个结点前面进行前插操作,双链表很容易定位到给定结点的前驱结点,然后再对其前驱结点进行后插操作。这样也实现了前插操作。双链表的插入操作均可以转化为后插操作!!4. 双链表的删除删除结点 p 的后续结点 qp->next = q->...原创 2020-07-28 22:46:29 · 3882 阅读 · 0 评论 -
【1】5. 头插法 尾插法 建立单链表代码分析
=> 分为 头插法 和 尾插法步骤:(带头结点情况)1. 初始化一个单链表2. 每次取一个数据元素,插入到表尾/表头有了一个单链表之后,接下来我们每次取一个数据元素插入到这个单链表的尾部,这个操作可以用之前实现的按位序插入这个基本操作来实现。https://blog.csdn.net/pikaqiu_JBR99/article/details/107593731尾插法建立单链表:初始化单链表设置变量 length 记录链表长度...原创 2020-07-27 19:51:36 · 1561 阅读 · 0 评论 -
【1】4. 单链表的两种查找方式
只探讨:带头结点的情况查找分为按位查找 =>GetElem(L,i) 获取表中第i个位置元素的值。按值查找 =>LocateElem(L,e) 在表中查找具有给定关键值的元素。按位查找思路: 明确函数返回值类型,代码实质在于定位到第i个结点,而定位操作在单链表按位序增加或者删除都已经实践过!分析(边界情况):当 i=0 时,这里将头结点视为了第0个结点。此时执行会跳过while循环,直接执行return p,即返回头结点。...原创 2020-07-27 18:11:13 · 3618 阅读 · 0 评论 -
【1】3. 线性表的链式表示_单链表的插入和删除操作
目录1. 按位序插入_带头结点2. 按位序插入_不带头结点指定结点的后插操作指定结点的前插操作3. 按位序删除_带头结点指定结点的删除1. 按位序插入_带头结点2. 按位序插入_不带头结点考试中两种情况都会考察! 指定结点的后插操作然后代码就可以修改成:指定结点的前插操作3. 按位序删除_带头结点ListDelete(&L,&...原创 2020-07-26 16:31:51 · 855 阅读 · 0 评论 -
【1】2. 线性表的链式表示_单链表定义和初始化
链式存储的方式下要找到某一个结点,则只能从第一个结点开始,利用指针的信息依次往后寻找,直到找到我们想要的结点为止。也就是说,单链表这种方式不支持随机存取。1. 代码定义一个单链表单链表是由一个一个的结点组成的,一个结点当中存放两部分东西:数据元素和指向下一结点的指针。所以可定义一个 struct 类型的结构体,用以表示一个结点。单链表中增加一个新的结点:在内存中申请一个结点所需的空间,并用指针 p 指向这个结点。(用 p 来接收 malloc 函数的返回值)每次都要...原创 2020-07-25 22:11:41 · 724 阅读 · 0 评论 -
【1】1. 线性表的顺序表示_插入删除和动态增加
定义了一个 Customer 结构类型,里面存储了两个整数,分别是 num 和 people ,两个整数,每个整数占4个字节。顺序表静态分配!!! ==> 数组顺序表动态分配!C语言中: 提供了 malloc、free 函数来 动态申请和释放内存空间malloc 函数实现的是 申请一整片的连续的存储空间,这一整片内存空间有一个起始内存地址,所以malloc 函数执行结束后会返回一个指向这一整片存储空间开始地址的指针。malloc 函数返回一个指针,...原创 2020-07-24 20:59:15 · 365 阅读 · 0 评论 -
【数据结构】参数引用“&“ 和 printf( “ x=%d\n “ ,x)
&表示 c++ 中的引用调用,==> 对参数的修改结果需要“带回来时” 需要用到。本质原因: 在 test 函数中,单纯参数的 x(无&),开辟了一个新内存存放参数 x, 将主函数中 x(内存地址和test函数中的 x地址不同) 的值复制过去。 test 函数对x的操作都是对复制值后的新地址进行操作,与主存的x没有关系。 一个是原件,一个是复印件,对复印件进行操作不影响原件。在第二个函数中,参数类型为引用类型,这就代表 &x 的x 不开辟...原创 2020-07-11 14:48:42 · 1439 阅读 · 1 评论 -
【vs2017】创建一个c语言项目
名称 位置 解决方案都是可更改的!------------------------------------------------------------------------------------------------------注:如果这里在Visual C++中找不到空项目(windows桌面中也找不到),原因是安装VS2017的时候,没有安装好相应的组件。只需要在控制面板中的卸载程序中找到VS2017,右键选择更改,然后下载相应的组件后重新操作即可!--...原创 2020-07-11 13:31:21 · 760 阅读 · 0 评论