- 博客(50)
- 收藏
- 关注
原创 单链表-代码精简版
单链表是一种**动态存储的线性数据结构**,其特点是**逻辑上连续,物理上非连续**,每个节点包含**数据域**和指向下一个节点的**指针域**。- **优点**:动态内存分配,插入/删除时间复杂度为`O(1)`(已知位置时)[1](@ref)[16](@ref)。**逻辑**:将新节点插入到`pos`节点之后,时间复杂度为`O(1)`[24](@ref)[57](@ref)。**逻辑**:新节点的`next`指向原头节点,头指针更新为新节点[1](@ref)[24](@ref)。// 数据类型可自定义。
2025-03-10 22:56:12
651
原创 6. 归并排序
基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法 (Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序 列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二 路归并。
2025-03-04 22:25:31
216
原创 5. 快速排序
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序 元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有 元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所 有元素都排列在相应位置上为止。
2025-03-04 21:13:58
122
原创 2.希尔排序(缩小增量排序)
希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离未得记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当达到1时,所有记录在统一组内排好序。
2025-02-28 20:24:25
149
原创 1.直接插入排序
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j], 且r[i] 在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。排序:所谓排序,就是使一串记录,按照其中某些关键字的大小,递增或递减的排列起来的操作。
2025-02-28 04:53:48
103
原创 数据结构之二叉树(二)
1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且节点总数是2^k-1,则它就是满二叉树。2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为k的,有n个结点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从1至n的节点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。
2025-02-25 04:18:00
231
原创 数据结构之二叉树的定义及实现
主要的定义:节点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的为6叶节点或终端节点:度为0的节点称为叶节点;如上图:B,C,H,I等节点为叶节点分支节点或非终端节点:度不为0的节点;如上图:D,E,F,G等节点为分支节点父节点或者双亲结点节点:若一个节点含有子节点,则这个节点成为其子节点的父节点子节点或孩子节点:一个节点含有的子树的根节点称为该节点的子节点兄弟节点:具有相同父节点的节点互称为兄弟节点树的度:一棵树中最大节点的度称为树的度。
2025-02-23 23:12:21
764
原创 数据结构之队列
1.1 队列的概念队列:只允许在一段进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头1.2 队列的结构。
2025-02-19 17:19:34
287
原创 数据结构之栈
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。
2025-02-19 16:10:01
680
原创 带头双向循环链表
链表的分类实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:怎么算出8种情况:每次两种情况,三次,所以是2*2*2=81. 单向或者双向2. 带头或者不带头3. 循环或者非循环虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:1. 无头单向非循环链表:结构简单,一般不会单独用来单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希表,图的邻接表等等。另外这种解构在笔试面试中出现很多。2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。
2025-02-17 23:39:23
612
原创 单链表的概念,结构和优缺点
数据域用来存储数据,指针域用来存储下一个结点的指针。单链表的头结点指向第一个结点,最后一个结点的指针域为空。链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。单链表是由一系列节点组成的线性结构,每个结点包含两个域。单链表的英文为:Single linked list --简写为SL。1. 插入和删除操作效率高(只需修改指针的指向)3. 链接信息的丢失 (无法访问前一个节点)2.12 单链表删除pos之后的值。2.11 单链表删除pos的值。
2025-02-17 00:01:08
234
原创 线性表之顺序表
线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串。顺序表是要连续存放的,这个连续存放,不是指的是值连续,而是空间连续(意思是你存放的时候,不能挑着存,必须从0下标开始,依次向后存放)顺序表不能随意存储,顺序表必须从0下标开始,依次向后存放,意思就是它是顺序存储的,不会出现空一个位置的情况。动态顺序表:也是基于数组实现的,只不过它可以实现扩容,而数组是固定长度大小的。数组的元素是可以随机存放的,因为:数组通过下标访问是可以任意存储的。
2025-02-16 04:36:21
886
原创 C语言内存管理函数
会请求操作系统分配一定量的内存。一般实现比较复杂,这里给出一个非常简化的版本。将指定的内存区域的每个字节设置为指定的值。是调整动态内存块的大小,通常会先调用。面试里会遇到让自己编写一个内存管理函数。用于复制源内存到目标内存。处理重叠内存区域的复制。用于释放先前分配的内存。比较两个内存块的内容。
2024-12-30 22:12:11
158
原创 获得一个干净的PX4 `v1.8.0` 版本
2. **清理未跟踪的文件和目录**: 为了删除所有未跟踪的文件和目录,如 `ROMFS/px4fmu_common/init.d-posix/` 和 `src/modules/px4_simulink_app/`,运行: ```shell git clean -fd ``` `-f` 选项是强制执行, `-d` 表明除了删除未跟踪的文件外,还要删除未跟踪的目录。通过运行 `git status` 检查仓库状态,确保它显示为“干净”的,也就是没有未跟踪的文件或未提交的更改。
2024-04-22 03:08:12
952
原创 C语言-结构体
要访问结构体成员,我们需要引入一个新的运算符号 —点号(.)运算符。比如book.title就是引用book结构体的title成员,他是一个字符数组;而book.price则是引用book结构体的price成员,它是一个浮点型的变量。其语法和数组指定初始化元素类似,不过结构体指定初始化成员使用点好(.)运算符和成员名。struct 结构体名称 数组名[长度];struct 结构体名称 结构体变量名。struct 结构体名称。struct 结构体名称。struct 结构体名称。(*结构体指针).成员名。
2024-02-11 03:11:08
461
1
原创 C语言-高级宏定义
内联函数虽然节省了函数调用的时间消耗,但由于每一个函数出现的地方都要进行替换,因此增加了代码编译的时间。宏定义只是简单地进行替换,并且由于预处理是在编译之前进行,而编译工作的任务之一就是语法检查,所以编译器不会对宏定义进行语法检查。在带参数的宏定义中,#运算后面应该跟一个参数,预处理器会把这个参数转换为一个字符串。现在的编译器也很聪明,就算你不写inline,他也会自动将一些函数优化成内联函数。其中...表示使用可变参数,_VA_ARGS_在预处理中被实际的参数集所替换。宏定义不需要定义参数类型。
2024-02-11 02:08:17
249
原创 C语言-C语言的内存布局规律
堆是用于存放程序运行中被动态分配的内存段,它的大小并不固定,可动态扩展或缩小。当利用free等函数释放内存时,被释放的内存从堆中被剔除。BSS段通常是指来存放程序中未初始化的全局变量的一块内存区域。栈是函数执行的内存区域,通常和堆共享同一片区域。-栈的生存周期由函数调用开始到函数返回时结束,函数之间的局部变量不能互相访问。-堆的生存周期由动态申请到程序员主动释放为止,不同函数之间均可自由访问。-栈由系统自动释放到函数返回时结束,函数之间的局部变量不能互相访问。-栈则相反,是由高地址向低地址发展。
2024-02-09 15:32:00
234
原创 C语言-动态内存管理
如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是void指针(void*),所以它可以被转换成任何类型的数据;calloc函数在内存中动态的申请nmemb个长度为size的连续内存空间(即申请的总内存空间尺寸为nmemb *size),这些内存空间全部被初始化为0。-如果新分配的内存空间比原来的大,则就内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间,可能会导致数据丢失,慎用!-如果size参数为0,并且ptr参数不为NULL,那么调用该函数就相当于调用free(ptr)
2024-02-09 14:52:12
1237
原创 C语言-递归
快速排序算法的基本思想是:通过一趟排序将待排序元素分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,重复上述步骤知道排序完成。实现递归要满足两个基本条件。-设置了正确的结束条件。
2024-02-09 01:16:16
205
原创 C语言-作用域和链接属性
函数在声明的时候可以不写参数的名字(但参数类型是必须要写上的),其实函数原型的参数名还可以随便写一个名字,不必与形式参数相匹配(当然,这样做没有任何意义)。只有具备文件作用域的标识符才能拥有external或internal的链接属性,其他作用域的标识符都是none属性。在代码块中定义的变量,具有代码块作用域。任何在代码块之外声明的标识符都具有文件作用域,作用范围是从他们声名位置开始,到文件结尾处都是可以访问的。当变量被定义在程序的不同位置时,它的作用范围是不一样的,这个作用范围就是我们所说的作用域。
2024-02-08 03:54:59
431
原创 C语言-指针函数和函数指针
使用指针变量作为函数的返回值,就是指针函数。不要返回局部变量的指针。函数指针->int (*p)();指针函数->int *p();
2024-01-29 23:00:53
220
原创 C语言-函数
所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。类型名 函数名(参数列表)
2024-01-29 18:37:42
201
原创 C语言-常量和指针
可以通过解引用来读取指针指向的数据。不可以通过解引用修改指针指向的数据。指向“指向常量的常量指针”的指针。指针可以修改为指向不同的常量。指针可以修改为指向不同的变量。指针指向的值也不可以被修改。指针指向的值可以被修改。指向非常量的常量指针。指针本身不可以被修改。指针本身不可以被修改。
2024-01-29 17:12:17
139
原创 C语言-指针
当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于指向距离指针所在位置向前或向后的第n个元素。void指针我们把它称之为通用指针,就是可以指向任何类型的数据。也就是说,任何类型的指针都可以赋值给void指针。需要郑重强调的是:p+1并不是简单的将地址加1,而是指向数组的下一个元素。对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法。//定义一个指向字符型的指针变量。指针数组是一个数组,每个数组元素存放一个指针变量。数组指针是一个指针,它指向的是一个数组。
2024-01-29 05:12:07
130
原创 C语言-二维数组
/访问a数组中第1行第1列的元素。//访问b数组中第2行第4列的元素。//访问c数组中第4行第4列的元素。同样注意下标的取值范围,以防止数组的越界访问。类型 数组名 [常量表达式][常量表达式]char b[4][5];
2024-01-09 20:50:11
336
原创 C语言-字符串处理函数
拷贝字符串 :strcpy和strncpy。strlen获取字符串长度(字符的个数)连接字符串:strcat和strncat。比较字符串:strcmp和strncmp。
2024-01-09 20:17:24
354
原创 C语言-拾遗
最后赋值给变量a,得到变量a的值是12。-然后变量c赋值为b+4的和,也就是7。exp2:exp3;-如果结果为真,返回exp2。-如果结果为假,返回exp3。-接下来把c的值加上5。-exp1是条件表达式。语法:goto 标签;-现将变量b赋值为3。
2024-01-09 17:10:30
398
原创 C语言-for语句和循环嵌套
表达式1,表达式2和表达式3可以按照需要进行省略(但分号不能省略)-for (表达式1;表达式1是循环初始化表达式。-for (表达式1;表达式2是循环条件表达式。
2024-01-09 03:40:58
518
原创 C语言-关系运算符和逻辑运算符
注:关系表达式和逻辑表达式得到的值都是一个逻辑值,也就是表示真的 1 和表示假的 0。但是用于判断一个值是否为真时,以 0 表示假,以任何非 0 的数表示真。一个是编译系统告诉我们的结果,一个是我们让编译系统去判断的,两者方向不同。关系表达式得到的值是一个逻辑值,即判断结果为“真”或“假”,如果结果为“真”,关系表达式的值为 1,如果为“假”,关系表达式的值则为 0。短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。
2024-01-08 03:25:55
1228
1
原创 C语言-算术运算符
C 语言通过提供大量的运算符来支持我们对数据进行处理,前边我们将一个值存放到变量中,使用的是赋值运算符,就是等于号(=),上节课对字符串中的某个字符进行索引,使用方括号([])作为下标运算符实现。我们把被运算符作用的运算对象称之为操作数,比如 1 + 2,那么 1 和 2 就是被加法运算符(+)作用的两个操作数。通常情况下,编译器会将占用坑位比较小的操作数,先转换为与坑位较大的操作数的相同类型,然后再进行运算。当一个运算符的几个操作数类型不同时,编译器需要将它们转换为共同的某种数据类型,才能进行运算。
2024-01-08 02:31:47
392
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人