c语言----队列

        很久没有写文章了。因为放假了嘛,给自己稍微放松了一下,所以最近的更新很慢。呜呜下一次一定改。然后咧。今天我想与大家分享的是队列。虽然这个知识点我们应该在讲了堆的实现就应该写的,但是后面忘了,以为自己是写了的。但是昨天看了看自己写的目录才发现自己忘了写队列了。所以今天把队列补上,并且当我们写了队列后我们会写队列与堆的相互实现。

队列的含义

        大家如果一直有在看我的文章的话可能已经了解了队列的含义了,但按照规矩我还是向大家解释一下队列的含义。队列咧。就像我们排队买奶茶一样。先进行排队的人可以先买后进行排队的人后买,我们大家都遵守的规则,然后队列也遵守这个规则。就好比我们的堆是后进先出一样。队列必须遵守这个。还有就是队列他只能头删和尾插。当然还有一些其他的基本上做比如说什么判空或者返回头元素之类的。那么接下里我们就来康康实现队列需要怎么搞。

实现队列

     创建结构体

       我们都说了,队列与堆可以相互出现,其实就代表他们的大体结构是差不多的。就只需要注意一下他们的定义的区别就可以了。那么我们应该也会要像他们一样先创建一个结构体来储存数据。但是我们创建结构体又不能指向开始一样只创建一个结构体。因为如果我们只创建一个结构体的话,我们需要数据节点为头节点,还需要再一个数组的个数还需要一个尾节点。然后还有指向的一个数据。如果都放在一个这个里面的话会比较麻烦,但是我们可以将头节点和尾节点直接单独拎出来。但是我们创建的结构里面的数据还是以最开始的节点为基准。大家可以先看一下我的代码是怎么样的:

typedef int QDateType;//队列存储数据类型typedef struct QueueNode //队列元素节点
{QDateType val;//队列的元素个数struct QueueNode* next;//指向的下一个节点
}QueueNode;typedef	struct Queue //队列
{QueueNode* head;//头节点QueueNode* tail;//尾节点
}Queue;

5c9d1e95af7d4a5f9884c89ba6e34443.png

        大家可以稍微看一下,我这个可能会比较抽象,但确实就像这样子。就好像创建了一个结构体,然后在他结构体里面再分化一下。 

队列的初始化

       对于队列的初始化,这样就很是很简单的,因为我们只需要将它的头节点和尾节点置为空就可以了。

void QueueInti(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;
}
队列的销毁

       相较于队列的初始化,队列的销毁就相对会麻烦一点。因为我们首先需要判断是否为空指针。然后再创建一个指针为头指针,依次销毁置空。然后再将头尾节点置为空就结束了。虽然也是很简单的,但是相较于初始化确实多了几行代码。

void QueueDestory(Queue* pq)
{assert(pq); //防止pq为空指针QueueNode* cur = pq->head;//创建一个零时节点以免对代码实现干扰while (cur){//依次销毁,并且换到下一个QueueNode* next = cur->next;free(cur);cur = next;}pq->tail = pq->head = NULL;//头尾置为空
}
队列的入队列 

      我们在前面说我们队列是先进先出的,那么入队列肯定也是依次从头节点开始进入。所以我们对入队列就是需要开辟一个新的节点来存储数据。然后将他放在尾节点的后面然后将尾节点移位,那么这个头插就结束了。但是我们还需要思考的是并不是我们每一次使用开始队列就有数据了。那我们是不是需要区分一下,如果对于你开始里面没有数据应该怎么处理?就是当头节点和尾节点都是同一个的时候,还没有数据的时候。那么我们是不是应该让头节点和尾节点的同时置于相同的数据。因为这个时候我们头和尾节点是相同的呀。所以这也是我们需要考虑的一点。

