数据结构——队列(链表实现)

news2024/11/16 23:41:10

一、队列的特点

先进先出

二、队列的代码

typedef int QDataType;

// 链式结构:表示队列 
typedef struct QListNode
{
    struct QListNode* next;
    QDataType data;
}QNode;

// 队列的结构 
typedef struct Queue
{
    QNode* front; //指向队列的第一个结点
    QNode* rear;//指向队列的最后一个结点
    int size;//记录队列中一共有几个元素
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);


    
// 初始化队列 
void QueueInit(Queue* q)
{
    assert(q);
    q->front = NULL;  //初始化为NULL
    q->rear = NULL;//初始化为NULL
    q->size = 0;  //初始化个数为0
}

// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
    assert(q);

    QNode* newnode = (QNode*)malloc(sizeof(QNode));//申请新的结点
    if (newnode == NULL)
    {
        perror("malloc fail");
        return;
    }
    newnode->data = data; 
    newnode->next = NULL;

    if (q->front == NULL)  //如果front指针指向的是NULL,说明插入前队列是空队列
    {
        q->front = newnode;
        q->rear = newnode;
    }
    else        //front指向的不是NULL,说明不是空队列
    {
        q->rear->next = newnode;
        q->rear = newnode;
    }
    q->size++;  //插入完,个数加1
}

// 队头出队列 
void QueuePop(Queue* q)//出队就是头删
{
    assert(q);
    assert(q->size != 0);//队列不为空

    QNode* head = q->front;  //找到头结点
    if (head->next == NULL)//如果出队之前,前队列只有一个结点  
    {
        free(head);   //释放头结点,后front 和rear都要指向NULL,表示现在是空队列
        head = NULL;   
        q->front = q->rear = NULL;
        q->size = 0;     //个数置为0
        return; 
    }
    else   //出队前,队列有两个及其以上的结点数
    {
        QNode* del = head;  
        head = head->next; //更新头结点
        free(del);  
        del = NULL;
        q->front = head;   //将front 指向更新后的头结点
        q->size--;//个数减1
    }
}

// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
    assert(q);

    return q->front->data;
}

// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
    assert(q);

    return q->rear->data;
}

// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
    assert(q);

    return q->size;
}

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)
{
    assert(q);

    if (q->front == NULL)//队列为空,返回1
        return 1;
    else
        return 0;
}

// 销毁队列 
void QueueDestroy(Queue* q)
{
    assert(q);

    QNode* del = q->front;
    QNode* cur = del->next;
    while (del!=NULL)    //逐个释放结点
    {
         
        free(del);
        del = cur;
        if(cur!=NULL)
         cur= cur->next;
    }
    q->size = 0;
}

三、队列的函数测试

1.取队头函数 QueueFront

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

  
    QDataType x= QueueFront(&Q);// 获取队列头部元素 
printf("队头元素是%d \n", x);

QueueDestroy(&Q);// 销毁队列

    return 0;
}

结果:

 

2.取队尾函数QueueBack

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

    QDataType y= QueueBack(&Q); // 获取队列队尾元素 
  printf("队尾元素是%d \n", y);
    
QueueDestroy(&Q);// 销毁队列

    return 0;
}

 结果:

3.求队列中元素个数 函数 QueueSize(&Q)

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

    int z= QueueSize(&Q); // 获取队列中有效元素个数 
printf("一共有%d个成员 \n", z);

QueueDestroy(&Q);// 销毁队列

    return 0;
}

 结果;

 4.出队函数QueuePop(头删)

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

   
    QueuePop(&Q);// 队头出队列 
QueuePop(&Q);// 队头出队列 


while (!QueueEmpty(&Q))
{
    printf("%d ", QueueFront(&Q));
    QueuePop(&Q);
}

    return 0;
}

结果:

原来 1 2 3 4 入队  出队两次, 变成  3 4 .

 

5.判断队列是否为空的函数QueueEmpty(不为空就会依次出队)

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

   
    while (!QueueEmpty(&Q))  //队列不为空,就会依次出队
  {
    printf("%d ", QueueFront(&Q));
    QueuePop(&Q);//依次出队
  }

    printf("所有成员出完队后\n");
    int w= QueueEmpty(&Q);
if (w != 0)
    printf("队列已经空了");

    return 0;
}

结果:

 

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

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

相关文章

刷代码随想录有感(66):回溯算法——组合问题的优化(剪枝)

代码&#xff1a;将for循环中i的搜索范围进行缩小&#xff0c;免去多余的不可能符合条件的操作。 for(int i start; i < n-(k-tmp.size())1;i) 实质是剪枝&#xff0c;拿n4,k4作比较&#xff1a; 显然结果只可能是[1,2,3,4]&#xff0c;选取顺序只可能是1-2-3-4&#xff…

Day27 代码随想录打卡|栈与队列篇---删除字符串中的所有相邻重复项

题目&#xff08;leecode T1047&#xff09;&#xff1a; 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终…

霍廷格电源 Tru plasma DC3030 通快DC3040 MF3030

霍廷格电源 Tru plasma DC3030 通快DC3040 MF3030

Muse论文精读

Muse Abstract 我们介绍了Muse&#xff0c;一个文本到图像的Transformer模型&#xff0c;它实现了最先进的图像生成性能&#xff0c;同时比扩散或自回归模型更有效。Muse是在离散标记空间中的掩码建模任务上进行训练的:给定从预训练的大型语言模型(LLM)中提取的文本嵌入&…

