数据结构与算法基础-学习-13-线性表之链队

news2024/11/28 0:43:50

一、个人理解

  1. 链队是线性表的衍生之一,具有先进先出的特性,在队尾进行插入操作,在队头进行删除操作。

  1. 链队由于是动态扩容的,需要新的数据节点时,分配一个,所以不存在顺序队的真上溢情况。

  1. 链队删除队头节点,也就是出队后,头节点直接指向原首元节点的下一个节点,所以也不存在顺序队的假上溢情况。

顺序队相关概念、实现以及真假上溢的理解说明,请参考之前写的文章,链接:《数据结构与算法基础-学习-12-线性表之顺序队

二、图解

1、链队

2、空队列

3、出队

数据a和b出队。

4、入队

数据a和b入队。

三、结构体

1、ElemType

(1)说明

链队单节点数据域的内容,保存学生学号、学生姓名、学生分数。

(2)定义

typedef struct ElemType
{
    char StudentNum[StudentNumLen];
    char StudentName[StudentNameLen];
    int  StudentScore;
}ElemType;

2、LinkQueueNode

(1)说明

链队单节点分数据域指针域。

(2)定义

typedef struct LinkQueueNode
{
    ElemType              Data;
    struct LinkQueueNode* NextPointer;
}LinkQueueNode, *LinkQueueNodePtr;

3、LinkQueue

(1)说明

链队结构,有队头指针、队尾指针、队长。

(2)定义

typedef struct LinkQueue
{
    LinkQueueNodePtr FrontPtr;  //队头,出队时用,指的是头节点。
    LinkQueueNodePtr RearPtr;   //队尾,入队时用。
    QueueLenType     QueueLen;
}LinkQueue;

四、函数

1、InitLinkQueue

(1)用途

初始化链队。

(2)源码

Status InitLinkQueue(LinkQueue* LQ)
{
    JudgeAllNullPointer(LQ);
    LQ->FrontPtr = (LinkQueueNodePtr)MyMalloc(sizeof(LinkQueueNode));
    memset(&(LQ->FrontPtr->Data),0,sizeof(ElemType));
    LQ->FrontPtr->NextPointer = NULL;
    LQ->RearPtr  = LQ->FrontPtr;
    LQ->QueueLen = 0;
    Log("Init LinkQueue    : OK\n",Info);
    return SuccessFlag;
}

(3)参数

参数名

说明

LQ

LinkQueue*类型链队。

2、GetLinkQueueLen

(1)用途

获取链队长度。

(2)源码

QueueLenType GetLinkQueueLen(LinkQueue* LQ)
{
    JudgeAllNullPointer(LQ);
    return LQ->QueueLen;
}

(3)参数

参数名

说明

LQ

LinkQueue*类型链队。

3、DestroyLinkQueue

(1)用途

销毁链队。

(2)源码

Status DestroyLinkQueue(LinkQueue* LQ)
{
    JudgeAllNullPointer(LQ);
    LinkQueueNodePtr TmpPtr = LQ->FrontPtr;
    while(TmpPtr)
    {
        LQ->FrontPtr = TmpPtr->NextPointer;
        free(TmpPtr);
        TmpPtr = LQ->FrontPtr;
    }
    LQ->RearPtr  = NULL;
    LQ->QueueLen = 0;
    free(LQ);
    LQ           = NULL;
    Log("Destroy LinkQueue : OK\n",Info);
    return SuccessFlag;
}

(3)参数

参数名

说明

LQ

LinkQueue*类型链队。

4、EnterLinkQueue

(1)用途

链队入队,将E的数据复制到链队LQ中。

(2)源码

Status EnterLinkQueue(LinkQueue* LQ, ElemType E)
{
    JudgeAllNullPointer(LQ);
    LinkQueueNodePtr NewNode = (LinkQueueNodePtr)MyMalloc(sizeof(LinkQueueNode));
    NewNode->Data            = E;
    NewNode->NextPointer     = NULL;
    LQ->RearPtr->NextPointer = NewNode;
    LQ->RearPtr              = NewNode;
    LQ->QueueLen++;
    Log("Enter LinkQueue   : OK\n",Info);
    return SuccessFlag;
}

(3)参数

参数名

说明

LQ

LinkQueue*类型链队。

E

ElemType类型数据。

5、LeaveLinkQueue

(1)用途

链队出队,将队头的出队节点的数据域复制到输出参数E中。

实现时需要注意的点,链队中只有一个元素中时,出队后,需要把队尾指针指向队头指针,表示这是一个空的链队,特殊情况备注一下。

(2)源码

Status LeaveLinkQueue(LinkQueue* LQ, ElemType* E)
{
    JudgeAllNullPointer(LQ);
    JudgeAllNullPointer(E);
    if(GetLinkQueueLen(LQ) == 0)
    {
        Log("LinkQueue is Empty, Data cannot be left\n",Warning);
        return FailFlag;
    }
    LQ->QueueLen--;
    *E = LQ->FrontPtr->NextPointer->Data;
    LinkQueueNodePtr TmpPtr = LQ->FrontPtr->NextPointer->NextPointer;
    free(LQ->FrontPtr->NextPointer);
    LQ->FrontPtr->NextPointer = TmpPtr;

    //如果链队中只有一个元素,这个元素出队后,需要把队尾指针指向队头指针,表示这是一个空链队。
    if(GetLinkQueueLen(LQ) == 1)
    {
        LQ->RearPtr = LQ->FrontPtr;
    }
    Log("Leave LinkQueue   : OK\n",Info);
    return SuccessFlag;
}