void QueuePush(Queue* pq, QDateType x)
{assert(pq); //防止pq为空指针QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));//创建新节点存放数据if (NULL == newNode)//判断是否创建好了{printf("malloc error\n");exit(-1);}newNode->val = x;newNode->next = NULL;//开辟一个新节点存储数据if (pq->tail == NULL)//判断是否为空队列{assert(pq->head == NULL);pq->head = pq->tail = newNode;}else{pq->tail->next = newNode;pq->tail = newNode;}
}
队列的出队列

       我们在前面实现了尾插后,接下来就应该实现头删了。既然是头删,那么我们是不是要思考一下。假如只有一个指针的话,就是例如我刚插入一个之后,我就立马删除了。已经有很多个元素了,我再删除这两种区别。所以我们就需要分别的对待这两件事情。大家想一想,如果只有一个指针的话,我们是不是只需要将头和尾直接置为空就可以了?因为只有一个节点嘛,然后我删除一个节点,那是不是周围空了?所以就只需要将头和尾置空一下就好了。然后还有就是正常情况下,我们不能直接将头删掉,如果删掉的话是不是就不能找到下一个节点了?所以我们正常的情况下需要创建一个临时节点,然后再来删除。

void QueuePop(Queue* pq)
{assert(pq);//防止pq为空指针assert(pq->head && pq->tail); //防止队列为空队列if (pq->head->next == NULL)//假如只有一个节点的话,就全部置为空{free(pq->head);pq->head = pq->tail = NULL;}else//有多个节点就创建一个零时节点然后来释放置空{QueueNode* next = pq->head->next;free(pq->head);pq->head = next;}
}
队列的头元素

        对于队列的取头元素这是比较简单的,因为我们在最开始创建的时候就已经写了一个头节点和尾节点了。只需要判断节点是否为空就可以了。

QDateType QueueFront(Queue* pq)
{assert(pq);//防止pq为空指针assert(pq->head && pq->tail); //防止队列为空队列return pq->head->val;
}
   队列的判空

       关于队列的判空呢其实也是比较简单的。如果当头节点和尾节点相同,并且为都为空的话,那么肯定就是空的队列了。当然我们还是需要判断指针是否为空。

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL;
}
队列的元素个数

         对于判断队列的元素个数,我的这个方法其实是比较麻烦的,我是像在需要队列个数的时候重新执行一遍便利的过程,这样我们就可以得出元素的个数了。但是也可以在创建结构体的那个地方再加一个size反正就是一个计数的就可以了,那么如果当我们计数的为零,那么就说明是队列为空,并且对于我们计算元素个数也是很方便的,当然这也是另外一种的方法,我这里就先写我原本的遍历一遍就好了,大家如果感兴趣的话,后面可以尝试一下。

int QueueSize(Queue* pq)
{assert(pq);QueueNode* cur = pq->head;//创建一个临时节点,更加方便操作int count = 0;while (cur){cur = cur->next;count++;}return count;//返回个数
}

总结

       好了,上面就是关于队列的大部分使用方法了。当然还有很多对于这个的延伸,这就可能会用在后面的题目上。后面的面试题之类的。那可以多尝试一下练题,然后就能加深一下对队列的一些的相关知识的巩固。那么接下来来我就这样所有的代码给大家看一下。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int QDateType;typedef struct QueueNode
{QDateType val;struct QueueNode* next;
}QueueNode;typedef	struct Queue
{QueueNode* head;QueueNode* tail;
}Queue;void QueueInti(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;
}void QueueDestory(Queue* pq)
{assert(pq);QueueNode* cur = pq->head;while (cur){QueueNode* next = cur->next;free(cur);cur = next;}pq->tail = pq->head = NULL;
}void QueuePush(Queue* pq, QDateType x)
{assert(pq);QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));if (NULL == newNode){printf("malloc error\n");exit(-1);}newNode->val = x;newNode->next = NULL;if (pq->tail == NULL){assert(pq->head == NULL);pq->head = pq->tail = newNode;}else{pq->tail->next = newNode;pq->tail = newNode;}}void QueuePop(Queue* pq)
{assert(pq);assert(pq->head && pq->tail);if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QueueNode* next = pq->head->next;free(pq->head);pq->head = next;}
}bool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL;
}QDateType QueueFront(Queue* pq)
{assert(pq);assert(pq->head);return pq->head->val;
}int QueueSize(Queue* pq)
{assert(pq);QueueNode* cur = pq->head;int count = 0;while (cur){cur = cur->next;count++;}return count;
}

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

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