C语言如何删除表中指定位置的结点?

一、问题 如何删除链表中指定位置的结点&#xff1f; 二、解答 删除链表中指定的结点&#xff0c;就像是排好队的⼩朋友⼿牵着⼿&#xff0c;将其中⼀个⼩朋友从队伍中分出来&#xff0c;只需将这个⼩朋友的双⼿从两边松开。 删除结点有两种情况&#xff1a; &#xff08;1&am…

三菱FX3U-4AD模拟量电压输入采集实例

硬件&#xff1a;&#xff30;&#xff2c;&#xff23;模块 &#xff26;&#xff38;&#xff13;&#xff27;&#xff21;-&#xff12;&#xff14;&#xff2d;&#xff34; &#xff1b;&#xff21;&#xff0f;&#xff24;模块&#xff26;&#xff38;&#xff13…

连接虚拟机的 redis

用Windows 的 Redis Insight 连接虚拟机的 安装redis发现连不上 我的redis是新安装&#xff0c;没有用户名密码&#xff0c;发现是ip问题 127 开头的被我注释了&#xff0c;换成了ifconfig查到的ip

Nginx 生产环境部署的最佳实践

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 最近一段时间&#xff0c;我一直在和大家一起探讨Nginx的相关话题。期间&#xff0c;我收到了很多小伙伴的私信&#xff0c;他们好奇地问我&#xff1a;在生产环境中&#xff0c;Nginx应该如何配置&#xff1f; 他们在…

idea启动Jsp非maven项目时的一些步骤

文章目录 事前准备eclipse项目举例idea打开eclipse项目安装tomcat配置启动项启动测试 一些小问题到不到servlet 事前准备 非社区版idea【否则启动项无法配置】tomcatmysql eclipse项目举例 idea打开eclipse项目 剩下的全部下一步即可 安装tomcat 自己的文章 Javaweb - t…

《云原生安全攻防》-- 构建云原生攻防场景

在本节课程中&#xff0c;我们将学习云原生攻防场景的构建。为了研究云原生安全攻击案例&#xff0c;我们需要搭建一个云原生攻击测试环境&#xff0c;以便进行攻防研究和攻击手法的复现。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; 构建云原生攻防场景&#xf…

设计模式-动态代理

目录 定义 代理模式的优缺点 优点 缺点 应用场景 静态代理 动态代理 相关资料 定义 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它的概念很简单&#xff0c;它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个…

Spring WebFlux 初探-响应式编程-021

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

Unity射击游戏开发教程:(17)添加推进器推进和推进器推进动画

添加推进器打开功能 我们可以添加一个推进器栏,用于跟踪玩家使用推进器增强(按住左 Shift 键)的时间。当未使用推力时,将会有一段延迟,直到推力条开始再生。当棒再生时,可以使用推进器,但再生过程将重新开始。 我们将使用 Unity 的 UI Slider 组件,因此我们将其添加到已…

【挑战30天首通《谷粒商城》】-【第一天】10、环境-docker安装mysql

文章目录 课程介绍一、docker 安装 mysql Stage 1&#xff1a;下载镜像文件 Stage 1-1&#xff1a;打开官网查看镜像 Stage 1-2&#xff1a;拉取镜像 Stage 1-3&#xff1a;查看拉取的镜像 Stage 2&#xff1a;创建实例并启动 A&#xff1a;mysql&#xff08;5.7版&#xff09;…

代码随想录—— 填充每个节点的下一个右侧节点指针(Leetcode116)

题目链接 层序遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node _right, Node _next) {val _val;left _…

【完整过程】Windows下记录PadleOCR训练自己的ocr模型

一、前期准备 1、代码 参考的博主使用的是2.6版本的 博主的paddleocr代码 下面这个是官方的&#xff0c;可能已经更新了&#xff08;我用的是官网当前最新版&#xff09; paddleocr的源代码 注意&#xff1a;最好把上面两个代码都下载下来&#xff0c;后面都会用到 参考博…

HTML静态网页成品作业(HTML+CSS)——自动化专业介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

从需求到实现:能源软件服务商如何量身定制企业解决方案

能源行业需要数字化转型的原因主要有以下几点&#xff1a;首先&#xff0c;数字化技术可以提高生产效率和安全性&#xff0c;通过实时监控和智能调度降低事故风险&#xff0c;并实现远程控制和自动化生产。其次&#xff0c;数字化转型有助于推动能源行业的创新发展&#xff0c;…

Android ndk获取手机内部存储卡的根目录方法

如下所示&#xff1a; 代码语言&#xff1a;javascript jclass envcls env- FindClass("android/os/Environment"); //获得类引用if (envcls nullptr) return 0;//找到对应的类&#xff0c;该类是静态的返回值是FilejmethodID id env- GetStaticMethodID(envcls,…

Nodejs 第七十章(OSS)

OSS OSS&#xff08;Object Storage Service&#xff09;是一种云存储服务&#xff0c;提供了一种高度可扩展的、安全可靠的对象存储解决方案 OSS 对象存储以对象为基本存储单元&#xff0c;每个对象都有唯一的标识符&#xff08;称为对象键&#xff09;和数据。这些对象可以…