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

news2024/11/17 7:45:34

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

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

目录

【链表】

一、单链表

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.coloradmin.cn/o/2174328.html

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

相关文章

上交所服务器崩溃:金融交易背后的技术隐患暴露杭州BGP高防服务器43.228.71.X

一、上交所宕机事件始末 2024 年 9 月 27 日,上交所交易系统突发崩溃,这一事件犹如一颗巨石投入平静的湖面,引起了轩然大波。当天上午,众多投资者反馈券商交易出现延迟问题,随后上交所发布了《关于股票竞价交易出现异常…

产品管理 - 互联网产品(3) : 迭代管理

1、需求文档的每一个迭代版本号,都需要标识出来 根据软件文档的配置标准: 上线时:X.Y 修改时:X.YZ 草稿时:0.XY 2、每一个项目干系人,都可以访问到最新版本的需求。 所有角色必须要有统的一认知。这是需求…

【一文读懂】通信卫星频段探秘:从L到Ka的全面介绍(增加Q/V和UHF频段)

一、引言 背景介绍: 卫星通信,作为现代通信技术的关键一环,利用人造卫星作为中继,实现了全球范围内的即时通信。这一技术极大地拓宽了通信的边界,对现代社会产生了深远影响。 在广播电视领域,卫星通信让…

Linux——K8s pod调度

rc/rsdeployment statefulset daemonsetjob | cronjob 访问pod中的应用:在pod已经处于running状态之下,客户端的请求如何到达pod中的应用? K8S 平台本身的网络架构设计: coredns 属于K8S核心组件,提供K8S集群…

甄选范文“论软件的可靠性设计”,软考高级论文,系统架构设计师论文

论文真题 现代军事和商用系统中,随着系统中软件成分的不断增加,系统对软件的依赖性越来越强。软件可靠性已成为软件设计过程中不可或缺的重要组成部分。实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制,由此提出了可靠性设计…

05-成神之路_ambari_Ambari实战-013-代码生命周期-metainfo-configFiles详解

1.Redis 集群 metainfo.xml 示例 <?xml version"1.0"?> <metainfo><schemaVersion>2.0</schemaVersion><services><service><!-- Redis 集群服务的基本信息 --><name>REDIS</name><displayName>Redi…

告别选择困难症,这些AI高效工具正改变着500万创作者的工作方式

本文背景 有个小伙子叫李光头&#xff0c;最近他为了紧跟 AI 的潮流&#xff0c;下载了不少新玩意&#xff1a;用 GPT 来写文案&#xff0c;用 Midjourney 来画图。 可当他准备开始这周的工作时&#xff0c;却发现自己陷入了一种奇怪的困境&#xff1a;虽然有了很多 AI 工具&am…

解决在vue项目中index.html中直接引入Cesium.js时候报错:Cesium is not defined

在vue项目直接引入Cesium&#xff1a; 报错&#xff1a;Cesium is not defined 原因&#xff1a;eslint报错&#xff0c;找不到Cesium 这个全局变量。 解决&#xff1a;向ESLint规则中添加全局变量&#xff1a; 找到package.json文件&#xff0c;在eslintConfig里加入 "…

【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;单例模式&#xff08;singleton&#xff09; 1&#xff1a;概念 二&#xff1a;“饿汉模…

CentOS 修改服务器登录密码的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

众数问题,

在本实验中&#xff0c;需要编写一个程序来处理一组输入数据&#xff0c;找出其中的众数&#xff0c;即出现次数最多的数字。程序会读取文件中的数据进行处理&#xff0c;并将结果与标准答案进行比对&#xff0c;判断程序输出是否正确。 #include <bits/stdc.h> #define …

Spring-bean实例化的方式

前言 什么是bean的实例化&#xff1f; 通常我们使用spring管理java的对象&#xff0c;一般称这个java对象为一个实例化的bean。bean的实例化方式&#xff0c;实际上就是spring创建并管理java对象实例的方式 bean的实例化方式 在Java和Spring框架的上下文中&#xff0c;Bean的实…

测试用例的举例

1. 基于测试公式设计测试用例 通过功能&#xff0c;性能&#xff0c;安全性&#xff0c;界面&#xff0c;安全性&#xff0c;易用&#xff0c;兼容对于一个水杯进行测试用例的设计&#xff1b; 对于一个软件的测试用例设计&#xff1a; 功能&#xff1a;软件本质上能够用来干什…

京东健康高级项目经理段一凡受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 京东健康技术产品部高级项目经理段一凡先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“项目经理如何做好资源管理——货币化资源管理实践”。大会将于10月26-27日在北京举办…

C++ | 定长内存池 | 对象池

文章目录 C | 定长内存池 | 对象池一、内存池的引入二、代码中的内存池实现 - ObjectPool类&#xff08;一&#xff09;整体结构&#xff08;二&#xff09;内存分配 - New函数&#xff08;三&#xff09;内存回收 - Delete函数 三、内存池在TreeNode示例中的性能测试演示四、脱…

文件和目录

文件和目录 获取文件属性 通过 ls 命令可以查看到文件的很多属性内容&#xff0c;这些文件属性的内容可以通过以下几个函数获取: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>int stat(const char *pathname, struct stat *statbuf…

第一节- C++入门

1. &#x1f680;&#x1f680;C关键字(C98) &#x1f33c;&#x1f33c;C总计63个关键字&#xff0c;C语言32个关键字 ps&#xff1a;下面我们只是看一下C有多少关键字&#xff0c;不对关键字进行具体的讲解。后面我们学到以后再细讲。 2. 命名空间 在C/C中&#xff0c;变量…

基于深度学习的学情智能监测系统设计与实现(PYQT+YOLOv8+训练数据集+论文+部署文档)

摘要 本文设计并实现了一个基于深度学习的学情智能监测系统&#xff0c;该系统通过对学生学习状态的自动监测与分析&#xff0c;旨在辅助教师更精准地把握学生学习情况&#xff0c;进而优化教学策略和提升教学质量。在论文中&#xff0c;详细描述了系统的设计与实现过程&#…

【web开发】Spring Boot 快速搭建Web项目(三)

Date: 2024.08.31 18:01:20 author: lijianzhan 简述&#xff1a;根据上篇原文Spring Boot 快速搭建Web项目&#xff08;二&#xff09;&#xff0c;由于已经搭建好项目初始的框架&#xff0c;以及自动创建了一个启动类文件&#xff08;TestWebApplication.java&#xff09; …

一种路径敏感的数据依赖分析算法

Falcon 1.方法1.1.Basic Rule1.2.改进算法1.3.跨函数分析 2.Evaluation2.1.设置2.2.value-flow分析2.3.Thin Slicing2.4.Bug Detection 参考文献 这篇工作发表于PLDI 24&#xff0c;提出了一种context- 以semi-path-sensitive的数据依赖分析算法&#xff0c;解决path-sensitive…