(3)参数

参数名

说明

LQ

LinkQueue*类型链队。

E

ElemType*类型数据,输出参数。

6、GetLinkQueueTop

(1)用途

获取链队队头元素。

(2)源码

ElemType GetLinkQueueTop(LinkQueue* LQ)
{
    JudgeAllNullPointer(LQ);
    if(GetLinkQueueLen(LQ) == 0)
    {
        Log("LinkQueue is Empty, can't get LinkQueueTop\n",Warning);
        return LQ->FrontPtr->Data;
    }
    return LQ->FrontPtr->NextPointer->Data;
}

(3)参数

参数名

说明

LQ

LinkQueue*类型链队。

五、编译执行

[gbase@czg2 LinearTable_LinkQueue]$ make
gcc -Wall -g ../Log/Log.c LinkQueue.c main.c -o TestLinkQueue -I ../Log/
[gbase@czg2 LinearTable_LinkQueue]$ ./TestLinkQueue 
2023-2--Info--Init LinkQueue    : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Info--Enter LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 100
2023-2--Debug--LinkQueue Data :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 100
+++++++++++++++
StudentNum     : X666
StudentName    : Sun
StudentScore   : 101
+++++++++++++++
StudentNum     : X666
StudentName    : Sun
StudentScore   : 102
+++++++++++++++
StudentNum     : X666
StudentName    : Sun
StudentScore   : 103
+++++++++++++++
StudentNum     : X666
StudentName    : Sun
StudentScore   : 104
+++++++++++++++
StudentNum     : X666
StudentName    : Sun
StudentScore   : 105
+++++++++++++++
StudentNum     : X666
StudentName    : Sun
StudentScore   : 106
+++++++++++++++
StudentNum     : X666
StudentName    : Sun
StudentScore   : 107
+++++++++++++++
FrontPtr       : 0x246f100
RearPtr        : 0x246f320
QueueLen       : 8
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 100
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 101
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 102
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 103
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 104
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 105
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 106
2023-2--Info--Leave LinkQueue   : OK
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 107
2023-2--Warning--LinkQueue is Empty, Data cannot be left
2023-2--Debug--ElemType Data  :
StudentNum     : X666
StudentName    : Sun
StudentScore   : 107
2023-2--Debug--LinkQueue Data :
FrontPtr       : 0x246f100
RearPtr        : 0x246f100
QueueLen       : 0
2023-2--Warning--LinkQueue is Empty, can't get LinkQueueTop
2023-2--Debug--ElemType Data  :
StudentNum     : 
StudentName    : 
StudentScore   : 0
2023-2--Info--Destroy LinkQueue : OK

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

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

相关文章

点击化学交联剂1807518-78-0,Propargyl-PEG1-SS-PEG1-t-butyl ester,丙炔单乙二醇二硫键单乙二醇叔丁酯

1、基础产品数据(Basic Product Data):CAS号:1807518-78-0中文名:丙炔-单乙二醇-二硫键-单乙二醇-叔丁酯英文名:Propargyl-PEG1-SS-PEG1-t-butyl ester 结构式(Structural)&#xff…

176、【动态规划】leetcode ——1143. 最长公共子序列(C++版本)

