
数据结构与算法(c\c++)
学习数据结构与算法中的一些小随记
yrf-tan
大二蒟蒻
展开
-
学习随记五十二——十种基本的排序算法比较
基本的排序算法插入排序希尔排序堆排序归并排序快速排序计数排序基数排序桶排序十种基本的排序算法基本的排序算法前言1、基本的排序算法实现原理和算法描述及其代码1.1 冒泡排序1.2 选择排序1.3 插入排序1.4 希尔排序1.5 堆排序1.6 归并排序1.7 快速排序1.8 计数排序1.9 基数排序1.10 桶排序2、 基本排序算法的时间、空间复杂度分析3、各种排序算法的运行实例对比总结前言 数据排序是指按一定规则对数据进行整理排列, 为数据的进一步处理做好准备。在计算机领域主要使用的原创 2021-06-16 20:27:00 · 549 阅读 · 0 评论 -
学习随记五十一——桶排序
桶排序前言1、桶排序的算法描述2、桶排序的函数实现3、桶排序的运行分析3.1 时间复杂度3.2 运行实例分析4、整体代码总结前言 计数排序、基数排序与桶排序有很多相似的地方,其中都用到了桶子储存数据的思想。1、桶排序的算法描述 桶排序其实就是将元素按一定范围分割,然后装到一个个桶子中,桶子是有序的,再将桶子中的元素进行排序(对桶子中的元素可以使用其他排序方法,如快排,归并,插入,冒泡等,也可以递归地把元素再分割到一个个更小地桶子中直到每个桶子中最多只有一个元素,然后回溯即可),最后将桶子按照原创 2021-06-14 21:59:13 · 451 阅读 · 5 评论 -
学习随记五十——基数排序
基数排序1、基数排序的算法描述2、基数排序的函数实现3、基数排序的分析3.1 时间复杂度分析3.2 运行实例分析4、整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。前言:基数排序可以说是桶排序的一种特殊变型,它的基本思想也是利用了“桶子”.(桶子在概念上就是类似数组的容器,在这里我用数组来制造桶子)1、基数排序的算法描述 基数排序总共执行最高位轮,每次从最低位开始比较一直到最高位,元素不足的用0补齐,然后用一个数组记录各个桶子中的元素个数,每次按顺序放入各个原创 2021-06-13 19:08:58 · 386 阅读 · 0 评论 -
学习随记四十九——计数排序
计数排序1、计数排序的算法描述2、计数排序的函数实现3、计数排序的分析3.1 时间复杂度分析3.2 运行实例分析4、整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。前言:计数排序是一种线性时间复杂度的排序算法,前面的插入排序,归并排序,快速排序等等都是属于比较排序,而计数排序不是比较出来的是算出来的。1、计数排序的算法描述 为了避免空间的过多浪费,先遍历一遍待排序数组,找出其中的最大值和最小值,则计数数组的长度等于最大值减最小值加1(数组从0开始计数),将计数原创 2021-06-13 09:18:32 · 135 阅读 · 0 评论 -
学习随记四十八——递归实现快速排序
递归实现快速排序1、快速排序的算法描述2、快速排序的函数实现3、快速排序的分析3.1 时间复杂度分析3.2 运行实例分析3.3 整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。 前言:快排的思想其实和冒泡排序很像,冒泡排序是通过相邻两个元素间的不断交换最终完成排序,我觉得快速排序其实可以理解为从两个相邻的元素开始再发展到两段相邻的数组片段依次回溯进行比较,最终完成排序。1、快速排序的算法描述 快排和归并排序一样运用了递归的典型思想——分治。我先选取一个枢纽元原创 2021-06-12 18:14:36 · 394 阅读 · 4 评论 -
学习随记四十七——递归实现归并排序
递归实现归并排序#include<stdio.h>#include<time.h>#include<stdlib.h>#include<math.h>typedef int ElementType;const int N=1000000;void Swap(ElementType*,ElementType*);void Randomize(ElementType [],int); //随机化一个数组,参数为数组地址和长度 void原创 2021-06-09 20:51:16 · 473 阅读 · 2 评论 -
学习随记四十六——堆排序
堆排序1、堆排序算法分析2、堆排序代码3、堆排序分析1、时间复杂度2、运行时间实例分析3、整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。1、堆排序算法分析 我们可以通过建立一个二叉堆来对元素进行排序,有两种思路,一是先将这些元素建立一个二叉堆,执行N次删除最大元素的操作,用一个数组接收被删除的数据,这样就得到了元素的升序排列。这个算法的主要问题就是使用了一个附加数组,增大了空间开销,第二种实现方法是因为每次删除最大元素后堆的长度减1,所以可以将被删除的元素放在原创 2021-06-08 12:35:20 · 450 阅读 · 0 评论 -
学习随记四十五——希尔排序
希尔排序1、希尔排序的算法2、希尔排序的函数代码3、希尔排序的分析一些说明:在这里我假设的数组元素可以比较大小,且无重复元素,按照升序进行排序。1、希尔排序的算法 希尔排序属于比较相距一定间隔的排序算法。 核心思想:比较的间隔逐渐减小直到最小间隔为1,只比较相邻元素的最后一趟排序为止。由于这个原因希尔排序有时也被叫做缩小增量排序(diminishing increment sort). 我的算法描述:首先选择一个最小增量为1的增量序列。每次令当前增量为初始位置开始比较直到数组末尾;每次用一原创 2021-06-02 19:11:14 · 156 阅读 · 3 评论 -
学习随记四十四——插入排序
插入排序的详细分析1、插入排序的算法2、插入排序的函数代码3、插入排序的分析3.1 时间复杂度3.2 运行时间实例分析3.3 整体代码总结一些说明:在这里我假设的数组元素可以比较大小,且无重复元素,按照升序进行排序。1、插入排序的算法 插入排序属于只交换相邻元素的算法。 基本思想:将每次指向的数组元素在之前已排好序的元素中找到合适的位置插入,然后将其插入后的排好序的数组元素后挪。 具体实现:从第二个元素开始一直遍历到最后一个元素,每次令一个中间变量保存当前位置元素,然后开始从当前位置一直向前原创 2021-06-01 20:56:09 · 272 阅读 · 2 评论 -
学习随记四十三——B树(递归实现四——我的错误整体代码)
我的错误B树递归实现具体代码:花了很久的时间,最后还是没有达到我希望的功能,有点遗憾,但是在这个过程中我也学会了一些东西,首先要明白程序设计需求,再考虑设计模式,明确函数功能划分、接口设计,画出我实现的流程图,将我的实现算法能清晰表达出来再动手写伪代码,再手写具体代码自己纸上运行演算,最后再上机调试。由于我时间不是很多了,所以还有一些问题我就没有解决,留待非递归实现解决。之前各个部分的思路,具体实现都在我的同系列文章中了,就不在这里赘述。具体代码:#include<iostream>ty原创 2021-05-31 13:38:27 · 241 阅读 · 0 评论 -
学习随记四十二——B树(递归实现版——三、我的错误删除操作详解)
递归删除的一种“不恰当”方法详解前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsim原创 2021-05-31 13:20:01 · 200 阅读 · 0 评论 -
学习随记四十——B树(递归实现版——一、B树的一些介绍)
B树前言一、B树是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、B树是什么?二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport s.原创 2021-05-21 10:31:19 · 354 阅读 · 1 评论 -
学习随记三十八——生成N个结点的随机二叉查找树并计算时间
生成N个结点的随机二叉查找树完成这个程序需要三个主要功能实现,生成N个随机结点,生成一颗二叉查找树储存这N个结点,计算程序运行时间。生成N个随机的结点:我采用的方法是生成一个数组,数组按序存储,然后生成伪随机数交换数组元素即可实现二叉查找树:因为我不想使用二级指针,所以我在设计的时候每次返回根结点地址,若根结点为空则为其开辟一个结点空间使其数据域储存待插入元素,若非空则每次使用一个结点指针记录结点地址循环定位到合适位置生成一个结点储存待插入元素,然后使新生成的结点为结点指针保存的结点的子结点即可原创 2021-05-12 15:57:40 · 395 阅读 · 0 评论 -
学习随记三十七——统计二叉树中不同结点类型的个数
统计二叉树中不同结点类型的个数前言:收到非递归打印一个树的函数的启发,我可以利用栈来实现较高效率的统计二叉树中不同结点的个数**函数思路:**先声明一个结点指针类型的栈,进行循环,循环条件为结点指针非空或栈非空(当结点指针与栈都为空时说明已经进行到树的最右端,完成了树的遍历),每次循环时都先将结点的左边一条儿子入栈,然后若栈非空则取栈顶指针,然后出栈,若该结点有两个子结点则满结点变量加一,反之若有一个儿子则结点变量加一,否则则为树叶统计树叶的变量加一,然后移动结点到其右儿子,遍历其右子树;当循环结束时则原创 2021-05-11 21:19:21 · 353 阅读 · 0 评论 -
学习随记三十六——非递归实现伸展树
非递归实现伸展树文章目录非递归实现伸展树前言一、非递归操作与递归操作有什么不一样的地方?二、程序解析总结前言完成递归实现伸展树后将递归操作转化为非递归操作完成,详细介绍可以看我的第三十五篇随记一、非递归操作与递归操作有什么不一样的地方?非递归实现伸展树与递归实现相比较而言只是将函数的递归调用返回待操作的结点地址通过循环直接定位,以及将结点路径使用栈进行记录达到自底向上进行回溯的目的,结点的旋转是一样的,其他操作也十分类似。二、程序解析1. 结点声明typedef int Eleme原创 2021-05-11 20:12:52 · 160 阅读 · 0 评论 -
学习随记三十五——递归实现伸展树
系列文章目录前言在我完成非递归实现AVL树后,触类旁通后面相似的树的操作我也很快就实现了。一、伸展树是什么?我的感觉伸展树是一种结合了二叉查找树与AVl树特点的树,伸展树的插入、删除与二叉树无异二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwa原创 2021-05-09 20:09:59 · 268 阅读 · 0 评论 -
学习随记三十四——非递归实现AVL树
非递归实现AVL树提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录非递归实现AVL树前言一、设计思想二、使用步骤1.引入库2.程序剖析3.遇到的问题总结前言在我完成了递归实现Avl树的操作后想用非递归实现AVl树。历时许久,发现并解决了我之前存在的很多问题,比如经常需要考虑指针的运用并防止野指针的出现,也使我体验了不参考别人,完全自己独立设计程序的过程。在这个过程中我有许多构思,我需要不断比较分析优劣并找出可能出现的问题并解决,还要考虑不同的解决方案对其他部分的影响,还要原创 2021-05-05 16:24:42 · 694 阅读 · 0 评论 -
学习随记三十三——递归实现AVL树
递归实现AVL树什么是AVL树: AVL树是一种自调整树,在每次插入和删除后如果平衡被破坏了就会进行自我调整达到重新平衡,AVL树是一种特殊的二叉查找树,它允许左右子树高度最多相差一,当树的平衡遭到破坏时通过单、双旋转重新达到平衡,实现AVl树的关键在于插入,每次插入后要判断树是否平衡。结点声明:typedef struct Avlnode{ ElementType data=0; struct Avlnode* Left=nullptr; struct Avlnode* Right=nullp原创 2021-04-21 21:58:16 · 234 阅读 · 0 评论 -
学习随记三十二——不使用递归完成二叉查找树
不使用递归完成二叉查找树相较于使用递归,不使用递归实现二叉查找树的操作稍显复杂,但是效率要高,其中最复杂的是删除操作。结点声明:typedef struct TreeNode{ElementType data=0;struct TreeNode* Left=nullptr;struct TreeNode* Right=nullptr;}TreeNode;typedef TreeNode* Bintree;使用的函数:1、插入函数:int Insert(Bintree*,ElementTy原创 2021-04-17 09:47:57 · 203 阅读 · 0 评论 -
学习随记三十一——递归实现二叉查找树
二叉查找树什么是二叉查找树:左子树中的元素都比父节点元素小,右子树中的元素都比父节点中的元素大二叉查找树的基本操作:1、生成一颗空树我选择使用递归来完成,如果传入的地址非空就先递归删除左子树再递归删除右子树;也可以直接生成一个空根。2、查找元素先判断传入的指针是不是空指针,如果非空再进行比较,如果待查找元素比结点元素小则在该结点的左子树中递归查找,大则在右子树中递归查找,相等则返回该结点地址。3、插入元素*4、删除结点5、打印树中元素使用中序输出,先递归输出结点左子树的元素再递归输出右子原创 2021-04-13 08:47:40 · 427 阅读 · 0 评论 -
学习随记三十——双端队列
双端队列基本原理:就是将双链表运用到队列上整体代码:#include<iostream>typedef struct Queue{ int data; struct Queue* next=nullptr; struct Queue* previous=nullptr;}Queue;typedef struct Linkqueue{ Queue* front=nullptr; Queue* rear=nullptr;}Linkqueue;using namespace原创 2021-04-06 20:32:09 · 97 阅读 · 0 评论 -
学习随记二十九——使用单链表实现队列
使用单链表实现队列使用单链表实现队列其实和尾插法实现单链表的思路没什么两样,队列和栈其实就是运算受到限制的单链表,尾插法运用在队列中,头插法运用在栈中,现在我才比较深刻的理解了头插法和尾插法的原理和应用并熟练运用。基本思路:其实就是尾插法的变形,声明一个包含两个结点指针的结点,一个指向链表头一个指向链表尾,每次插入元素在表尾,删除元素在表头整体代码#include<iostream>typedef struct Queue{ int data; struct Queue* next原创 2021-04-06 09:59:38 · 297 阅读 · 0 评论 -
学习随记二十八——循环队列的实现
循环队列的实现基本思路:利用模运算来判断队列的空与满,其他操作与思路与最基本的用数组实现队列一样整体代码:#include<iostream>const int quesize=10;typedef struct Queue{ int data[quesize]={0}; int front=0; int rear=0;}Queue;using namespace std;int Isempty(Queue*); //判队空int Isfull(Queu原创 2021-04-04 21:55:10 · 116 阅读 · 0 评论 -
学习随记二十七——使用数组实现队列
使用数组实现队列基本思路:队列和栈其实差不多,都是运算受限制的线性表,操作原理类似,一个成员记录队首,一个成员记录队尾,当队首成员等于队尾成员时即队列空,当队尾成员等于数组最大长度减一时即队列满,但这种会造成假溢出,入队元素在队尾,出队元素在队首。整体代码:#include<iostream>const int quesize=100;typedef struct Queue{ int data[quesize]={0}; int front=0; int rear=0; in原创 2021-04-04 15:24:00 · 146 阅读 · 0 评论 -
学习随记二十六——支持FindMin操作的栈(链栈)
支持FindMin操作的栈(链栈)基本思路:在栈顶指针结构体中包含一个min指针指向最小元素即可整体代码;#include<iostream>typedef struct Stack{ int data; struct Stack* next;}Stack;typedef struct Linkstack{ Stack* top; Stack* min;}Linkstack;using namespace std;int Isempty(Linkstack*);int原创 2021-04-01 10:05:52 · 257 阅读 · 1 评论 -
学习随记二十五——支持FindMin的栈(顺序栈)
支持FindMin的栈(顺序栈)基本思路:没什么好说的声明一个含有min记录最小值的标志变量,每次入栈时比较下就可以了整体代码:#include<iostream>const int stacksize=100;typedef struct Stack{ int data[stacksize]; int top=-1; int min=data[0];}Stack;using namespace std;int Isempty(Stack*);int Isfull(Sta原创 2021-04-01 09:20:37 · 187 阅读 · 0 评论 -
学习随记二十四——使用一个数组创建两个栈(方法三)
使用一个数组创建两个栈(方法三)基本思路:将数组的第一、二个单元作为两个栈的栈底,一个栈使用奇数单元,一个栈使用偶数单元,当两个栈的栈顶都触顶时就认为栈满了,说实话这种方法实现还不如直接用数组创建一个栈。整体代码:#include<iostream> //这个程序只考虑了长度为偶数的情况const int stacksize=10;typedef struct Stack{ int data[stacksize]; int top1=0; int top2=1;原创 2021-03-31 21:11:55 · 183 阅读 · 0 评论 -
学习随记二十三——使用一个数组建立两个栈(方法二)
使用一个数组建立两个栈(方法二)基本思路;两个栈顶从中间分别向两边扩展,当触碰到了两边的边界就认为栈满了,我觉得我使用的第一种用一个数组创建两个栈的方法比这个要好,从两边向中间扩展对资源的利用更好且更灵活。问题;我刚开始在写的时候没有充分考虑到数组越界的问题,经过后面的调试发现的,以后在使用数组时多考虑。整体代码:#include<iostream>const int stacksize=10;typedef struct Stack{ int data[stacksize];原创 2021-03-31 20:06:40 · 158 阅读 · 0 评论 -
学习随记二十二——用一个数组实现两个栈(方法一)
用一个数组实现两个栈(方法一)基本思路:两个栈的栈底分别在两头,栈顶向中间趋近当栈顶相遇时即说明栈满整体代码;#include<iostream>const int stacksize=10;typedef struct Stack { int data[stacksize]; int top1=-1; int top2=10;}Stack;using namespace std;int Isempty(Stack*); //判栈空int Isfull(St原创 2021-03-31 16:53:06 · 163 阅读 · 0 评论 -
学习随记二十一——使用链栈完成平衡符号的检测(大,中,小括号)
使用链栈完成平衡符号的检测(大,中,小括号)基本思路与使用顺序栈完成平衡符号的检测一样,不再赘述。整体代码:#include<iostream>typedef struct Stack{ char ch; struct Stack* next;}Stack;typedef struct Linkstack{ Stack* top;}Linkstack;using namespace std;int Isempty(Linkstack*); //判栈空i原创 2021-03-28 21:18:29 · 260 阅读 · 0 评论 -
学习随记二十——使用顺序栈完成表达式括号(大,中,小)的平衡检测
使用顺序栈完成表达式括号(大,中,小)的平衡检测为什么要使用栈完成:刚开始我想利用标志变量来完成这项工作,后面发现了使用栈完成符号平衡检测的好处,因为封闭符号(如右括号)总是与最近的开放符号匹配(如左括号),所有一旦遇到封闭符号如果栈顶元素不是与之匹配的开放符号则说明这个表达式的符号不平衡,在符号的平衡检测中充分体现了栈这种先进后出表的作用,且利用栈来完成平衡符号的检测的算法时间复杂度是O(1)。**算法:**遇到开放符号(如左括号)则入栈,遇到封闭符号(如右括号)则出栈并检查弹出的符号是否是与这个封闭原创 2021-03-28 20:50:20 · 178 阅读 · 0 评论 -
学习随记十九——使用链栈将中缀表达式转换成后缀表达式并计算其结果
使用链栈将中缀表达式转换成后缀表达式并计算其结果基本思路我之前的使用顺序栈将中缀表达式转换成后缀表达式与使用链栈计算后缀表达式中有详细讲解,这里不在赘述。整体代码:#include<iostream>using namespace std;typedef struct Stack1{ string stack; struct Stack1* next;}Stack1;typedef struct Linkstack1{ struct Stack1* top;}Linksta原创 2021-03-28 11:04:21 · 367 阅读 · 0 评论 -
学习随记十八——用链栈将中缀表达式转换成后缀表达式
用链栈将中缀表达式转换成逆波兰表达式基本思想与我的用顺序栈实现将中缀表达式转换成后缀表达式相同,只是将入栈,出栈,判栈空等操作换成链栈的操作整体代码:#include<iostream>typedef struct Stack1{ std::string stack; struct Stack1* next;}Stack1;typedef struct Linkstack1{ struct Stack1* top;}Linkstack1;using namespace st原创 2021-03-28 10:38:32 · 362 阅读 · 0 评论 -
学习随记十七——使用顺序栈将输入的中缀表达式变成逆波兰表达式并计算结果
使用顺序栈将输入的中缀表达式变成逆波兰表达式并计算结果主要分成两部分,一是将中缀表达式变成逆波兰表达式,二是计算逆波兰表达式,在编写过程中我使用了模板函数和函数重载。基本思路和我之前的用顺序栈计算逆波兰表达式和用顺序栈将中缀表达式转换成逆波兰表达式相同。函数代码:#include<iostream>#include<string>const int stacksize=100;using namespace std;typedef struct Stack{ doub原创 2021-03-27 15:59:25 · 138 阅读 · 0 评论 -
学习随记十六——使用顺序栈将中缀表达式转换成逆波兰表达式
使用顺序栈将中缀表达式转换成逆波兰表达式基本思路:按序判断表达式,如果是数字输出并加空格区分;如果是操作符先判断栈是不是空的,如果栈是空的先判断待入栈的操作符是不是左括号,是左括号令计算左括号个数的标志变量自加,但不管是不是都将这个操作符入栈;如果栈非空则先比较待入栈操作符与栈顶操作符优先级,如果待入栈的操作符优先级不比栈顶操作符的优先级低则先判断待入栈操作符是不是右括号,若不是右括号则判断这个操作符是不是左括号,是左括号则令计算左括号的标志变量自加,但不管是不是都将这个操作符入栈;若待入栈的操作符是右原创 2021-03-27 15:10:32 · 128 阅读 · 0 评论 -
学习随记十五——关于链栈的问题
关于链栈的问题我尝试了直接声明一个结点指针来指向栈顶,但是我忽略了函数形参是值传递,就算是指针也是值传递,故用到了二级指针作为函数参数int Push(Linkstack **top,double x){ Linkstack *s=new Linkstack; s->data=x; s->next=*top; //top=&s; 之前的错误写法 *top=s; return 1; }之前的错误写法将新开辟的结点地址赋给指向原指针的指针,只是使得指向原指针的指针指向新原创 2021-03-25 19:11:51 · 393 阅读 · 0 评论 -
学习随记十三——关于指针的一些误区
关于指针的一些误区刚开始接触c语言时明白了在函数中交换两个变量的值需要用到一级指针,但是我忽略了就算用了一级指针也不过是将指针保存的值复制后传到函数中只是因为指针中保存的是变量的地址值,所有可以通过地址值来修改变量,但是本质上仍然是值的传递,所以在我写用链栈计算后缀表达式的程序时我直接将参数设置为结点指针在入栈时元素其实并没有入栈;int Push(Linkstack*top,double x){ Linkstack *s=new Linkstack; s->data=x; s->ne原创 2021-03-24 16:16:25 · 107 阅读 · 0 评论 -
学习随记十二——用链栈计算逆波兰表达式
用链栈计算逆波兰表达式基本过程与顺序栈差不多代码;#include<iostream>#include<string>typedef struct Stack{ double data; struct Stack* next;}Stack;typedef struct Linkstack{ struct Stack* top;}Linkstack;using namespace std;int Isempty(Linkstack*);int Push(Li原创 2021-03-23 14:17:13 · 126 阅读 · 0 评论 -
学习随记十一——用顺序栈计算逆波兰表达式
用顺序栈计算逆波兰表达式我遇到的主要问题:怎么储存表达式以及将表达式中的数字转化成基本数据类型,我看了许多博客尝试过用stringstream的方法,但是每次遇到不知名错误调试求证无果,后找到了c++自带的类型转换函数stod,真的很棒(๑•̀ㅂ•́)و✧。学到的一些知识:后缀表达式的算法,string与基本数据类型间的转换,以及用erase函数清空string变量后缀表达式的算法:遇到数字存入栈中,遇到操作符号弹出两个数字计算后存入栈中直到只剩最后结果代码实现(包括我的之前的错误代码):注:我是原创 2021-03-21 23:13:36 · 151 阅读 · 0 评论 -
学习随记十——分别用vector数组和链表创建自调整表
分别用vector数组和链表创建自调整表使用vector数组的算法:先根据输入的元素动态创建一个vector数组,然后在其中查找元素若找到记录下标,然后删除这个单元,再新建一个和原数组大小相等的数组,将找到的元素作为新数组的首个元素再将原数组整体拷贝给新数组的除首单元的单元即可使用链表的算法:先根据输入的元素动态的创建一个链表,然后在其中查找元素,若找到则假设储存的数据与待查找元素相同结点为p,使p的前一个结点指向p的下一个结点,p指向头结点指向的结点,再使头结点指向p即可整体代码:原创 2021-03-20 12:02:36 · 343 阅读 · 3 评论