数据结构
小虾米_2018
专注于C、C++、嵌入式系统、网络、驱动编程~
展开
-
数据结构—希尔、快速、堆、归并排序
1.希尔排序希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。1.1 基本思想将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序...原创 2019-08-02 15:06:44 · 737 阅读 · 0 评论 -
数据结构—选择、插入、冒泡排序
排序的分类排序的分类:排序分为插入排序、选择排序、交换排序、归并排序四大类,详细分类如下图:七大经典排序:冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序1.简单选择排序1.1 基本思想每一趟 (例如第 i 趟,i = 0, 1, …, n-2)在后面 n-i 个待排的数据元素中选出关键字最小的元素,作为有序元素序列的第 i 个元素。R[0..i]...原创 2019-08-01 22:54:39 · 262 阅读 · 0 评论 -
数据结构—习题2.6 通过一趟遍历找出单链表中的最大值
1.题目描述设计一个算法,通过一趟遍历在单链表中确定值最大的结点。2.题目分析假定第一个结点中数据具有最大值,依次与下一个元素比较,若其小于下一个元素,则设其下一个元素为最大值,反复进行比较,直到遍历完该链表。int GetMax(LinkList L){ if (L->next == NULL) return NULL; LNode *pmax, *p; p...原创 2019-07-03 09:16:44 · 18811 阅读 · 2 评论 -
数据结构—习题2.5 将一个带头结点的单链表分解成两个单链表
1.问题描述设计算法将一个带头结点的单链表L1分解为两个具有相同结构的链表L2、L3,其中L2表的结点为L1表中值小于零的结点,而L3表的结点为L1表中值大于零的结点(链表L1中的元素为非零整数,要求L2、L3表利用L1表的结点)。2.题目分析L2表的头结点使用原来L1表的头结点,为L3表新申请一个头结点。从L1表的第一个结点开始,依次取其每个结点p,判断结点p的值是否小于0,利用前插法...原创 2019-07-03 09:16:18 · 6761 阅读 · 0 评论 -
数据结构—二叉树线索化(线索化的先序、中序、后序遍历)
1.线索二叉树基本概念二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息,n个节点的二叉树中含有n+1个空指针域。 试做如下规定: 若结点有左子树,...原创 2019-07-14 21:23:00 · 10751 阅读 · 2 评论 -
数据结构—栈运用之括号匹配检验(LeetCode 20)
1.案例分析检验算法借助一个栈,每当读入一个左括号,则直接入栈,等待相匹配的同类右括号;每当读入一个右括号,若与当前栈顶的左括号类型相同,则二者匹配,将栈顶的左括号出栈,直到表达式扫描完毕在处理过程中,还要考虑括号不匹配出错的情况。2.算法步骤①初始化一个空栈S ②设置一标记性变flag,用来标记匹配结果以控制循环及返回结果,1表示正确匹配,0表示错误匹配,fag初值为1。 ③扫描表...原创 2019-07-04 20:37:20 · 5222 阅读 · 1 评论 -
数据结构—习题2.3 求两个递增链表的交集
1.问题描述已知两个链表L1和L2分别表示两个集合,其元素递增排列。请设计算法求出L1与L2的交集,并存放于L1链表中。2.题目分析只有同时出现在两集合中的元素才出现在结果表中,合并后的新表使用头指针L3指向。p1和p2分别是链表L1和L2的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表L1和L2均为到达表尾结点时,如果两个表中相等的元素时,摘取L1表中的元...原创 2019-07-03 00:08:06 · 4800 阅读 · 1 评论 -
数据结构—习题2.1 递增链表的合并
1.题目描述将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。2.题目分析合并后的新表使用头指针L3指向,p1和p2分别是链表L1和L2的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表L1和L2均为到达表尾结点时,依次摘取其中较小者重新链接在L3表的最后。如果两个表中的...原创 2019-07-03 00:07:20 · 1295 阅读 · 1 评论 -
数据结构—栈的运用之数制转换
1.案例分析当将一个十进制整数N转换为八进制数时,在计算过程中,把N与8求余得到的八进制数的各位依次进栈,计算完毕后将栈中的八进制数依次出栈输出,输出结果就是待求得的八进制数。2.算法步骤①初始化一个空栈S。 ②当十进制数N非零时,循环执行以下操作: 把N与8求余得到的八进制数压入栈S; N更新为N与8的商。 ③当栈S非空时,循环执行以下操作: 弹出栈顶元素e; 输出...原创 2019-07-04 20:37:08 · 4394 阅读 · 0 评论 -
数据结构—遍历、创建二叉树
1.遍历二叉树算法描述遍历二叉树( traversing binary tree)是指按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。访问的含义很广,可以是对结点做各种处理,包括输出结点的信息,对结点进行运算和修改等。 遍历二叉树是二叉树最基本的操作,也是二叉树其他各种操作的基础,遍历的实质是对二又树进行线性化的过程,即遍历的结果是将非线性结构的树中结点排成一个线...原创 2019-07-14 20:44:38 · 1341 阅读 · 0 评论 -
数据结构—习题2.8 删除递增有序链表中值大于mink且小于maxk的所有元素
1.题目描述设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同 )。2.题目分析分别查找第一个值>mink的结点和第一个值 ≥maxk的结点,再修改指针,删除值大于mink且小于maxk的所有元素。void Delete(LinkList &L, int mink, int...原创 2019-07-03 09:18:34 · 17130 阅读 · 3 评论 -
数据结构—习题2.9 交换双向循环链表的结点p和它的前驱结点
1.问题描述已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。2.问题分析知道双向循环链表中的一个结点,与前驱交换涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链。void Change(LinkList p) { DLnode *q; q = p->...原创 2019-07-03 09:18:41 · 5245 阅读 · 0 评论 -
数据结构—栈与队列的基本概念
1.栈和队列的定义和特点1.1 栈定义:只能在表的一端(栈顶)进行插入和删除运算的线性表。 逻辑结构:与线性表相同,仍为一对一关系。 存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见。 运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。 实现方式:关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。基本操作有入栈、出栈、读栈顶元...原创 2019-07-03 09:20:16 · 1309 阅读 · 0 评论 -
数据结构—排序的概念和分类
1.排序的一般定义排序是计算机内经常进行的一种操作,其目的是将一组“无序”的数据元素调整为“有序”的数据元素。 例如: 将下列关键字序列:52, 49, 80, 36, 14, 58, 61, 23, 97, 75 调整为:14, 23, 36, 49, 52, 58, 61 ,75, 80, 97 2.排序的数学定义假设含n个数据元素的序列为{ R1, R2, …, Rn}...原创 2019-08-01 16:01:04 · 934 阅读 · 0 评论 -
数据结构—树和二叉树
1.树的定义树的定义:树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0);或为非空树,对于非空树T: (1)有且仅有一个称之为根的结点; (2)除根结点以外的其余结点可分为m(m>0)个互不相交的有限集T1, T2, …, Tm, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 2.树的基本术语根:即根结点(没有前驱) 叶子:即终端结点(...原创 2019-07-14 20:44:23 · 305 阅读 · 0 评论 -
数据结构—习题3.2 用栈判断回文字符串
1.问题描述回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)2.题目分析将字符串前一半入栈,然后,栈中元素和字符串后一半进行比较。即将第一个出栈元素和后一半串中第一个字符比较,若相等,则再出栈一个元素与后一个字符比较,……,直至栈空,结论为字符序列是回文。在出栈元素与串中...原创 2019-07-11 16:07:50 · 7537 阅读 · 1 评论 -
数据结构—习题3.1 双栈-按栈号进行操作
1.问题描述将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。双栈数据结构的定义如下:Typedef struct{ int top[2],bot[2]; //栈顶和...原创 2019-07-11 15:14:21 · 2137 阅读 · 1 评论 -
数据结构—哈夫曼编码
1.哈夫曼编码的主要思想在进行数据压缩时,为了使压缩后的数据文件尽可能短,可采用不定长编码。 其基本思想是:为出现次数较多的字符编以较短的编码。 为确保对数据文件进行有效的压缩和对压缩文件进行正确的解码,可以利用哈夫曼树来设计二进制编码。 哈夫曼树中,约定左分支标记为0,右分支标记为1,则根结点到每个叶子结点路径上的0、1序列即为相应字符的编码。2.哈夫曼编码有关概念前缀编码:如果...原创 2019-07-16 21:25:26 · 12416 阅读 · 5 评论 -
数据结构—链栈
1.链栈的表示链栈的存储结构与单链表的存储结构相同。由于栈是在栈顶进行删除和添加元素的,因此,将链表的首部作为栈顶是最方便的。而且没有必要像单链表那样为了操作简单而附加一个头结点。 在链栈中注意指针的方向是从栈顶指向栈底。// 链栈的存储结构typedef struct StackNode{ int data; struct StackNode *next;}Sta...原创 2019-07-03 09:20:33 · 16866 阅读 · 15 评论 -
数据结构—顺序栈
顺序栈是利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的元素数据。分别使用top指针和base指针指向栈顶和栈底。栈为空的标志是:top==base. 要注意的是:非空栈的栈顶指针总是指向栈顶元素的上一个位置。 栈满时的处理方法: 1、报错,返回操作系统。 2、分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈。 1.顺序栈的表示#def...原创 2019-07-03 09:20:27 · 8203 阅读 · 5 评论 -
数据结构—哈夫曼树
1.哈夫曼树的基本概念路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。 路径长度:路径上的分支数目称作路径长度 树的路径长度:从树根到每一结点的路径长度之和。 权:赋予某个实体的一个量,是对实体的某个或某些属性的数值化描述。在数据结构中实体有结点(元素)和边(关系)两大类,所以对应有结点权和边权。结点权或边权具体代表什么意义,由具体情况决定。如果在一棵树中的结点上带有...原创 2019-07-16 21:25:19 · 2110 阅读 · 0 评论 -
数据结构—队列的链式表示和实现
链队是指采用链式存储结构实现的队列。通常链队用单链表来表示,如图所示。一个链队显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。这里和线性表的单链表一样,为了操作方便起见,给链队添加一个头结点,并令头指针始终指向头结点。1.队列的链式表示typedef struct QNode { int data; struct QNode *next;}QNo...原创 2019-07-03 17:30:04 · 2339 阅读 · 0 评论 -
数据结构—队列的顺序表示和实现--循环队列
和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个整型变量 front和rear分别指示队列头元素及队列尾元素1.队列的顺序表示typedef struct{ int *base; // 分配存储空间 int front; // 队头指针 int rear; // 队尾指针 }SqQueue;...原创 2019-07-03 17:29:08 · 1658 阅读 · 2 评论 -
数据结构—带头结点单循环链表的合并
单循环链表的合并设两个单循环链表A和B(都带头结点,设A和B都非空),合并A和B的思路是: 将A最后一个结点的指针域指向B的第一个结点(即指向头结点后的那个结点,首元结点),然后将B的最后一个元素的指针域指向A的头结点,释放B的头结点。算法: 1.获取A的最后一个结点,设为p1; 2.获取B的最后一个结点,设为p2; 3.令p1的指针域指向B的第一个结点,p1->next=...原创 2019-06-19 17:47:34 · 1176 阅读 · 0 评论 -
数据结构—带头结点的单循环链表
1.基本操作循环链表的特点是最后一个元素的指针域指向头结点。因此对于循环链表的初始化(设表的头结点是L, 不再是L->next=NULL,而是L->next=L。循环链表为空时,头结点的下一个结点依然是头结点本身。因此但虚幻链表的初始化如下://初始化 int InitList(LinkList &L){ L=new LNode; L->next=L...原创 2019-06-19 16:17:25 · 22197 阅读 · 3 评论 -
数据结构—单链表实现学生信息管理系统
代码 main.cpp#include<iostream>using namespace std;typedef struct STU { char name[20]; char sno[20]; int age; float score;}Student;typedef struct LNode { Student data; struct LNo...原创 2019-06-19 13:50:22 · 16144 阅读 · 7 评论 -
数据结构—线性表的链式表示
1.相关概念链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式表示又称为非顺序映像或链式映像。 与链式存储有关的术语: 1、结点:数据元素的存储映像。由数据域和指针域两部分组成 2、链表: n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构 3、单链表、双链表、循环链表: 结点只有一个指针域的链表...原创 2019-06-19 11:08:11 · 2675 阅读 · 1 评论 -
数据结构—线性表的顺序表示
1.相关概念线性表的顺序表示又称为顺序存储结构或顺序映像。 顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。 简言之,逻辑上相邻,物理上也相邻。 顺序存储方法:用一组地址连续的存储单元依次存储线性表的元素,可通过数组V[n]来实现。2.顺序表的类型定义//--------顺序表的存储结构----#define MAX 100 //顺序表...原创 2019-06-18 21:45:47 · 599 阅读 · 0 评论 -
数据结构—带头结点单链表的合并
单链表的合并一般单链表的合并和前一篇博客写的但循环链表的合并思路基本一致,区别在于合并后不用将最后一个结点的指针域指向头结点。void Combine(LinkList L1, LinkList L2) { LNode *p1; LNode *p2; p1 = L1->next; p2 = L2->next; LNode *s1, *s2; while (p1) ...原创 2019-06-19 21:21:55 · 1446 阅读 · 0 评论 -
数据结构—只设置尾指针而不设置头指针的循环链表的合并
循环链表合并(只带尾指针)对循环链表,有时不给出头指针,而给出尾指针可以更方便的找到第一个和最后一个结点。如何查找开始结点和终端结点? 开始结点:rear->next->next 终端结点:rear 循环链表的合并:void Combine(LinkListLast Ta, LinkListLast Tb) { LNode *p; p = Ta.r...原创 2019-06-20 13:38:43 · 4942 阅读 · 0 评论 -
数据结构—习题2.7 链表翻转(递归与迭代两种实现)LeetCode(206)
链表的翻转是程序员面试中出现频度最高的问题之一,常见的解决方法分为递归和迭代两种。最近在复习的时候,发现网上的资料都只告诉了怎么做,但是根本没有好好介绍两种方法的实现过程与原理。所以我觉得有必要好好的整理一篇博文,来帮忙大家一步步理解其中的实现细节。 我们知道迭代是从前往后依次处理,直到循环到链尾;而递归恰恰相反,首先一直迭代到链尾也就是递归基判断的准则,然后再逐层返回处理到开头。总结来说,链...原创 2019-07-03 09:18:27 · 494 阅读 · 0 评论 -
数据结构—递归运用之八皇后问题(回溯算法)
1.回溯法回溯法,又被称为“试探法”。解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择。这种走不通就回退再走的方法就是回溯法。2.递归与回溯很多人认为回溯和递归是一样的,其实不然。在回溯法中可以看到有递归的身影,但是两者是有区别的。 回溯法从问题本身出发,寻找可能实现的所有情况。和穷举法的思想相近,不同在于...原创 2019-07-03 13:41:04 · 1211 阅读 · 1 评论 -
数据结构—全排列的递归解法
1.全排列的递归实现全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。P(n, n)中的第一个n表示元素的个数,第二个n表示取多少个元素进行排列。 给定一个n个元素数组,其全排列的过程可以描述如下: 任意取一个元素放在第一个位置,则有n种选择; 再剩下的n-1个元素中再取一个元素放在第二个位置则有n-1种选择,此时可以看做对n...原创 2019-07-03 09:22:13 · 658 阅读 · 1 评论 -
数据结构—递归运用之n阶Hanoi问题
1.问题的解法是递归的还有一类问题,虽然问题本身没有明显的递归结构,但用递归求解比迭代求解更简单,如 Hanoi塔问题、八皇后问题、迷宫问题等。2.n阶Hanoi问题问题描述 假设有3个分别命名为A、B和C的塔座,在塔座A上插有n个直径大小各不相同,依小到大编号为1,2,…,n的圆盘(如图所示)现要求将塔座A上的n个圆盘移至塔座C上,并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: ...原创 2019-07-03 09:21:27 · 1230 阅读 · 0 评论 -
数据结构—递归运用之遍历输出链表中的各个节点
1.数据结构是递归的某些数据结构本身具有递归的特性,则它们的操作可递归地描述 例如,对于链表,其结点 LNode的定义由数据域data和指针域next组成,而指针域next是一种指向LNode类型的指针,即 LNode的定义中又用到了其自身,所以链表是一种递归的数据结构。 对于递归的数据结构,相应算法采用递归的方法来实现特别方便。2.遍历输出链表中各个结点的递归算法算法步骤 ①如果...原创 2019-07-03 09:21:17 · 6942 阅读 · 0 评论 -
数据结构—递归运用之斐波拉切数列、阶乘问题
1.定义是递归的有很多数学函数是递归定义的,如大家熟悉的阶乘函数和二阶斐波拉切数列2.用分治法求解该问题的算法描述阶乘问题int fact(int n){ if (n == 0) { return 1; } else { return n*fact(n - 1); }}二阶斐波拉切数列int fibolacci(int n){ if (n ...原创 2019-07-03 09:21:09 · 323 阅读 · 0 评论 -
数据结构—栈与递归
1.递归的基本思想所谓递归,就是有去有回。 递归的基本思想,是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。 最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说,必须先解决子问题,再基于子问题来解决当前问题。 或者可以这么理解:递归解决的是有依赖顺序关系的多个问题。我们假设一个抽象问题有两个时...原创 2019-07-03 09:20:54 · 1310 阅读 · 0 评论 -
数据结构与算法C语言版—绪论
1.基本概念和术语1、数据(data):所有能输入到计算机中去的描述客观事物的符号 数值性数据 非数值性数据(多媒体信息处理) 2、数据元素(data element):数据的基本单位,也称结点(node)或记录(record) 3、数据项(data item):有独立含义的数据最小单位,也称域(field) 三者之间的关系:数据 > 数据元素 > 数据项 例...原创 2019-06-17 15:26:59 · 7481 阅读 · 1 评论 -
数据结构—有序表的合并
1.有序表合并问题描述:已知线性表La 和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列。 例如: La=(1 ,7, 8) Lb=(2, 4, 6, 8, 10, 11) Lc=(1, 2, 4, 6, 7 , 8, 8, 10, 11) 2.有序的顺序表合并算法步骤 创建一个空表Lc 依次从L...原创 2019-06-21 11:51:44 · 18140 阅读 · 3 评论 -
数据结构—一般线性表的合并
1.一般线性表的合并问题描述:假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合 A=A∪B。 La=(7, 5, 3, 11) Lb=(2, 6, 3) La=(7, 5, 3, 11, 2, 6) 算法步骤: 依次取出Lb中的每个元素,执行以下操作: 在La中查找该元素 如果找不到,则将其插入La的最后 2.顺序表实现//合并void...原创 2019-06-21 10:06:52 · 12005 阅读 · 3 评论