相关文章

sql查询练习

1.表的结构 课程表&#xff1a;课程编号cid&#xff0c;课程名称canme&#xff0c;老师tid&#xff0c; 教师表&#xff1a;教师tid&#xff0c;教师姓名tname 分数表&#xff1a;学生student_sid&#xff0c;课程 cours_id&#xff0c;&#xff0c;分数score 学生表&#xff…

DC/AC电源模块为现代电子设备提供稳定的能源

BOSHIDA DC/AC电源模块为现代电子设备提供稳定的能源 DC/AC电源模块是一种重要的电子设备&#xff0c;它为现代电子设备提供稳定的能源。在今天的高科技社会中&#xff0c;电子设备已经成为人们生活和工作的重要组成部分。从家用电器到计算机、手机、汽车和航天航空设备&…

基于antv x6实现的组织架构图

X6 是基于 HTML 和 SVG 的图编辑引擎&#xff0c;基于 MVC 架构&#xff0c;用户更加专注于数据逻辑和业务逻辑。 一、业务背景 将组织树形结构图形化&#xff0c;更直观的展示个人所在的组织架构。 二、功能点 组织结构按需渲染&#xff0c;支持层级展开、收缩按需求自定义…

【软件测试】之黑盒测试用例的设计

&#x1f3c0;&#x1f3c0;&#x1f3c0;来都来了&#xff0c;不妨点个关注&#xff01; &#x1f3a7;&#x1f3a7;&#x1f3a7;博客主页&#xff1a;欢迎各位大佬! 文章目录 1.测试用例的概念2.测试用例的好处3. 黑盒测试用例的设计3.1 黑盒测试的概念3.2 基于需求进行测…

AI绘画Stable Diffusion画全身图总是人脸扭曲?ADetailer插件实现一键解决!

大家好&#xff0c;我是向阳 你是否遇到过SD生成的人物脸部扭曲、甚至令人恶心的情况&#xff1f;也曾感到束手无策&#xff1f;别担心&#xff0c;这份教程专为你而来。 在使用SD生成人物全身照时&#xff0c;你可能经常发现人物的脸部会出现扭曲问题。这是因为人物面部像素…

【前端】IntersectionObserver 实现图片懒加载和无限滚动

【前端】IntersectionObserver 实现图片懒加载和无限滚动 在前端开发中&#xff0c;性能优化是一个重要的考量因素。随着现代网页和应用的复杂性增加&#xff0c;确保页面快速加载和流畅运行变得越来越重要。本文将介绍一种强大的工具——IntersectionObserver API&#xff0c…

LabVIEW新能源汽车电池性能测试系统

新能源汽车的核心部件之一是电池&#xff0c;其性能直接关系到整车的续航里程、安全性和寿命。为了确保电池的性能和可靠性&#xff0c;测试是必不可少的环节。本文介绍了一种基于LabVIEW的新能源汽车电池性能测试系统&#xff0c;通过LabVIEW与数据采集设备的无缝集成&#xf…

Unity 实现UGUI 简单拖拽吸附

获取鼠标当前点击的UI if(RectTransformUtility.RectangleContainsScreenPoint(rectTransform, Input.mousePosition)) {return rectTransform.gameObject; } 拖拽 在Update 中根据鼠标位置实时更新拖拽的图片位置。 itemDrag.transform.position Input.mousePosition; …

秒拿AI模型API Key!Chat2DB AI模型切换实用秘籍

智谱AI&#xff08;ZhiPu AI&#xff09; 智谱 AI 是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。 1.申请调用权限 智谱AI开放平台网址&#xff1a;https://open.bigmodel.cn/ 点击开始使用&#xff0c;进行登录/注册。 智谱A…

The Sandbox 创作者的幕后采访: 了解创作者的内心世界

