【嵌入式软件-数据结构与算法】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来作为计数(记空与满),方便很多;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python办公自动化之Word

在现代办公环境中,自动化无疑是提升工作效率的关键。特别是处理文档的工作,很多人可能花费大量时间在重复性任务上。那么,有没有一种方法可以让我们用 Python 来自动化 Word 文档的操作呢?今天,我们来聊聊如何用 Pytho…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先,需要准备三个服务器实例,这里我使用了阿里云创建了三个实例,如果不想花钱,也可以在VM上创…

windows配置C++编译环境和VScode C++配置(保姆级教程)

1.安装MinGW-w64 MinGW-w64是一个开源的编译器套件,适用于Windows平台,支持32位和64位应用程序的开发。它包含了GCC编译器、GDB调试器以及其他必要的工具,是C开发者在Windows环境下进行开发的重要工具。 我找到了一个下载比较快的链接&#…

初识Linux · 自主Shell编写

目录 前言: 1 命令行解释器部分 2 获取用户命令行参数 3 命令行参数进行分割 4 执行命令 5 判断命令是否为内建命令 前言: 本文介绍是自主Shell编写,对于shell,即外壳解释程序,我们目前接触到的命令行解释器&am…

技术成神之路:设计模式(十八)适配器模式

介绍 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类可以协同工作,通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。 1.定义 适配…

基础算法--枚举

枚举算法是一种简单而有效的算法,它通过枚举所有可能的情况来解决问题。它通常用于解决问题规模比较小的问题,因为它的时间复杂度很高,随着问题的规模增加,算法的效率会急剧下降。 枚举算法的基本思路是通过循环遍历所有可能的情…

CSS实现服务卡片

CSS实现服务卡片 效果展示 CSS 知识点 回顾整体CSS知识点灵活运用CSS知识点 页面整体布局 <div class"container"><div class"card"><div class"box"><div class"icon"><ion-icon name"color-pal…

记录一次病毒启动脚本

在第一次下载软件时&#xff0c;目录中配了一个使用说明&#xff0c;说是需要通过start.bat 这个文件来启动程序&#xff0c;而这个 start.bat 就是始作俑者&#xff1a; 病毒作者比较狡猾&#xff0c;其中start.bat 用记事本打开是乱码&#xff0c;但是可以通过将这个批处理…

OpenMV与STM32通信全面指南

目录 引言 一、OpenMV和STM32简介 1.1 OpenMV简介 1.2 STM32简介 二、通信协议概述 三、硬件连接 3.1 硬件准备 3.2 引脚连接 四、软件环境搭建 4.1 OpenMV IDE安装 4.2 STM32开发环境 五、UART通信实现 5.1 OpenMV端编程 5.2 STM32端编程 六、SPI通信实现 6.1 …

查缺补漏----I/O中断处理过程

中断优先级包括响应优先级和处理优先级&#xff0c;响应优先级由硬件线路或查询程序的查询顺序决定&#xff0c;不可动态改变。处理优先级可利用中断屏蔽技术动态调整&#xff0c;以实现多重中断。下面来看他们如何运用在中断处理过程中&#xff1a; 中断控制器位于CPU和外设之…

动态规划最长上升子序列问题讲解和【题解】——最长上升子序列

动态规划最长上升子序列讲解和题解——最长上升子序列 最长上升子序列问题讲解1.概念解析2.举例了解3.示例程序 最长上升子序列题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示思路解析 最长上升子序列问题讲解 1.概念解析 最长上升子序列 &#xff08; L o n g e s…

微服务sentinel解析部署使用全流程

sentinel源码地址&#xff1a; 介绍 alibaba/Sentinel Wiki GitHub sentinel官方文档&#xff1a; https://sentinelguard.io/zh-cn/docs/introduction.html Sprong Cloud alibaba Sentinel文档【小例子】 : Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 目录 1、…

C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布

一&#xff1a;让 SQLiteExpert 支持&#xff08;cipher&#xff09;加密数据库 SQLiteExpert 作为SQlite 的管理工具&#xff0c;默认不支持加密数据库的&#xff0c;使其成为支持&#xff08;cipher&#xff09;加密数据库的管理工具&#xff0c;需要添加e_sqlcipher.dll &…

Android-Handle消息传递和线程通信

本文为作者学习笔记&#xff0c;如有误&#xff0c;请各位大佬指点 目录 一、同步异步 二、Java多线程通信 三、Handler是什么 四、Handler相关的类 五、Handler常用方法 1. 发送消息 2. 接收处理消息 3. 切换线程 六、使用Handler 使用Handler更新UI 使用Handler延…

蓝桥杯【物联网】零基础到国奖之路:十八. 扩展模块之光敏和AS312

蓝桥杯【物联网】零基础到国奖之路:十八.扩展模块之光敏和AS312 第一节 硬件解读第二节 CubeMX配置第二节 代码 第一节 硬件解读 光敏和AS312如下图&#xff1a; 光敏电阻接到了扩展模块的5号引脚&#xff0c;5号引脚接了2个电阻&#xff0c;R8和光敏电阻。我们通过ADC读取这…

Python 从入门到实战33(使用MySQL)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…

ASP.NET Zero 多租户介绍

ASP.NET Zero 是一个基于 ASP.NET Core 的应用程序框架&#xff0c;它提供了多租户支持&#xff0c;以下是关于 ASP.NET Zero 多租户的介绍&#xff1a; 一、多租户概念 多租户是一种软件架构模式&#xff0c;允许多个客户&#xff08;租户&#xff09;共享同一套软件应用程序…

探索TOGAF理论的实践应用:企业数字化转型的深度指南

数字化转型的迫切性与路径选择 随着全球化进程和技术革命的加速&#xff0c;企业正面临前所未有的挑战和机遇。数字化转型已成为企业保持竞争力、创新业务模式、优化客户体验的核心手段。然而&#xff0c;企业在实施数字化转型时&#xff0c;往往面临路径不清、技术与业务脱节…

《Linux从小白到高手》理论篇(七):Linux的时间管理运行级别启动过程原理详解

List item 本篇将介绍Linux的时间管理&运行级别相关知识&#xff0c;并将深入介绍Linux的启动过程及原理。 Linux的时间管理 Linux 时钟分为系统时钟&#xff08;System Clock&#xff09;和硬件&#xff08;Real Time Clock&#xff0c;简称 RTC&#xff09;时钟。系统时…

Linux驱动开发(速记版)--设备树插件

第六十八章 设备树插件介绍 Linux 4.4之后引入了动态设备树&#xff0c;其中的设备树插件&#xff08;Device Tree Overlay&#xff09;是一种扩展机制&#xff0c;允许在运行时动态添加、修改或删除设备节点和属性。 设备树插件机制通过DTS&#xff08;设备树源文件&#xff0…