【数据结构初阶(5)】链式队列的基本操作实现

news2024/12/23 17:30:07

文章目录

  • 队列的定义
  • 初始化队列
  • 队尾入队列
  • 队头出队列
  • 取队头元素
  • 取队尾元素
  • 获取队列有效元素个数
  • 判断队空
  • 销毁队列

因为队列比较简单,关于队列的概念就不过多赘述了,本文只讲链队的基本操作实现

队列的定义

定义队列结点结构

  • 链队中的每个结点都应该包含一个数据域用来存储数据,以及一个指针域用来存储下一个结点的地址。
typedef int QDataType;

//对列中每个结点的结构
typedef struct QListNode
{
	QDataType data;				//数据域
	struct QListNode* next;		//指针域
}QNode;

定义队列

  • 一个正常的队列应该有一个队头指针和一个队尾指针分别用来指向队列的头和尾。
  • 除此之外,还需要一个变量用来表示当前队列有效数据的个数。
// 队列的结构 
typedef struct Queue
{
	int size;		//元素个数
	QNode* head;	//队头指针
	QNode* tail;	//队尾指针
}Queue;

初始化队列

  • 在队列内没有任何元素时,队头和队尾指针都应该指向空,元素个数也置为 0。
// 初始化队列 
void QueueInit(Queue* q)
{
	assert(q);

	q->head = q->tail = NULL;	//队头尾指针都置空
	q->size = 0;				//队内元素个数置空
}

队尾入队列

链队在入队时有两种情况

  1. 队列内无元素:同时让队头和队尾指针指向新结点。
  2. 队列内有元素:让队尾结点的指针域存储新结点的地址,将新插入的结点更新为尾结点。

在这里插入图片描述

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

	//创建新结点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));

	if (NULL == newnode)
	{
		perror("malloc");
		exit(-1);
	}

	newnode->data = data;				//将数据插入新结点数据域
	newnode->next = NULL;				//将新结点指针域置空

	if (NULL == q->tail)				//当前队列没有结点
	{
		q->head = q->tail = newnode;	//队头队尾的指针域同时指针新结点
	}
	else								//当前队列中有结点
	{
		q->tail->next = newnode;		//队尾结点指针域指向新结点
		q->tail = newnode;				//将插入的结点更新为尾结点
	}

	q->size++;							//队列内有效元素个数 + 1
}

队头出队列

队头出队列就是删除队头元素,在删除队头元素时有两种情况。

  1. 删除的是最后一个元素:删除该结点时头指针会往后走到 NULL 的位置,此时必须也将队尾指针也置空,否则队尾指针就成野指针了。

在这里插入图片描述

  1. 删除的非最后一个元素:保存队头的地址,然后将队头指针指向下一个结点,最后释放队头。

在这里插入图片描述

// 队头出队列 
void QueuePop(Queue* q)
{
	assert(q);
	assert(q->head);			//队列不为空

	QNode* delete = q->head;	//保存要删除的队头结点的地址
	q->head = q->head->next;	//头指针走向下一个结点
	free(delete);				//删除队头结点
	delete = NULL;	

	if (NULL == q->head)		//前面删除的是最后一个元素
	{
		q->tail = NULL;			//尾指针也置空
	}

	q->size--;					//队内元有效元素个数 -1
}

取队头元素

  • 在队列非空时,直接返回队头结点数据域内的数据即可。
// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(q->head);

	return q->head->data;	//返回队头结点的数据域内容
}

取队尾元素

  • 在队列非空时,直接返回队尾结点数据域内的数据即可。
// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(q->tail);		//队列不为空

	return q->tail->data;	//返回队尾结点的数据域内容
}

获取队列有效元素个数

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

	return q->size;
}

判断队空

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

	return 0 == q->size;	//表达式成立则结果为真,反之为假
}

销毁队列

  • 和单链表的销毁相同,利用一个指针 cur 保存当前要删除结点的地址,再定义一个 next 指针指向下一个要删除的结点。
  • 重复上述直到 cur 指向空为止,此时表示队列内的所有结点已经销毁完毕。

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

	QNode* cur = q->head;			//cur 先指向队头

	while (NULL != cur)
	{
		QNode* next = cur->next;	//保存下一个结点
		free(cur);					//删除当前结点
		cur = next;					//指向下一个结点
	}

	q->head = q->tail = NULL;		//队头尾指针都置空
	q->size = 0;
}

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

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

相关文章

RK3568平台开发系列讲解(Linux系统篇)pinctrl api介绍及实验

🚀返回专栏总目录 文章目录 一、pinctrl函数介绍二、设备树案例三、驱动案例 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍pinctrl api及其使用案例 。 一、pinctrl函数介绍 ①获取设备对应的 pinctrl…

在Matlab里安装gurobipy怎么安装教程

在Matlab 里安装gurobipy 先在CMD里激活, 然后添加系统环境变量 GRB_LICENSE_FILEC:\gurobi10.2\gurobi.lic 然后输入 addpath(D:\gurobi1003\win64\matlab) addpath(C:\gurobi1003\win64\matlab) addpath(C:\gurobi1002\win64\matlab) C:\gurobi1003\win64\m…

多功能智慧路灯系统整体解决方案介绍