我们采访了一些在 "创作者挑战" 中脱颖而出的顶尖创作者&#xff0c;探讨他们成功的秘诀以及在创造玩家喜爱的体验方面的心得。 The Sandbox 创作者挑战涌现出许多才华横溢的创作者&#xff0c;他们在游戏制作机制上的创新和突破引起了 The Sandbox 社区的广泛关注。…

大白菜U盘启动工具

大白菜如何u盘启动进winpe装系统大白菜是一款非常实用的U盘启动盘制作工具&#xff0c;可以帮助用户快速地将U盘制作成启动盘&#xff0c;从而方便地进行系统安装、维护和修复等操作。官方网站&#xff1a; 大白菜u盘启动盘制作工具_大白菜u盘装系统_大白菜pe_大白菜官网-首页…

Spring AI 1.0.0 新变化,从 0.8.1 如何升级

Spring AI 1.0.0-M1 版本已经发布&#xff0c;距离 1.0.0 正式版又更近了一步。同时这也意味着&#xff0c;Spring AI 1.0.0 的 API 已经基本确定&#xff0c;不会发生大的改动。这里介绍一下&#xff0c;相对于上一个发布版本 0.8.1&#xff0c;Spring AI 1.0.0 的一些重要的变…

轻松跨越国界:使用WildCard畅享全球AI服务

大家好&#xff0c;现在AI技术已经深入到我们的日常生活中。然而&#xff0c;许多朋友仍然难以获取优质的AI工具和应用。那么&#xff0c;如何才能使用像ChatGPT这样的AI服务呢&#xff1f; 今天我为大家介绍一个“一劳永逸”的解决方案&#xff0c;它就是我们的主角——WildC…

阿里云 ECS 服务器的安全组设置

阿里云 ECS 服务器的安全组设置 缘由安全组多个安全组各司其职一些常见的IP段百度 IP 段华为云 IP 段搜狗蜘蛛 IP 段阿里云 IP 段 。。。 缘由 最近公司规模缩减&#xff0c;原有的托管在 IDC 机房的服务器&#xff0c;都被处理掉了&#xff0c;所有代码都迁移到了阿里云的云服…

腾讯云函数部署环境[使用函数URL]

使用函数URL 之前使用的是网关API,最近腾讯云的网关API说要关闭了,所以没有办法这里改成函数URL,使用后发现只要不是在浏览器直接访问的情况,函数URL都可以满足! 这里结合腾讯云函数node.js返回自动带反斜杠这篇文章来做说明,比如这里的URL如下: 结合文章腾讯云函数node.js返…

T113基于评估板SDK配置PD引脚异常

使用PD0/PD1/PD2作为IO输入时,发现输入检测到的值异常,断开输入的信号,直接示波器打IO口,还能发现波形信号,猜测该引脚存在引脚复用情况。 原因 这三个引脚在默认系统是作为显示相关引脚功能。 解决方法 1 ) Uboot修改

99. 岛屿数量

题目描述&#xff1a;给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述&#xff1a…

SSZipArchive 解压后 中文文件名乱码问题

不知道什么情况&#xff0c;做为一个三方广泛使用的框架库&#xff0c;会出现这种比较低级的问题&#xff01; 还有中文的文件名解压后显示乱码&#xff01; 经过深入研究排查&#xff0c;发现目录或文件名编码错误&#xff01;但是POD库&#xff0c;不可能直接在里面改&#…

Objective-C语法基础

注&#xff1a;编译器版本 XCode 15.4 新建一个XCode项目 新建一个类 1、成员变量、属性 1.1、类内使用成员变量&#xff0c;类外使用属性 Role.h #import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGINinterface Role : NSObject {//成员变量&#xff1a;只能…

Ubuntu18.04安装AutoWare.ai(完整版)

目录 目录 一、安装Opencv 1.1 下载安装包Opencv官网 1.2 安装opencv_contrib 二、安装Eigen库 1. 解压文件 2. 安装Eigen 3. 配置路径&#xff1a; 三、安装Ros和rosdepc 四、安装Autoware.ai-1.14.0 4.1 安装依赖 4.2 下载Autoware.ai 1.在home路径下打开终端输…