当前位置: 首页 > news >正文

【嵌入式软件-数据结构与算法】01-数据结构

摘录于老师的教学课程~~(*๓´╰╯`๓)~~内含链表、队列、栈、循环队列等详细介绍~~

基础知识系列 有空再继续更~~~

目录

【链表】

一、单链表

1、存储结构:带头结点的单链表

2、单链表结点类型的定义

3、创建单链表

        1)头插法

        2)尾插法

4、单链表插入结点

5、单链表删除结点​编辑

6、单链表的遍历模型

        1)模型1:指向头结点

        2)模型2:指向首结点

二、双链表

1、存储结构:带头结点的双链表

2、双链表结点类型的定义

3、创建双链表

        1)头插法

        2)尾插法

4、双链表插入结点

        方法1:在第 i 位置插入,先定位到第 i-1 位置​编辑

        方法2:在第 i 位置插入,定位到第 i 位置

5、双链表删除结点

        方法1:删除第 i 位置结点,先定位到第 i-1 位置

        方法2:删除第 i 位置结点,定位到第 i 位置​编辑

三、循环链表

1、循环单链表

2、循环双链表

3、其他操作方法与单链表和双链表操作一样

【栈】

一、顺序栈

1、存储结构

2、顺序栈类型的定义

3、顺序栈的 四 要素

4、顺序栈的运算(节选)

二、共享栈

1、存储结构

2、共享栈类型的定义

3、共享栈的 四 要素

三、链栈

1、存储结构:带头结点的链栈

2、链栈结点类型的定义

3、链栈的 四 要素

4、链栈的运算(节选)

        1)进栈 Push(&s, e)

        2)出栈 Pop(&s, &e)

        3)取栈顶元素 GetTop(s, &e)

【队列】

一、顺序队

1、存储结构

2、顺序队类型的定义

3、顺序队的 四 要素

4、顺序队的运算(节选)

二、链队

1、存储结构

2、链队结点类型的定义

3、链队的 四 要素

4、链队的运算(节选)

        1)进队 enQueue(q , e)

        2)出队 deQueue(q , e)

三、变形链队

1、变化要点

2、存储结构

3、变形链队的 四 要素

四、双端队列

1、不受限的双端队列:两端都可以进行进队和出队操作的队列

2、输出受限的双端队列:一端允许进队和出队,另一端只允许进队

3、输入受限的双端队列:一端允许进队和出队,另一端只允许出队

五、环形队列(循环队列)

1、环形队列(循环队列) 四 要素 

六、变形环形队列

1、变化要点

2、变形环形队列类型的定义

3、变形环形队列的 四 要素


【链表】

一、单链表

1、存储结构:带头结点的单链表

2、单链表结点类型的定义

typedef struct LNode    // 定义单链表节点类型
{ElemType data;      // 节点的数据部分,类型为 ElemType(通常是自定义的数据类型)struct LNode *next; // 指向后继结点
}LinkNode;              // 将结构体命名为 LinkNode

  如图:  

3、创建单链表

        1)头插法

        

        代码理解:先接s后面,再接s前面

        2)尾插法

        代码理解:先接s前面,再收s后面

4、单链表插入结点

        代码理解:先cv后面(先接s后面),再接s前面

5、单链表删除结点

        代码理解:直指后一位,跳过中间

6、单链表的遍历模型

        1)模型1:指向头结点

       

           循环初始条件:p 指向链表的头节点 L 。(意味着循环将从头节点开始)

           循环结束条件:循环在当前节点的下一个节点不为空时继续执行。(意味着循环会只遍历到倒数第二个节点,并且不会打印最后一个节点的数据

        2)模型2:指向首结点

        

           循环初始条件:p 指向链表的第一个有效节点(即 L ->next 意味着循环将从第一个有效节点开始,跳过了头节点)。

           循环结束条件:循环在 p 不为空时继续执行。(意味着循环会遍历整个链表,包括最后一个节点

二、双链表

1、存储结构:带头结点的双链表

  

2、双链表结点类型的定义

typedef struct DNode        //双链表结点类型
{ElemType data;struct DNode *prior;    //指向前驱结点struct DNode *next;     //指向后继结点
}DlinkNode;

3、创建双链表

        1)头插法

     

        代码理解:先接s后面,判断是否后能回扣s,再接s前面,前回扣s

        2)尾插法

      

        代码理解:先接s前面,后s回扣前面,最后r(即旧的s,新的r)指空

4、双链表插入结点

        方法1:在第 i 位置插入,先定位到第 i-1 位置

        代码理解:先s接,后回扣;先接后,再接前

        方法2:在第 i 位置插入,定位到第 i 位置

    

    

5、双链表删除结点

        方法1:删除第 i 位置结点,先定位到第 i-1 位置

        代码理解:跳过结点,往下直指下一位,下一位回扣上一位

        方法2:删除第 i 位置结点,定位到第 i 位置

三、循环链表

1、循环单链表

     

2、循环双链表

3、其他操作方法与单链表和双链表操作一样


【栈】

一、顺序栈

1、存储结构

        

2、顺序栈类型的定义

typedef struct
{ElemType data[MaxSize]; //大小为 MaxSize,用于存储栈中的元素int top;                //栈顶指针
}SqStack;

3、顺序栈的 四 要素

   

        代码理解:由于栈从0开始记,所以栈空为-1,栈满为最大(MaxSize)减一;

                          进栈,先加后进;退栈,先取后减;

4、顺序栈的运算(节选)

        要记得判断是否栈满与栈空

二、共享栈

1、存储结构

  

        两头往中间增,空间共享

2、共享栈类型的定义

typedef struct
{ElemType data[MaxSize]; //存放共享栈中元素int top1,top2;          //两个栈的栈顶指针
}DStack;

3、共享栈的 四 要素

  

        代码理解:

        栈空为两指针至两栈外(-1,MaxSize);

        栈满为两指针相邻;

        进栈,top1进则先加再进(top1为左),top2进则先减再进(top2为右),都为向中靠拢

        出栈,top1出则先取再减(top1为左),top2出则先取再加(top2为右),都为向两边取

三、链栈

1、存储结构:带头结点的链栈

  

2、链栈结点类型的定义

typedef struct linknode
{ElemType data;         //数据域struct linknode *next; //指针域
}LinkStNode;

3、链栈的 四 要素

  

        链栈栈满取决于电脑的内存设置,所以不考虑;

        栈空即为头结点s下一位为空;

        

4、链栈的运算(节选)

        1)进栈 Push(&s, e):  要点:链表的头插法插入结点

        

        代码理解:头插-先接后再接前

        2)出栈 Pop(&s, &e):  要点:删除链表的首结点

        

        代码理解:跳过删除结点连上,释放节点

        3)取栈顶元素 GetTop(s, &e):

        

        代码理解:取栈顶赋值于e


【队列】

一、顺序队

1、存储结构

  

2、顺序队类型的定义

typedef struct
{ElemtType data[MaxSize];int front,rear;            //队首和队尾指针
}SqQueue;

3、顺序队的 四 要素

        rear指向队尾元素;front指向队头元素的前一个位置。

  

        代码理解:队空为重合,队满尾最高;进队尾加后入,出队前加后出;

4、顺序队的运算(节选)

1)进队列 enQueue(q,e):在队列不满的条件下,将队尾指针 rear 增 1,然后将元素添加到该位置。

2)出队列 deQueue(q,e):在队列不为空的条件下,将队首指针 front 循环增 1,并将该位置的元素值赋给 e。

          

二、链队

1、存储结构

   

        一个链队的组成,包含两种类型的结点:

           (1)存储队列数据元素的链表结点
           (2)存储队头和队尾指针的链队头结点

2、链队结点类型的定义

        链队的数据节点类型DataNode 

typedef qnode
{ElemType data;      //数据元素struct qnode *next;
}DataNode;

      链队的头结点类型LinkQuNode

typedef struct
{DataNode *front;  //指向单链表队头结点DataNode *rear;   //指向单链表队尾结点
}LinkQuNode;

3、链队的 四 要素

    代码理解:队空为前后指向空;链队队满取决于内存大小,不考虑;进队尾插法,出队从头删;

4、链队的运算(节选)

        1)进队 enQueue(q , e)

        代码理解:先判队是否为空,是则既头又尾,否则尾插进入,接前再接尾;

        2)出队 deQueue(q , e)

        

        代码理解:删前先判断,为空则回错(return false),t指首结点;为独则设空,前后都指空;为多则好删,跳格接前再存值,最后再释放;

三、变形链队

1、变化要点

        使用循环双链表,保留队尾指针rear。(队头指针可通过rear->next得出)

2、存储结构

                

        尾指针rear会回指到队头

3、变形链队的 四 要素

                  

        代码理解:队满看内存,不考虑;队空则尾指为空;进队则尾插法;出队则删头;

四、双端队列

1、不受限的双端队列:两端都可以进行进队和出队操作的队列

       

        两端都可进出

2、输出受限的双端队列:一端允许进队和出队,另一端只允许进队

         

        出口唯一,两端可进;后进为两边,先进在中间;

3、输入受限的双端队列:一端允许进队和出队,另一端只允许出队

        

        进口唯一,两端可进;出队结果看两边;

五、环形队列(循环队列)

1、环形队列(循环队列) 四 要素      

        代码理解:队空为重叠;队满则相邻(尾指针的下一个位置等于头指针的位置,牺牲一个元素);进队从尾进,出队从头出;

        涉及环形更新指针解析:

六、变形环形队列

1、变化要点:

        取消尾指针,利用队列中元素个数代替队尾指针

2、变形环形队列类型的定义

typedef struct
{ElemType data[MaxSize];int front;              //队头指针int count;              //队列中元素个数
}QuType;

3、变形环形队列的 四 要素

        

        代码解析:可参照环形队列;多了一个count来作为计数(记空与满),方便很多;


相关文章:

【嵌入式软件-数据结构与算法】01-数据结构

摘录于老师的教学课程~~(*๓╰╯๓)~~内含链表、队列、栈、循环队列等详细介绍~~ 基础知识系列 有空再继续更~~~ 目录 【链表】 一、单链表 1、存储结构:带头结点的单链表 2、单链表结点类型的定义 3、创建单链表 1)头插法 2)尾插法 …...

Windows应用开发-解析AVI视频文件

本Windows应用解析AVI视频文件,以表格的方式显示AVI文件结构。并可以将结果保存到bmp图片。下面是,使用该应用解析一部AVI电影获得的图片。 应用开发信息 定义一个INFO结构,包含两个字符串对象,一个ULONGLONG变量,和…...

探索TCP协议的奥秘:Python中的网络通信

引言 在网络通信的世界里,TCP协议(传输控制协议)就如同一座桥梁,连接着数据的发送方和接收方。作为一名拥有20年实战经验的编码专家,我深知TCP协议在构建稳定、可靠的网络应用中的重要性。今天,我将带领大…...

每日学习一个数据结构-树

文章目录 树的相关概念一、树的定义二、树的基本术语三、树的分类四、特殊类型的树五、树的遍历六、树的应用场景 树的遍历一、前序遍历二、中序遍历三、后序遍历使用java代码实现遍历总结 树的相关概念 树是一种重要的非线性数据结构,在计算机科学中有着广泛的应用…...

简单PCL库读文件(linux vscode编译)

#include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/common.h> #include <iostream>int main(int argc, char** argv) {if (argc ! 2) {std::cerr << "请指定 PCD 文件路径" << std::endl;return -…...

【自动驾驶】最近计划看的论文

将对应的论文链接贴出来&#xff0c;当作监督自己。 方向&#xff1a;端到端自动驾驶 方法论文代码UniADhttps://arxiv.org/pdf/2212.10156https://github.com/OpenDriveLab/UniADVADhttps://arxiv.org/pdf/2303.12077https://github.com/hustvl/VADUADhttps://arxiv.org/pdf…...

vue3学习:axios输入城市名称查询该城市天气

说来惭愧&#xff0c;接触前端也有很长一段时间了&#xff0c;最近才学习axios与后端的交互。今天学习了一个查询城市天气的案例&#xff0c;只需输入城市名称&#xff0c;点击“查询”按钮便可以进行查询。运行效果如下&#xff1a; 案例只实现了基本的查询功能&#xff0c;没…...

影刀RPA实战:Excel拆分与合并工作表

1.影刀操作excel的优势 Excel&#xff0c;大家都不陌生&#xff0c;它是微软公司推出的一款电子表格软件&#xff0c;它是 Microsoft Office 套件的一部分。Excel 以其强大的数据处理、分析和可视化功能而闻名&#xff0c;广泛应用于商业、教育、科研等领域。可以说&#xff0…...

STM32三种启动模式:【详细讲解】

STM32在上电后&#xff0c;从那里启动是由BOOT0和BOOT1引脚的电平决定的&#xff0c;如下表&#xff1a; BOOT模式选引脚启动模式BOOT0BOOT1X0主Flash启动01系统存储器启动11内置SRAM启动 BOOT 引脚的值在重置后 SYSCLK 的第四个上升沿时被锁定。在重置后,由用户决定是如何设…...

Ray_Tracing_The_Next_Week

1动态模糊 动态模糊在摄影中就是快门的速度慢&#xff0c;捕捉光的时间长&#xff0c;物体运动时进行捕捉成像&#xff0c;拍出来的结果是这个运动过程每一帧的平均值 我们的思路是&#xff1a; 每一条光线都拥有自己存在的一个时间点。随着时间变化随机生成光线,一般来说我…...

DBT hook 实战教程

本文将介绍dbt中在模型和seed级别使用post-hook的几个具体示例。dbt中的Post-hooks是一个强大而简单的特性&#xff0c;它在构建模型之后(如果是pre-hook&#xff0c;甚至在此之前)执行SQL语句。这些语句实际上(几乎)可以是任何东西&#xff0c;从将表复制到另一个数据库/模式&…...

SpringBoot整合JPA详解

SpringBoot版本是2.0以上(2.6.13) JDK是1.8 一、依赖 <dependencies><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--…...

【微服务】springboot 实现动态修改接口返回值

目录 一、前言 二、动态修改接口返回结果实现方案总结 2.1 使用反射动态修改返回结果参数 2.1.1 认识反射 2.1.2 反射的作用 2.1.3 反射相关的类 2.1.4 反射实现接口参数动态修改实现思路 2.2 使用ControllerAdvice 注解动态修改返回结果参数​​​​​​​ 2.2.1 注解…...

【前端开发入门】html快速入门

目录 引言一、html基础模板内容二、html文档流三、html 标签1.块级元素2.行内元素3.功能性元素4.标签嵌套 四、html编码习惯五、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容&#xff0c;并不代表这部分内容不…...

python配置环境变量

方法一&#xff1a;首先卸载重新安装&#xff0c;在安装时勾选增加环境变量 方法二&#xff1a;我的电脑-属性-高级系统配置 手动添加环境变量&#xff0c;路径为python的安装路径 检查&#xff1a;查看环境变量是否安装成功 安装第三方lib winr&#xff0c;输入cmd pip ins…...

从0到1:培训机构排课小程序开发笔记一

业务调研 随着人们生活水平的提高&#xff0c;健康意识和学习需求日益增强&#xff0c;私教、健身和培训机构的市场需求迅速增长。高效的排课系统不仅可以提升机构的管理效率&#xff0c;还能提高学员的满意度。解决传统的排课方式存在的时间冲突、信息不对称、人工操作繁琐等…...

方法重载(Overload)

前言 在前面的学习中&#xff0c;我们学到了重写(Override),这里我们主要进行重载(Overload)的介绍&#xff0c;同时对重写和重载的区别进行分析。 1. 重载(Overload) #方法重载 在同一个类中定义多个同名但参数不同的方法。我们称方法与方法之间构成方法重载 在Java中&…...

[论文笔记]SGPT: GPT Sentence Embeddings for Semantic Search

引言 解码器Transformer的规模不断壮大&#xff0c;轻松达到千亿级参数。同时由于该规模&#xff0c;基于提示或微调在各种NLP任务上达到SOTA结果。但目前为止解码器Transformer还无法应用在语义搜索或语句嵌入上。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比…...

基于微信小程序的旅游拼团系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

富格林:警悟可信经验安全投资

富格林指出&#xff0c;黄金具有不错的投资价值&#xff0c;一直以来备受投资者的喜爱&#xff0c;近年来大家也纷纷加入现货黄金市场为己增值财富。但是要为投资安全护航的前提&#xff0c;是需要投资者使用合适可信的方法以及掌握相对应的投资技巧。下面富格林将总结以下可信…...

【Linux】使Ubuntu自适应窗口大小并与主机共享文件

LInux虚拟机版本ubuntu-20.04.6&#xff0c;VM版本VMware Workstation 17 Pro VMware Tools™ 是一组服务和模块&#xff0c;是VMware公司在其虚拟化平台中提供的一套工具集&#xff0c;旨在提高虚拟机的性能和稳定性。它们支持 VMware 产品中的多种功能特性&#xff0c;有助于…...

C++ 语言特性18 - static_assert 介绍

一&#xff1a;概述 在 C 中&#xff0c;static_assert 是一种用于在编译时进行断言的机制&#xff0c;确保某些编译时条件成立。如果条件不成立&#xff0c;则编译器会生成错误&#xff0c;阻止代码的编译。static_assert 在 C11 中引入&#xff0c;目的是帮助程序员在编译时捕…...

centos 7.9系统redis6.2.6哨兵模式部署

由于系统需要处理大量的数据并发请求,所以借助于Redis的高性能,可以有效提升整个系统的处理效率。这里采用redis6.2版本源码编译部署哨兵模式,提高整个系统的可用性,避免单点故障。 1. Redis基本环境安装 centos7安装redis 6.2.6 采用源码编译方式安装。 服务器主机名:…...

编程基础:详解 C++ 中的 `std::sort` 函数

编程基础&#xff1a;详解 C 中的 std::sort 函数 在C编程中&#xff0c;排序是非常常见的操作&#xff0c;而std::sort是C标准库中用于排序的一个高效函数。它提供了灵活的排序功能&#xff0c;可以使用默认排序规则或自定义的比较函数。本文将深入探讨std::sort的用法、参数要…...

51单片机的宠物自动投喂系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器DS1302时钟模块蓝牙步进电机按键、蜂鸣器等模块构成。适用于猫猫/狗狗宠物自动喂食器等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间和温湿度 2、温湿度传感器DHT11采集环境温湿度 3、时…...

MongoDB快速实战与基本原理

目录 链接:https://note.youdao.com/ynoteshare/index.html?id=5e038498891617c552667b853742fdc1&type=note&_time=1727935558812 Mongo数据库的特点: mongo数据库和关系型数据库的区别: ​编辑 关系型数据库和文档型数据库的主要概念对比: 下载和启动(具体…...

编程技巧:优化

第一种&#xff1a;构造回文串---构造法 题目描述 [NOIP2016 普及组] 回文日期 - 洛谷 那么这道题我们总结一些题目要求&#xff1a; 1.输入两个字符串&#xff0c;为起始和终止日期 2.年份不会出现前导0 3.如果是回文日期&#xff0c;答案1 4.如果月份是2&#xff0c;要…...

pycharm中使用anaconda创建多环境,无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

问题描述 用的IDE是&#xff1a; 使用anaconda创建了一个Python 3.9的环境 结果使用pip命令的时候&#xff0c;报错 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案 为了不再增加系统变量&#xff0c;我们直接将变量添加在当前项目中你的Ter…...

【Linux】进程周边之优先级

目录 一、优先级 1.为什么要有进程优先级&#xff1f; 2.什么是进程优先级&#xff1f; 3.优先级的初始设定 3.1 PRI 和 NI 3.2如何修改优先级&#xff1f;&#xff08;sudo/root&#xff09; 3.2.1 概念&#xff1a; 3.2.2 如何查看进程的优先级&#xff1f; 3.3.3 或…...

Linux高级编程_29_信号

文章目录 进程间通讯 - 信号信号完整的信号周期信号的编号信号的产生发送信号1 kill 函数(他杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 2 raise函数(自杀)作用&#xff1a;示例&#xff1a; 3 abort函数(自杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 4 …...