【数据结构初阶(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,一经查实,立即删除!

相关文章

windows安装mysql5.7.26

解压mysql5.7.26文件夹拷贝到c:下 添加系统环境变量C:\mysql-5.7.26\bin cmd管理员打开终端,进入C:\mysql-5.7.26\bin 运行mysqld --initialize,生成data目录的文件。 在安装目录下创建my.ini文件,点击编辑,配置以下信息: 设置my…

Go 数字类型

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

什么是 dropblock

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

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

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

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

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

递归实现选择排序.

思路: 1.定位数组中的最大元素或最小元素 2.将其与第一个元素交换位置 3.接着将剩余未排序的元素中的最大值或最小值与第二个元素交换位置 4.以此类推,直到排序完成 示例: [ 8, 5, 1, 9, 3 ] //原始数组 [ 1, 5, 8, 9, 3 ] //3与8交换 [ 1, 3, 8, 9, 5 ] //3与5交换 [ 1,…

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】创…

cJSON的使用——下载、打包与解析

目录 一、cJSON的下载 二、cJSON的常用函数 三、cJSON的打包例程 四、cJSON的解析例程1 五、cJSON的解析例程2 一、cJSON的下载 cjson下载 二、cJSON的常用函数 cJSON *cJSON_Parse(const char *value); 作用:将一个JSON数据包,按照cJSON结构体…

Day48:583. 两个字符串的删除操作、72. 编辑距离

文章目录 583. 两个字符串的删除操作思路代码实现 72. 编辑距离思路代码实现 583. 两个字符串的删除操作 题目链接 思路 确定dp数组(dp table)以及下标的含义 dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2&am…

假设检验(一)假设检验的基本概念

文章目录 假设与检验规则两类错误假设检验的一般步骤参考文献 假设检验(Test of Hypothesis)是指,先对总体或总体的性质提出某项假设,再利用样本所提供的信息对提出的假设进行检验,以判断该假设是否成立。假设检验可分…

编译器设计02-前端概述

前端处理概述 前端处理:词法分析、语法分析、语义分析 前端处理犹如阅读英文文章,往往我们需要先理清文章中各个词的意思,这类似词法分析,得到“单词序列”;再梳理整篇文章的脉络,这类似语法分析&#xf…

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

文章目录 软件工程期末复习一、 选择题 软件工程期末复习 一、 选择题 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…