在不改变现有城市景观的前提下,利用现有路灯改造,或新建多功能叁仟智慧路灯的方法,可实现城市无线网络、视频监控、物联传感网络、新能源充电系统、网格信息化管理的全覆盖,有效解决信息化设备选址难、取电难等问题。在目前无线通…

可以免费使用的Axure在线版来了

Axure作为一种功能强大的原型设计工具,一直受到设计师的青睐。然而,其高昂的价格可能成为一个门槛,限制了一些设计师的选择。但不用担心,现在有一个免费的Axure在线工具即时设计,功能更完整,更划算&#xf…

智能优化算法应用:基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.飞蛾扑火算法4.实验参数设定5.算法结果6.参考…

小程序如何进行版本回退

当商家决定回退小程序版本时,可能是因为新版本出现了一些问题或者不符合预期,需要恢复到之前的稳定版本。下面具体介绍怎么回退小程序的版本。 在小程序管理员后台->版本设置处,点击版本回退。确认后,小程序会回退到上一次的版…

基于springboot-“有光”摄影分享网站系统(2023年☆全网唯一)【附源码|数据库|表结构|万字文档(LW)|技术文档|说明文档】

主要功能 前台登录: 注册用户:用户账号、密码、姓名、手机号、身份证号、性别、邮箱 用户: ①首页、公告资讯展示、图片素材展示、活动展示、视频素材展示、查看更多 ②论坛、发布帖子、活动、活动标题、活动类型、公告资讯、公告标题、公告…

Day43力扣打卡

打卡记录 子数组的最小值之和(乘法原理 单调栈) 大佬的题解 class Solution:def sumSubarrayMins(self, arr: List[int]) -> int:n len(arr)# 左边界 left[i] 为左侧严格小于 arr[i] 的最近元素位置(不存在时为 -1)left, s…

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一(暴力求解)代码实现: 思路二(数列的思想)代码实现: 思路三(异或的运用)代码实现: 二、轮转数组 思路一(暴力求解&#xff09…

viple模拟器使用(三):unity模拟器中实现沿右墙迷宫算法

沿右墙迷宫算法 引导 线控模拟可以使得通过用户手动操作,实现机器人在模拟环境下在迷宫中行走(即:运动),算法可以使得机器人按照一定的策略自动行走,沿右墙迷宫算法就是其中的一种策略。 目的 运行程序后&…

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口,其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框,第二个按钮点击时会执行一个特定的操作(在这个例子中,仅打印一条调试信息)。 功能描述: 创建窗口和布局:…

RT-DETR改进 | 2023小目标改进 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址:官方Inner-IoU论文地址点击即可跳转 官方代码地址:官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址: 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

【大家的项目】Tran 简洁, 快速, 划词翻译

技术栈: rusttaurisolidjstypescript 欢迎萌新参与练手, 也欢迎大手子来魔改, ⭐star 当然是多多益善啦, ヾ(≧▽≦*)o Tran 简洁, 快速, 划词翻译 Keep it simple,stupid. 功能 划词翻译划过固定 划过关闭划过复制 快捷键: Alt X 构建 To \ FormZHJAZH…

中间件安全:Weblogic 漏洞.(使用工具可以利用多种类型漏洞)

中间件安全:Weblogic 漏洞.(使用工具可以利用多种类型漏洞) WebLogic 是美国 Oracle 公司出品的一个 application server,确切的说是一个基于 JAVA EE 架构的中间件,WebLogic 是用于开发、集成、部署和管理大型分布式…

【JAVA学习笔记】72 - 满汉楼 - 餐饮管理系统

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter26 一、需求说明 满汉楼项目功能多,界面复杂,涉及到复杂的awt和swing技术和事件编程,做如下调整: 1.去掉界面和事件处理(工作中使用很少),使…

OpenCvSharp从入门到实践-(03)像素

目录 像素 1、确定像素位置 2、获取像素的BGR值 3、修改像素的BGR值 像素 图像数字化是指用数字表示图像,每一幅数字图像都是有M行N列的像素组成的,其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别,这256个灰…

小航助学题库蓝桥杯题库stem选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSD…

Maven生命周期

Maven生命周期 通过IDEA工具的辅助,能很轻易看见Maven的九种生命周期命令,如下: 双击其中任何一个,都会执行相应的Maven构建动作,为啥IDEA能实现这个功能呢?道理很简单,因为IDEA封装了Maven提供…

C语言第三十五弹---打印九九乘法表

C语言打印九九乘法表 思路&#xff1a;观察每一行可以看出乘号右边的一行值都是相同的&#xff0c;而乘号左边不断变化&#xff0c;所以使用嵌套循环&#xff0c;控制好 乘号左右值变化的条件即可。 #include <stdio.h>int main() {for (int i 1; i < 9; i){for (in…

浏览器如何读取本地Excel表格

浏览器可以读取Excel表格数据吗&#xff1f; 答案是否定的&#xff0c;目前主流浏览器都无法打开本地Excel文档。 答案也是肯定的&#xff0c;这就来看看具体实现方法&#xff01;&#xff01;&#xff01; 首先准备一个Excel表格文件 保存在D:\\temp\测试表.xls…