![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 52
定期更新栈、队列、链表、二叉树、各种遍历算法等知识和习题,带你成为嵌入式大佬。
邢仕冲的一亩三分地
工作:目前从事毫米波雷达的嵌入式开发,关注我和你一起从菜鸟走向车载毫米波雷达乃至自动驾驶的技术大牛。
展开
-
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
排序一、排序基本概念1、稳定性2、内排序与外排序3、性能分析二、插入排序1、思路2、时间复杂度分析3、示例代码4、代码分析三、冒泡排序1、概念2、时间复杂度3、思路4、示例代码5、代码分析四、快速排序1、概念2、思路3、示例代码五、希尔排序1、比较插入排序和希尔排序2、概念3、示例代码一、排序基本概念排序是处理数据的一种最常见的操作,所谓排序就是将数据按某字段规律排列,所谓的字段就是数据节点的其中一个属性。比如一个班级的学生,其字段就有学号、姓名、班级、分数等等,我们既可以针对学号排序,也可以针对分数排原创 2022-03-29 15:27:09 · 576 阅读 · 0 评论 -
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
二叉树一、二叉树基本概念二、二叉树的算法设计1、构建二叉树节点2、插入节点3、删除节点4、遍历二叉树5、层次遍历一、二叉树基本概念二叉树的其中一个重要应用,是提供一种快速查找数据的方法,即:将数据节点按照某种规律形成一棵二叉树,然后利用二叉树特殊的逻辑结构减少搜索数据的次数,提高查找的效率。这种按照某种规律构建,用来提高搜索性能的二叉树,被称为搜索二叉树(Binary Search Tree),即BST。具体而言,二叉树提高搜索效率的秘诀在于:按照“小-中-大”(当然“大-中-小”也是一样的)的规律原创 2022-03-29 14:52:07 · 4746 阅读 · 3 评论 -
【树】数据结构——树和二叉树的概念&笔记
一、基本概念树是一种非线性结构,其严格的数学定义是:如果一组数据中除了第一个节点(第一个节点称为根节点,没有直接前驱节点)之外,其余任意节点有且仅有一个直接前驱,有零个或多个直接后继,这样的一组数据形成一棵树。这种特性简称为一对多的逻辑关系。二、常见例子日常生活中,很多数据的组织形式本质上是一棵树。比如一个公司中的职员层级关系,一个学校中的院系层级关系,淘汰赛中的各次比赛队伍,一个家族中的族谱成员关系等,这些都是树状逻辑结构。由于树状结构表现出来都是具有层次的,因此也被称为层次结构。通常,在逻辑原创 2022-03-25 15:27:49 · 1212 阅读 · 2 评论 -
【内核链表】数据结构——深入理解内核链表的概念和操作&笔记
内核链表一、内核链表的前置概念1、容器2、通用解决方案二、通用型链表节点的设计1、初始化2、增删操作3、查找节点4、遍历链表5、示例代码三、内核链表1、普通链表弊端2、内核链表2.1内核链表结构2.2内核链表的节点设计2.3内核链表的相关函数1)内核链表的初始化—— INIT_LIST_HEAD2)插入节点3)内核链表的遍历——list_for_each_entry(宏函数 就是一个for循环)4)内核链表节点删除——list_del5)内核链表的销毁——先把除了头结点的所有地址是否,最后释放头结点6)示例原创 2022-03-24 12:04:21 · 3457 阅读 · 0 评论 -
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
一、单向循环链表将单链表的首尾节点相连就形成了单向循环链表。1、单向循环链表的节点2、单向循环链表的结构单向循环链表只有一个节点时:二、双向循环链表1、双向循环链表示意图2、双向循环链表节点设计struct d_node{ int data; //数据域 struct d_node *next; struct d_node *prev;};3、双向循环链表的一般性结构1)只有头结点的情况2)有多个节点的情况4、双向循环链表头插法插入节点步骤:1)p-&原创 2022-03-23 17:48:08 · 8821 阅读 · 4 评论 -
经典笔试题——单向链表的倒序
题目:有一个单向链表,将链表倒序解决方案:单向链表的特点:链表节点只能从前往后遍历(不能从后往前遍历),那么在遍历链表时,必须从前往后处理这些数据。方案1:链表节点添加:头插、尾插头插法:先插入数据,会被放在链表的后边,后插入的数据会被放在链表的前面。实现步骤:新建一个新的链表,对旧的链表节点中的数据头插法插入到新的链表,旧的链表遍历完成后,新的链表也就创建完成,新的链表就跟旧的链表刚好是倒序的。方案2:直接在链表上进行操作,对链表节点进行遍历,把每一个节点都采用头插法插入到链表中。原创 2022-03-23 12:02:00 · 1193 阅读 · 0 评论 -
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
从今天开始将修炼数据结构专栏,将持续更新,分模块学习。数据结构——单向链表一、数据结构1、什么是数据结构?2、逻辑结构和物理结构二、链表——线性结构1、首先介绍下链表和数组的区别2、链表节点——节点本身是一个结构体3、单向链表的一般性结构4、单向链表节点的添加——插入节点5、单向链表节点的查找——查找结点6、单向链表删除节点7、单向链表节点的销毁8、最后附上示例代码一、数据结构1、什么是数据结构?数据结构:计算机存储,组织数据的方式,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。.原创 2022-03-23 11:45:48 · 796 阅读 · 3 评论 -
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
题目:使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数。代码:#include <stdio.h>//链式栈节点typedef struct node{ //数据域 int data; struct node *next;} Node;//链式栈管理结构体typedef struct linkStack{ int size; Node *top;} Linkstack;//初始化空栈Lin原创 2021-08-22 19:32:02 · 1204 阅读 · 0 评论 -
顺序栈实现出栈入栈
使用顺序栈,接收键盘的输入,实现如下功能:输入数字时,依次入栈。输入字母时,依次出栈。每次入栈或者出栈,都将顺序栈中的各个元素输出出来。代码:#include <stdio.h>#include <stdlib.h>#define DATATYPE inttypedef DATATYPE datatype;typedef struct{ datatype *data; int size; int top;} seqStack;//原创 2021-08-22 19:27:36 · 2925 阅读 · 0 评论 -
以网页形式展示二叉树
为了检验创建出来的二叉树是否正确,可以使用如下代码将二叉树以网页形式展现出来:#define TREENODE node // 声明自定义的二叉树节点为TREENODE#include “drawtree.h” // 包含画树代码int main(){// 以网页形式展现二叉树draw(root);}其中,node是自己定义的二叉树的节点的类型,root是根节点,在包含 drawtree.h 之前定义 TREENODE 这个宏为 node ,即可展示对应二叉树。注意:只能在linux环境原创 2021-08-21 09:21:07 · 1092 阅读 · 0 评论 -
二叉树删除节点算法---递归
删除节点删除一个BST的节点要比插入困难一点,但同样是要遵循一个原则,即:删除节点后仍然要保持“小-中-大”的逻辑关系。假设要删除的节点是x,大体思路如下:若要删除的节点小于根节点,则递归地在左子树中删除x若要删除的节点大于根节点,则递归地在右子树中删除x若要删除的节点恰好就是根节点,则分如下几种情况:a. 根节点若有左子树,则用左子树中最大的节点max替换根节点,并在左子树中递归删除maxb. 否则,若有右子树,则用右子树中最小的节点min替换根节点,并在右子树中递归删除minc.原创 2021-08-20 20:22:13 · 1226 阅读 · 0 评论 -
排序算法----快速排序----详解&&代码
快速排序:基本思想:在数列进行快速排序时,选择第一个数为基准值(begin),判断if(left>begin)就swap(left,right),然后right–(向前移一位),if(left<begin)就left++(left向前移一位),当left和right移到一起就把基准值插入到数列中,循环结束后,left=right,原本数列a[begin+1]~a[end],左边比基准值小,右边比基准值大,然后把基准值插入到合适序列中,判断基准值比最后left和right共同指的那个数哪个原创 2021-08-20 20:14:02 · 122 阅读 · 0 评论 -
二叉树插入算法--递归
对于BST而言,插入一个节点主要是要保持其“小-中-大”的逻辑不变,因此插入的节点的逻辑可以从根节点开始,一步步寻找新节点的“最终归宿”,比如在如下BST中,要插入新节点16,最终应该插入到节点17的左孩子处。在实现插入算法的时候,由于树状结构本身是递归的,因此可以使用递归函数更优雅地实现插入算法。如下:情况①:第一次插入节点给这个二叉树二叉树是空的,则直接把Root根指针指向新节点struct node *Root=NULL;Root = bstInsert(Root,25);对应插入代码原创 2021-08-20 16:13:02 · 2083 阅读 · 0 评论 -
排序算法---冒泡排序----详解&&代码
冒泡排序:首先引入两个概念:顺序:如果两个数据的位置符合排序的需要,则称它们是顺序的。逆序:如果两个数据的位置不符合排序需要,则称它们是逆序的。冒泡排序基于这样一种简单的思路:从头到尾让每两个相邻的元素进行比较,顺序就保持位置不变,逆序就交换位置。可以预料,经过一轮比较,序列中具有“极值”的数据,将被挪至序列的末端。假如序列中有n个数据,那么在最极端的情况下,只需要经过n−1轮的比较,则一定可以将所有的数据排序完毕。冒泡法排序的时间复杂度是O(n2)最好:12345678最坏(完全逆序): 8原创 2021-08-20 15:43:54 · 145 阅读 · 0 评论 -
排序算法---希尔排序---详解&&代码
希尔排序:希尔排序:从整体宏观上有序逐步细节到局部的有序,希尔排序是一种改进版的插入排序,普通的插入排序算法中,是从第2个节点开始,依次插入到有序序列中,这种做法虽然“一次成形”,但研究发现时间效率上这么做并不划算。希尔排序的时间复杂度为O(n*logn)100个/2 = 50组 同组间隔50 每组元素是2个50/2 = 25 同组间隔25 每组元素是4个25/2 = 12 同组间隔12 每组元素是8 -----漏了后4个元素12/2 = 6 同组间隔6原创 2021-08-20 15:37:30 · 365 阅读 · 0 评论 -
排序算法---插入排序-----详解&&代码
插入排序:插入排序的思路也很简单:假设前面已经有i节点是有序的,那么就从第i+1个节点开始,插入到前面的i个节点的合适的位置中。由于第一个元素自身总是有序的,因此从第2个开始,不断插入前面的有序序列,直到全部排列完毕。假设总共有n个节点,那么总共需要将n−1个节点插入到有序序列中,而插入节点时需要找到合适的位置,显然这个查找的过程时间复杂度是O(n−i),因此插入排序的时间复杂度是O(n−1)(n−i),即O(n^2)。原始数据(80,50,20,30,2,18,100)第一次排序:(50,80,原创 2021-08-19 20:41:03 · 130 阅读 · 0 评论 -
排序算法---选择排序-----详解&&代码
选择排序:定义:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。先从原始数据(n个)中拿出最小的数据和第一个位置进行交换。再从n-1中拿出最小的数据和第二个位置进行交换。然后不断重复。原始数据(55,18,9 ,5,32,100)第一原创 2021-08-19 20:01:18 · 107 阅读 · 0 评论 -
通用型链表实现书籍信息管理
此链表实现书籍信息管理功能:创建链表、头插(尾插)、按条件删除(.c文件实现按书名删除节点)、删除指定节点、查找结点、销毁链表list.h#ifndef DATATYPE#define DATATYPE int`在这里插入代码片`#endiftypedef DATATYPE datatype;typedef struct node{ //数据域 datatype data; //指针域 struct node *next; //后继指针,指向下一个与当前类型原创 2021-08-18 09:47:13 · 146 阅读 · 0 评论