用链表实现的C语言队列
一、队列概述
在数据结构中,队列是一种先进先出(FIFO)的线性表。它在许多应用场景中非常有用,例如任务调度、进程管理、资源管理等。队列是一种重要的数据结构,其主要特点是先进先出(FIFO, First In First Out)。这意味着在队列中,最先进入队列的元素将最先被移出。队列的这种特性使得它在许多实际应用中非常有用,例如打印队列、任务调度、进程管理等。
队列的基本操作包括:
- 入队(Enqueue):将元素加入到队列的末尾。
- 出队(Dequeue):将队列最前面的元素移出队列。
- 获取队首元素(Front):查看队列最前面的元素,但不移出。
- 检查队列是否为空(IsEmpty):判断队列是否为空。
- 获取队列大小(Size):获取队列中的元素个数
今天 我将会用链表实现队列:
二、队列基本操作
队列的结点定义
首先,我们定义一个节点结构体来存储每个元素及其指向下一个节点的指针。
#define eleType int //定义队列元素数据类型//定义结点
typedef struct Node
{eleType data; //数据域struct Node* next; //指针域
} Node;
队列结构体
接下来,我们定义一个队列结构体,包含指向队首和队尾的指针以及队列中的元素个数。
//定义队列结构体
typedef struct
{Node* front; //链表头队列首元素指针Node* rear; //队尾元素指针size_t size; //队列元素个数
} Quene;
队列的创建
初始化一个队列,需要将队首和队尾指针都设置为NULL,并将队列的大小初始化为0。、
void QueneCreat(Quene *q)
{q->front = q->rear = NULL;q->size = 0; //初始化为零
}
队列的销毁
销毁队列需要释放所有节点的内存,并将队首和队尾指针设置为NULL,队列的大小重置为0。
void QueneDestroy(Quene* q)
{while (q->front) //队首元素开始遍历{Node* temp = q->front; //每次遍历将队首指针存入到temp变量中q->front = q->front->next; //将队首指向后继free(temp); //删除游离出来的原来的队首结点}q->rear = NULL; //遍历完成后,将队尾指向空q->size = 0; //将队列重置为0,表示已经清空
}
入队操作
在队尾插入一个新元素。首先为新元素分配内存,然后根据队列是否为空更新队首和队尾指针。
void QuenePush(Quene* q, eleType element)
{//分配一个Node类型的空间,将其地址赋给newNode变量Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = element; //将要添加的元素赋值给新结点的数据域newNode->next = NULL; //将新结点的后继结点指向空if (q->rear == NULL) //判断当前队列是否为空,只需要判断队尾是否为空q->front = q->rear = newNode; //如果为空,将队首和队尾都指向新结点else //如果不为空{q->rear->next = newNode; //将新结点排入队尾q->rear = newNode; //更新队尾结点}q->size++; //队列大小加1
}
出队操作
在队首删除一个元素。首先检查队列是否为空,然后更新队首指针并释放原队首节点的内存。
eleType QuenePop(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}eleType element = q->front->data; //将队首元素赋值给element,用于返回Node* temp = q->front; //将队首指针存储到temp变量中q->front = q->front->next; //更新队首,游离出来原来的队首free(temp); //删除原来的队首q->size--; //队列大小减1if (q->size == 0) //如果队列空了的话q->rear = NULL; //将队尾指向空return element; //
}
获取队首元素
获取队首元素的数据,而不删除队首元素。
eleType QueneFront(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}return q->front->data; //返回队首元素
}
获取队列大小
获取队列中元素的个数。
size_t QueneSize(Quene* q)
{return q->size; //返回队列大小
}
三、完整代码
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#define eleType int //定义队列元素数据类型//定义结点
typedef struct Node
{eleType data; //数据域struct Node* next; //指针域
} Node;//定义队列结构体
typedef struct
{Node* front; //链表头队列首元素指针Node* rear; //队尾元素指针size_t size; //队列元素个数
} Quene;//队列的创建
void QueneCreat(Quene *q)
{q->front = q->rear = NULL;q->size = 0; //初始化为零
}//队列的销毁
void QueneDestroy(Quene* q)
{while (q->front) //队首元素开始遍历{Node* temp = q->front; //每次遍历将队首指针存入到temp变量中q->front = q->front->next; //将队首指向后继free(temp); //删除游离出来的原来的队首结点}q->rear = NULL; //遍历完成后,将队尾指向空q->size = 0; //将队列重置为0,表示已经清空
}//入队
void QuenePush(Quene* q, eleType element)
{//分配一个Node类型的空间,将其地址赋给newNode变量Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = element; //将要添加的元素赋值给新结点的数据域newNode->next = NULL; //将新结点的后继结点指向空if (q->rear == NULL) //判断当前队列是否为空,只需要判断队尾是否为空q->front = q->rear = newNode; //如果为空,将队首和队尾都指向新结点else //如果不为空{q->rear->next = newNode; //将新结点排入队尾q->rear = newNode; //更新队尾结点}q->size++; //队列大小加1
}//出队
eleType QuenePop(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}eleType element = q->front->data; //将队首元素赋值给element,用于返回Node* temp = q->front; //将队首指针存储到temp变量中q->front = q->front->next; //更新队首,游离出来原来的队首free(temp); //删除原来的队首q->size--; //队列大小减1if (q->size == 0) //如果队列空了的话q->rear = NULL; //将队尾指向空return element; //
}//获取队首元素
eleType QueneFront(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}return q->front->data; //返回队首元素
}//获取队列大小
size_t QueneSize(Quene* q)
{return q->size; //返回队列大小
}
今天介绍了如何使用链表在C语言中实现一个队列,并详细解释了每个步骤的实现方法。通过这种方式实现的队列,不仅可以动态扩展,还能高效地进行插入和删除操作。在实际应用中,这种链表实现的队列可以用于任务调度、进程管理等场景。
相关文章:
用链表实现的C语言队列
一、队列概述 在数据结构中,队列是一种先进先出(FIFO)的线性表。它在许多应用场景中非常有用,例如任务调度、进程管理、资源管理等。队列是一种重要的数据结构,其主要特点是先进先出(FIFO, First In First …...
国产SDI视频均衡驱动器,功能与 LMH0387/LMH0344 一致
视频均衡驱动器,功能与 LMH0387 一致、LMH0344。本期间支持 DVB-ASI,作为驱动器能够选择输出速率,作为均衡接收器能支持100m以上传输距离(线缆类型Belden 1694A)。最大支持3Gbps 速率的信号 2 产品特征 a)…...
如何用Xinstall CPS结算系统打破传统营销桎梏,实现用户增长?
在互联网流量红利逐渐衰退的今天,App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系,成为了众多企业急待解决的问题。而在这个关键时刻,Xinstall CPS结算系统应运而生,以其独特的优势帮助企业解决了一系列…...
(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2+bx+c0 的两个根:
(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2bxc0 的两个根: b2-4ac 称作一元二次方程的判别式。如果它是正值,那么一元二次方程就有两个实数根。 如果它为 0,方程式就只有一个根。如果它是负值,方程式无实根。 编写程序,提示…...
如何提高网站收录?
GSI服务就是专门干这个的,这个服务用的是光算科技自己研发的GPC爬虫池系统。这个系统通过建立一个庞大的站群和复杂的链接结构,来吸引谷歌的爬虫。这样一来,你的网站就能更频繁地被谷歌的爬虫访问,从而提高被收录的机会。 说到效…...
Docker 学习总结(83)—— 配置文件daemon.json介绍及优化建议
一、daemon.json 文件概述 daemon.json是Docker守护进程的配置文件,它允许系统管理员自定义Docker守护程序的行为。此文件通常位于/etc/docker/目录下。通过修改daemon.json,可以调整Docker守护进程的多种设置,包括网络配置、日志记录、存储驱动等。 二、daemon.json 文件结…...
Javaweb04-Servlet技术2(HttpServletResponse, HttpServletRequest)
Servlet技术基础 HttpServletResponse对象 HttpServletResponce对象是继承ServletResponse接口,专门用于封装Http请求 HttpServletResponce有关响应行的方法 方法说明功能描述void setStatus(int stauts)用于设置HTTP响应消息的状态码,并生成响应状态…...
chat gpt基本原理解读
chat gpt基本原理解读 ChatGPT是一种基于生成式预训练变换器(Generative Pre-trained Transformer, GPT)的对话模型,主要通过大量的文本数据训练生成自然语言回复。以下是ChatGPT的基本原理解读: 1. 基本架构 ChatGPT 是基于 GPT…...
单目标应用:基于蛇鹫优化算法SBOA的微电网优化(MATLAB代码)
一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、蛇鹫优化算法求解微电网 2.1算法简介 蛇鹫优化算法(Secre…...
MySQL系列-安装配置使用说明(MAC版本)
1、前言 本文将介绍MySQL的安装配置以及基本语法操作说明 环境:mac 版本:MySQL 8.0.28 之前电脑安装卸载过,后面在装的时候遇到一些问题,用了四五天才解决,主要是参考 https://blog.csdn.net/zz00008888/article/deta…...
vue elementui el-input 正则验证,限制只能输入数字和小数
vue elementui el-input 正则验证 限制只能输入数字和小数,以下两种方法都可以: 1、οninput“value value.replace(/[^0-9.]/g,‘’)” 2、οninput“value value.replace(/[^\d.]/g, ‘’)” 限制只能输入数字: 1、oninput “valuevalu…...
强化学习入门
简介 强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化…...
简约不简单,建筑装饰演绎现代美学
走在城市的大街小巷,你是否曾被那些独特而精美的建筑装饰所吸引?每一栋建筑都像是艺术家的杰作,通过精美的装饰诉说着它的故事。 我们的建筑装饰,不仅注重外在的美观,更追求内在的品质。从古典的雕花到现代的简约线条&…...
SpringBoot调用WebService的实践
作者所在公司的系统间的信息交互是通过webservice完成。如:MES与SAP的交互,MES与WMS的交换,MES与SRM的交互,MES与IOT的交互等。 MES是用.NET VS2008 C#写的,调用webservice很简单,这里不再赘述。如有想了解…...
源码编译构建LAMP
Apache 起源 源于A Patchy Server,著名的开源Web服务软件1995年时,发布Apache服务程序的1.0版本由Apache软件基金会(ASF)负责维护最新的名称为“Apache HTTP Server”官方站点:http://httpd.apache.org/ 主要特点 开发源代码/…...
搜索是门艺术,大神都是这样找资源
以下所有资源均可在星云导航找到,网站地址:https://www.xygalaxy.com/ 浏览器搜索高级用法 1、排除干扰,指定关键词 1.1、排除指定关键字 格式:关键字1 -关键字2比如搜索:星云导航,不想要CSDN的内容 星…...
【设计模式深度剖析】【5】【行为型】【迭代器模式】
👈️上一篇:策略模式 | 下一篇:中介者模式👉️ 设计模式-专栏👈️ 文章目录 迭代器模式定义英文原话直译如何理解呢? 迭代器模式的角色1. Iterator(迭代器)2. ConcreteIterator(具体迭代器…...
怎么更快捷的修改图片大小?压缩图片jpg、png、gif的快捷方法
jpg作为最常用的一种图片格式,在遇到图片太大问题时,该如何操作能够快速在压缩图片jpg的大小呢?图片太大无法上传时目前常见的一个使用问题,只有将图片处理到合适的大小才可以正常在平台上传使用,一般情况下想要快速解…...
Shell脚本 if语句
条件测试: $? 返回码 判断命令或者脚本是否执行成功(最近的一条) 0 true 为真就是成功 成立 非0 false 失败或者异常 test命令 可以进行条件测试 然后根据的是返回值来判断条件是否成立。 -e 测试目录或者文件是否存在 exist -d 测试…...
集合查询-并(UNION)集运算、交(INTERSECT)集运算、差(EXCEPT)集运算
一、概述 集合查询是对两个SELECT语句的查询结果进行再进行处理的查询 二、条件 1、两个SELECT语句的查询结果必须是属性列数目相同 2、两个SELECT语句的查询结果必须是对应位置上的属性列必须是相同的数据类型 三、并(UNION)运算 1、语法格式: SELECT 语句1…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