题目描述 原题链接:1143. 最长公共子序列 题目描述 本题和 718. 最长重复子数组(动态规划) 的区别在于此时不要求令一个数组中元素连续。 动态规划五步曲: (1)dp[i][j]含义: 截止到text1[i …

前端编译、JIT编译、AOT编译

一、前端编译:java设计之初就是强调跨平台,通过javac将源文件编译成于平台无关的class文件, 它定义了执行 Java 程序所需的所有信息(许多Java"语法糖",是在这个阶段完成的,不依赖虚拟机&#xff…

将多个springboot项目的pom.xml文件整合

将多个springboot项目的pom.xml文件整合 0.0、前因 ​ 刚入公司敲代码时、发现一个项目中会包含多个子项目、每个子项目会代表一个功能模块、这属实是把我这个菜鸟惊叹到了。而这种分而治之的方式也引申出一个问题:各子项目的依赖如何统一管理? ​ 我…

Linux:基于bufferevent epoll tcp客户端代码

基于bufferevent epoll tcp客户端代码: include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <event2/event.h> #include <event2/buffere…

在外包干了几年,感觉自己都快费了

先说一下自己的情况。大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

JavaEE-初识Servlet

目录Servlet 是什么?完成一个servlet程序1.创建一个maven项目2.引入依赖3.创建目录4.编写Servlet代码5.打包6.部署7.验证程序第三方工具简化Servlet 是什么? Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app. …

项目难点——【3】分布式任务调度、线程池使用、视频转换

项目难点——【3】分布式任务调度、线程池使用、视频转换 我们有时候在处理视频文件的时候会遇到视频格式转换问题。 1 分布式任务调度 在项目开发中我们想要提升我们项目响应的速度或者想要服务器高效处理一批任务&#xff0c;这个时候就有两种方式&#xff1a; 多线程&#x…

(18)目标检测算法之数据集标签格式转换:json2txt、xml2txt

目标检测算法之数据集标签格式转换&#xff1a;json2txt、xml2txt 目标检测最常见的模型&#xff1a;YOLO&#xff0c;常见的几种标注方式&#xff1a;矩形框、旋转矩形框、实例分割中的多边形标注等类型&#xff0c;根据其标注标签&#xff0c;目标检测主要有以下两种转换方式…

快速读懂网络拓扑图

快速读懂网络拓扑图几重常见的网络拓扑总线型拓扑简介优点缺点环型拓扑简介优点缺点星型拓扑简介优点缺点网络层级机构节点结点链路通路不同的连接线代表什么意思&#xff1f;不同颜色、粗细的直线代表什么意思&#xff1f;闪电线-串行链路几重常见的网络拓扑 总线型拓扑 简介…

创建项目(React+umi+typeScript)

项目框架搭建的方式react脚手架Ant-design官网一、安装方式npm二、安装方式yarn三、安装方式umi devreact脚手架 命令行&#xff1a; npx create-react-app myReactName项目目录结构&#xff1a; 浏览器运行&#xff0c;端口号3000&#xff1a; Ant-design官网 一、安装方…

zk-STARK/zk-SNARK中IP,PCP,IPCP,IOP,PIOP,LIP,LPCP模型介绍

我们的目标是构造 zkSNARK。在我们的目标场景中&#xff0c;Prover 只需要发送一个简短的证明字符串给 Verifier&#xff0c;而 Verifier 不需要给 Prover 发送任何消息。 直接构造一个满足这个场景的 zkSNARK 可能会很困难。一个更灵活的方式是在先在理想模型下构造证明系统&…

SocketPro完整使用教程分享,手把手指导

SocketPro是一款外贸与跨境业务&#xff0c;设计师&#xff0c;海外留学生经常使用的工具。 那么&#xff0c;到底该如何使用SocketPro这款工具&#xff0c;实现自己的业务需求呢&#xff1f;这里放一个以前其他大佬关于SocketPro使用体验的测评: 上面的SocketPro使用测评&…

【Java并发编程】线程安全(一)Synchronized原理

Synchronized底层实现 简单来说&#xff0c;Synchronized关键字的执行主体是线程对象&#xff0c;加锁是通过一个锁对象来完成的是&#xff0c;而锁对象底层关联了一个c源码的monitor的对象&#xff0c;monitor对象底层又对应了操作系统级别的互斥锁&#xff0c;同一时刻只有一…

历时半年,我终于阿里上岸了,附面经和Java非科班学习心得

个人经历 本科双非化学&#xff0c;跨考了电子硕士&#xff0c;研究生依然双非。无互联网实习&#xff0c;无比赛无论文。&#xff08;研究生研究方向是车辆电子和楼宇自动化&#xff0c;有自动化和高校实训讲师相关的实习经历&#xff09; 21年11开始学Java准备秋招。 阿里上…

你真的懂二分法吗?

二分法 二分法非常让我们头痛&#xff0c;不论对于初学者&#xff0c;还是对于有一定编程经验的人来讲&#xff0c;我们都会以为这个思想很简单&#xff0c;而不去在意&#xff0c;可是在实际运用中我们在处理边界条件的时候&#xff0c;往往会要不写出了死循环&#xff0c;要不…

NVM安装与配置教程

一、NVM简介 在项目开发过程中&#xff0c;使用到vue框架技术&#xff0c;需要安装node下载项目依赖&#xff0c;但经常会遇到node版本不匹配而导致无法正常下载&#xff0c;重新安装node却又很麻烦。为解决以上问题&#xff0c;nvm&#xff1a;一款node的版本管理工具&#xf…

Mysql 索引(一)—— 主键索引的底层原理

索引的作用是提升Mysql的检索速度。 如果没有索引&#xff1a;若我们要在几百万条记录中找出一个名为“张三”的人&#xff0c;这个时候我们只能逐条遍历记录&#xff0c;直至找到这个人&#xff1b;如果有索引&#xff1a;假设名为“张三”的人所在记录的索引为 999&#xff…

【构建工具】webpack5 的性能优化和核心流程

文章目录webpack5 构建性能的极致优化一、使用最新版webpack二、使用 lazyCompilation三、约束 Loader 执行范围四、使用 noParse/externals 跳过文件编译五、开发模式禁用产物优化六、最小化 watch 监控范围七、跳过 TS 类型检查八、优化 ESLint 性能九、source-map简化十、设…

Linux:基于libevent读写管道代码,改进一下上一篇变成可以接收键盘输入

对上一篇进行改进&#xff0c;变成可以接收键盘输入&#xff0c;然后写入管道&#xff1a; 读端代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <s…