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

文章目录

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

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

队列的定义

定义队列结点结构

  • 链队中的每个结点都应该包含一个数据域用来存储数据,以及一个指针域用来存储下一个结点的地址。
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.mzph.cn/news/174683.shtml

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

相关文章

Go 数字类型

一、数字类型 1、Golang 数据类型介绍 Go 语言中数据类型分为:基本数据类型和复合数据类型基本数据类型有: 整型、浮点型、布尔型、字符串复合数据类型有: 数组、切片、结构体、函数、map、通道(channel)、接口 2、…

什么是 dropblock

大家好啊,我是董董灿。 之前介绍过 dropout 算法,它在训练神经网络中,可以随机丢弃神经元,是一种防止网络过拟合的方法。 但是在卷积神经网络中,dropout 的表现却不是很好,于是研究人员又搞了一个“结构化…

Python列表:操作与实例分析,你值得一看!

Python列表是一种重要的数据结构,它允许您存储和管理多个数据项。本文将深入探讨Python列表的操作,以及通过具体实例分析如何使用它们,以帮助您更好地理解和优化您的代码。 什么是Python列表? Python列表是一种有序、可变的数据结…

基于51单片机的全自动洗衣机proteus仿真设计

标题目录 💫51单片机全自动洗衣机proteus仿真设计💫设计介绍💫仿真图电动机驱动模块电路设计电源模块电路设计控制按键进水阀和排水阀控制继电器 💫程序设计main函数 💫设计报告💫资料清单&&下载链…

PC行内编辑

点击编辑,行内编辑输入框出现,给列表的每条数据定义编辑标记,最后一定记得 v-model双向绑定,使数据回显。 步骤: 1、给行数据定义编辑标记 2、点击行编辑标记(isedit) 3、插槽根据标记渲染表单 …

探究Kafka原理-6.CAP理论实践

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理🔥如果感觉博主的文章还不错的话,请&#x1f44…

Transformer中的多头注意力机制-为什么需要多头?

Transformer为什么使用多头注意力机制呢? 多头可以学习到不同维度的特征和信息。为什么可以学习到不同维度的信息呢? 答案是:多头注意力机制的组成是有单个的self attention,由于self attention通过产生QKV矩阵来学习数据特征&a…

leetCode 1026. 节点与其祖先之间的最大差值 + 递归

1026. 节点与其祖先之间的最大差值 - 力扣(LeetCode) 给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V |A.val - B.val|,且 A 是 B 的祖先。(如果 A 的任何子节点之一为 B&am…

网络和Linux网络_5(应用层)HTTP协议(方法+报头+状态码)

目录 1. HTTP协议介绍 1.1 URL介绍 1.2 urlencode和urldecode 1.3 HTTP协议格式 1.4 HTTP的方法和报头和状态码 2. 代码验证HTTP协议格式 HttpServer.hpp 2.2 html正式测试 Util.hpp index.html 2.3 再看HTTP方法和报头和状态码 2.3.1 方法_GET和POST等 2.3.2 报头…

SpringBoot——国际化

优质博文:IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件; 【2】使用ResourceBundleMessageSource管理国际化资源文件; 【3】在页面使用ftp:message取出国际化内容; 二、SpringBoot编写国际化步骤 【1】创…

软件工程期末复习(选择+填空+判断)

文章目录 软件工程期末复习一、 选择题 软件工程期末复习 一、 选择题 1.“软件危机”的表现不包括:(c) A、软件产品不能按期交付 B、用户对“已完成的”软件产品时常不满意 C、程序员越来越供不应求 D、软件项目难以管理,维护困…

东胜物流软件 SQL注入漏洞复现

0x01 产品简介 东胜物流软件是一款致力于为客户提供IT支撑的 SOP, 帮助客户大幅提高工作效率,降低各个环节潜在风险的物流软件。 0x02 漏洞概述 东胜物流软件 TCodeVoynoAdapter.aspx、/TruckMng/MsWlDriver/GetDataList、/MvcShipping/MsBaseInfo/Sav…

CSS3制作3D爱心动画

1、什么是CSS css,即层叠样式表的简称,是一种标记语言,有浏览器解释执行用来使页面变得更美观。 2、选择器 css3中新增了一些选择器,如下: 3、新样式 边框 css3新增了三个边框属性,分别是: bo…

linux之下安装 nacos

1 下载地址 也可使用在线下载wget https://github.com/alibaba/nacos/releases/download/1.4.6/nacos-server-1.4.6.tar.gzTags alibaba/nacos GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud nativ…

android trace文件的抓取与查看方法

本地手机抓取trace 解压android trace文件的抓取与查看方法 找到config.pbtx文件,连接手机push进去 # push config.pbtx ,/data/local/tmp/为自定义push到的目录 adb push config.pbtx /data/local/tmp/ adb shell # 抓取trace, /data/loc…

【MyBatisPlus】通俗易懂 快速入门 详细教程

目录 学习目标 一、MyBatisPlus简介 1. 入门案例 问题导入 1.1 SpringBoot整合MyBatisPlus入门程序 ①:创建新模块,选择Spring初始化,并配置模块相关基础信息 ②:选择当前模块需要使用的技术集(仅保留JDBC&…

bodymovin:AE动画导出为JSONforMac/win中文版下载

对于动画制作爱好者和专业设计师来说,Adobe After Effects(AE)是一个强大的工具,可以创造出惊人的动画效果。然而,将这些动画导出为可交互的格式一直是一个挑战。现在,有了bodymovin,你可以轻松…

[原创][1]探究C#多线程开发细节-“Thread类的简单使用“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

搜索百度可以直接生成代码拉

先看效果图: 使用示例: 比如我要搜索“JS取一个数在两个数更近”的方法,直接搜“JS取一个数在两个数更近”,点击百度一下,就会出现想要的代码,如上图。

基于OpenCV+YOLOv5实现车辆跟踪与计数(附源码)

导 读 本文主要介绍基于OpenCVYOLOv5实现车辆跟踪与计数的应用,并给出源码。 资源下载 基础代码和视频下载地址: https://github.com/freedomwebtech/win11vehiclecount main.py代码:​​​​​​​ import cv2import torchimport numpy as npfrom tr…