![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 77
数据结构与算法
独在黑夜丶看湖面
好记性不如烂笔头
展开
-
字符串匹配_KMP算法
KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。首先,对于这个问题有一个很直接的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。这有什么难的?我们可以这样初始化:之后我们只需要比较i指针指向的字符和j指针指向的字符是否一致。如果一致就都向后移动,如果不一致,如下图:A和转载 2022-06-12 17:37:46 · 85 阅读 · 0 评论 -
队列存储结构的实现和基本操作
文章目录1. 什么是队列2. 顺序队列简单实现2.1 数组方式实现队列2.2 顺序队列另一种实现方法3. 链式队列及基本操作3.1 链式队列数据入队3.2 链式队列数据出队1. 什么是队列队列具有以下两个特点数据从队列的一端进,另一端出数据的入队和出队遵循"先进先出"的原则队列存储结构的实现有以下两种方式:顺序队列:在顺序表的基础上实现的队列结构链队列:在链表的基础上实现的队列结构2. 顺序队列简单实现2.1 数组方式实现队列顺序队列的底层使用的是数组,需预先申请一块足够大的内转载 2022-05-26 17:27:10 · 750 阅读 · 0 评论 -
栈存储结构的实现和基本操作
1. 什么是栈栈是只能从表的一端存取数据,另一端是封闭的,且遵循 “先进后出” 原则的线性存储结构。栈的开口端被称为栈顶;封口端被称为栈底。栈顶元素指的就是距离栈顶最近的元素,下图栈顶元素为元素 4;栈底元素指的是位于栈最底部的元素,下图栈底元素为元素 1。2. 顺序栈及基本操作顺序表模拟栈存储结构的实现思路:在顺序表中设定一个实时指向栈顶元素的变量 top,top 初始值为 -1,表示栈中没有存储任何数据元素,即栈是"空栈"。一旦有数据元素进栈,则 top 就做 +1 操作;反之,如果数据元素转载 2022-05-20 22:26:15 · 640 阅读 · 0 评论 -
双向循环链表
单链表通过首尾连接可以构成单向循环链表:双向链表也可以进行首尾连接,构成双向循环链表:当问题中涉及到需要 “循环往复” 地遍历表中数据时,就需要使用双向循环链表。1. 双向循环链表的创建创建双向循环链表,只需在创建完成双向链表的基础上,将其首尾节点进行双向连接即可。C 语言实现代码如下://创建双向循环链表line* initLine(line * head){ head=(line*)malloc(sizeof(line)); head->prior=NULL;转载 2022-05-19 22:58:45 · 254 阅读 · 0 评论 -
判断单链表是否为有环链表
有环链表并不一定就是循环链表。循环链表指的是“首尾相连”的单链表,而有环链表则指的是单链表中存在一个循环子链表,如下图所示是有环链表,但并不是循环链表:如果给定一个单链表,如何判断其是否为有环链表呢?常用的判断方法有 2 种。1. 方法1从给定链表的第一个节点开始遍历,每遍历至一个节点,都将其和所有的前驱节点进行比对,如果为同一个节点,则表明当前链表中有环;反之,如果遍历至链表最后一个节点,仍未找到相同的节点,则证明该链表中无环。注意,如果一个单链表为有环链表,基于单链表中各节点有且仅有 1 个指转载 2022-05-19 22:54:00 · 4811 阅读 · 0 评论 -
循环链表(约瑟夫环)的建立及实现
循环链表和普通链表相比,唯一的不同就是循环链表首尾相连,其他都完全一样。只需要将链表中最后一个结点的指针指向头结点,就能形成循环链表:循环链表实现约瑟夫环约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。如图所示,假设此时圆周周围有 5 个人,要求从编号为 3 的转载 2022-05-19 22:46:29 · 3005 阅读 · 0 评论 -
双向链表基本操作
假设创建好的双向链表如下图所示:1. 双向链表添加节点根据数据添加到双向链表中的位置不同,可细分为以下 3 种情况:1.1 添加至表头将新数据元素添加到表头,只需要将该元素与表头元素建立双层逻辑关系即可。换句话说,假设新元素节点为 temp,表头节点为 head,则需要做以下 2 步操作即可:temp->next=head; head->prior=temp;将 head 移至 temp,重新指向新的表头;例如,将新元素 7 添加至双链表的表头,则实现过程如图所示:1转载 2022-05-17 23:31:50 · 702 阅读 · 0 评论 -
双向链表的创建
文章目录1. 什么是双向链表2. 双向链表的创建1. 什么是双向链表双向链表含有两个指针域,分别指向当前节点的直接前驱节点和直接后继节点,双向链表适合需要大量地找某指定结点的前趋结点的情况:双向链表中各节点包含以下 3 部分信息,如下图所示:指针域:用于指向当前节点的直接前驱节点;数据域:用于存储数据元素;指针域:用于指向当前节点的直接后继节点。因此,双链表的节点结构用 C 语言实现为:typedef struct line{ struct line * prior; /转载 2022-05-17 23:19:11 · 1932 阅读 · 0 评论 -
判断两个单链表是否相交
文章转自: http://c.biancheng.net/data_structure/linear_list/所谓相交,是指有公共的部分,而 2 个单链表相交,则意味着它们有公共的节点,公共节点的数量可以是 1 个或者多个。单链表是线性表的一种,如果我们将 2 个单链表看做 2 条线段的话,下图则模拟了 2 条线段相交的所有可能情况。结合“单链表中每个节点有且仅有 1 个指针域”的特性,上图所示的这 3 种情况中,只有第 2 种情况符合单链表的特性,另外 2 种情况则破坏了此特性。因此要验证 2转载 2022-05-17 22:35:23 · 3054 阅读 · 0 评论 -
实现单链表的反转
所谓反转链表,就是将链表整体“反过来”,将头变成尾、尾变成头。如下图是反转之前的链表:经过反转后,得到的新链表如图所示:常用的实现方案有 4 种,分别为迭代反转法、递归反转法、就地逆置法和头插法。其中递归反转法更适用于反转不带头节点的链表;其它 3 种方法既能反转不带头节点的链表,也能反转带头节点的链表。1. 迭代反转链表实现思路: 从当前链表的首元节点开始,一直遍历至链表的最后一个节点,这期间会逐个改变所遍历到的节点的指针域,令其指向前一个节点。具体的实现需要借助 3 个指针,我们定义转载 2022-05-17 22:02:38 · 2267 阅读 · 0 评论 -
单链表的初始化
1. 链表的节点链表存储的数据元素,其物理存储位置是随机的,并通过指针表示数据之间逻辑关系链表中每个数据的存储都由以下两部分组成:数据元素本身,其所在的区域称为数据域;指向直接后继元素的指针,所在的区域称为指针域;链表节点结构如图所示:链表实际存储的是一个一个的节点,真正的数据元素包含在这些节点中链表中每个节点的具体实现,需要使用 C 语言中的结构体,具体实现代码为:typedef struct Link{ char elem; //代表数据域 struct L转载 2021-10-05 16:46:33 · 13909 阅读 · 4 评论 -
单链表的基本操作
1. 链表插入元素向链表中增添元素,根据添加位置不同,可分为以下 3 种情况:插入到链表的头部(头节点之后),作为首元节点;插入到链表中间的某个位置;插入到链表的最末端,作为链表中最后一个数据元素;虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操作,即可将新元素插入到指定的位置:将新结点的 next 指针指向插入位置后的结点;将插入位置前结点的 next 指针指向插入结点;例如,在链表{1,2,3,4}的基础上分别实现在头部、中间部位、尾部插入新元素 5,转载 2021-10-06 11:46:21 · 2065 阅读 · 0 评论 -
顺序表基本操作
1. 顺序表插入元素向顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况:插入到顺序表的表头;在表的中间位置插入元素;尾随顺序表中已有元素,作为顺序表中的最后一个元素;虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位置,然后做如下两步工作:将要插入位置元素以及后续的元素整体向后移动一个位置;将元素放到腾出来的位置上;例如,在 {1,2,3,4,5} 的第 3 个位置上插入元素 6,实现过程如下:遍历至顺序表转载 2021-10-04 20:40:38 · 4812 阅读 · 0 评论 -
顺序表初始化
1. 顺序表顺序表(顺序存储结构) 存储数据时,会提前申请一整块足够大小的物理空间,然后将数据按照次序依次存储到一整块连续的存储空间,存储时做到数据元素之间不留一丝缝隙使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如图所示:1.1. 顺序表的初始化顺序存储结构需要如下三个属性:存储空间的起始地址:数组的起始地址顺序表的最大存储容量:数组长度size顺序表的当前长度,也就是表中存储数据元素的个数:length自定义顺序表结构的C代码:typedef struct Tab转载 2021-10-04 17:15:28 · 17491 阅读 · 7 评论 -
数据结构绪论
文章参考:http://c.biancheng.net/data_structure/文章目录1. 什么是数据结构2. 数据结构到底学什么2.1. 线性表2.1.1. 顺序表2.1.2. 链表2.1.3. 栈和队列2.3. 树存储结构2.4. 图存储结构3. 数据的逻辑结构和物理结构3.1. 逻辑结构3.2. 物理结构(存储结构)4. 时间复杂度1. 什么是数据结构数据结构,直白地理解,就是研究数据的存储方式数据存储的目的是为了方便后期对数据的再利用,比如我们使用数组存储 {1,2,3,4,5转载 2021-10-04 15:07:52 · 123 阅读 · 0 评论