链式队列的结构设计及基本操作的实现(初始化,入队,出队,获取元素个数,判空,清空,销毁)

news2025/6/9 14:19:19

目录

一.链式队列的设计思想

二.链式队列的结构设计

三.链式队列的实现

四.链式队列的总结


一.链式队列的设计思想

首先一定要理解设计的初衷,就是队头队尾的位置要满足怎么快怎么设计.那么分析如下:

最终我们敲定了入队,出队的时间复杂度都为O(1)的一种设计,也就是第四种设计;当然,头节点的数据域不使用,所以我们设计链式队列的头节点的时候删除数据域即可,链式队列的结构设计如下:

二.链式队列的结构设计

typedef struct LPNode//数据节点

{
    int data;//数据
    struct LPNode* next;//后继指针
}LPNode;


typedef struct HNode //链式队列的头节点

{
    struct LPNode* front;//队头指针,指向第一个数据节点
    struct LPNode* rear;//队尾指针,指向最后一个数据节点
}HNode ,*PLQueue;

三.链式队列的实现

//初始化
void InitQueue(PLQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return;
	pq->front = NULL;
	pq->rear = NULL;

}

//入队;
bool Push(PLQueue pq, int val)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;
	//申请节点
	LPNode* p = (LPNode*)malloc(sizeof(LPNode));
	p->data = val;
	p->next = NULL;//p->next=pq->rear->next;
	//插入

	if (IsEmpty(pq))//第一次入队
	{
		pq->front = p;
		pq->rear = p;
	}
	else
	{
		pq->rear->next = p;//将P插入到队尾
		pq->rear = p;//更新队尾指针
	}
	return true;
}

//出队,获取队头的值并且删除
bool Pop(PLQueue pq, int* rtval)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;

	if (IsEmpty(pq))
	{
		return false;
	}
	*rtval = pq->front->data;
	//删除第一个节点
	LPNode* p = pq->front;
	pq->front = p->next;
	free(p);
	if (pq->front == NULL)//删除最后一个节点
	{
		pq->rear = NULL;
	}

	return true;
}



//获取队头元素的值但不删除
bool GetTop(PLQueue pq, int* rtval)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;
	if (IsEmpty(pq))
	{
		return false;
	}
	*rtval = pq->front->data;
	return true;
}

//获取长度
int GetLength(PLQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return -1;
	int count = 0;
	for (LPNode* p = pq->front; p != NULL; p = p->next)
	{
		count++;
	}
	return count;

}

//判空
bool IsEmpty(PLQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;

	return pq->front == NULL;
}

//销毁
void Destroy(PLQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return;
	LPNode* p;
	while (pq->front != NULL)//总是删除第一个数据节点
	{
		p = pq->front;
		pq->front = p->next;
		free(p);
	}
	pq->rear = NULL;
}

四.链式队列的总结

1.带头节点,队头为第一个数据节点,队尾在最后一个数据节点
2.头节点为一个队头指针,一个队尾指针,增加队尾指针可以让入队的时间复杂度为O(1)

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

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

相关文章

7、Jenkins+Nexus3+Docker+K8s实现CICD

文章目录 基本环境配置一、Jenkins安装必要插件二、Jenkins系统配置三、新建流水线四、在项目工程里添加Jenkinsfile、deploy.yml五、在项目工程里添加Dockerfile在这里插入图片描述 总结 提示:本章主要记录各基本环境搭建好后如何配置Jenkins流水线部署微服务到K8s…

【动态规划】LeetCode-63.不同路径II

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…

探索未来能源:可控核聚变的挑战与希望

探索未来能源:可控核聚变的挑战与希望 引言 随着人类社会的不断发展,对能源的需求也在持续增长。传统的化石燃料能源在燃烧过程中会产生大量的二氧化碳和其他温室气体,导致全球气候变暖,对环境产生了重大威胁。因此,寻找一种清洁、可持续、高效的能源成为了当务之急。在…

MMseqs2蛋白质序列快速高效比对工具

先看仓库:soedinglab/MMseqs2: MMseqs2: ultra fast and sensitive search and clustering suite (github.com) 无论哪个工具软件,无论你是否熟悉,都推荐你看一下作者原文,这样后面的步骤以及怎么使用头脑里会更清晰。 Fast an…

Linux expect命令详解

在Linux系统中,expect 是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。本文将深入探讨expect命令的基本语法、使用方法以及一些最佳实践。 什么是Expect命令? expect 是一个用于自动化交互式进程的工具。它的主要功能…

VSC++=》 美丽字符串()

缘由https://bbs.csdn.net/topics/396428505 void 美丽字符串() {string zf ""; int j 0, b 0, sl[47]{}, wi 0;cin >> zf; zf "0";// zf.push_back(0);while (zf[j] ! 0)if (zf[b] zf[j])sl[b], b 0, j; else b;//if ((wi zf.find(zf[j]))…

Linux CentOS7 联网配置 | 安装中文输入法

参考视频:保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 配置网络:解决上网问题 第一步:选择网络模式 第二步:配置网卡命令:打开终端执行命令: 1、先切换到根目录下,防止在第执行cd …

【Linux】ubuntu配置SSH服务

要在Ubuntu上配置SSH服务,首先安装ssh-server sudo apt install openssh-server 安装完成后,可以检查一下是否安装成功 systemctl status ssh vim /etc/ssh/sshd_config 此时ubuntu就可以被远程连接工具连接了,如果我们想配置关于SCP服务允…

基于HTML+CSS+JavaScript的登录注册网页设计

一、界面效果: 二、HTML代码: 登录注册html: 登录成功html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <h1>登录成功!</h1> </body> <…

【计算机网络学习之路】URL概念及组成

目录 一. URL是什么 二. URL的组成 三. encode和decode 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇讲解使用浏览器不可或缺的部分——URL 一. URL是什么 域名及DNS 我们在…

Azure Machine Learning - 在 Azure AI 搜索中创建全文查询

Azure AI搜索中如果要为全文搜索生成查询&#xff0c;本文提供了设置请求的步骤。 本文还介绍了查询结构&#xff0c;并说明了字段属性和语言分析器如何影响查询结果。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&a…

口罩标准讲解及推荐

一、我国医用口罩质量标准 1、YY/T0969-2013《一次性使用医用口罩》 2、YY0469-2011《医用外科口罩》 3、GB19083-2010《医用防护口罩技术要求》三类医用口罩各项指标对比如下&#xff1a; 结论&#xff1a;防护效果来说&#xff1a;医用防护口罩>医用外科口罩>一次性…

wordpress忘记密码怎么办?

有的时候&#xff0c;我们会忘记网站的密码&#xff0c;所以网站的密码要记住&#xff0c;那记不住&#xff0c;怎么样才可以登录后台呢&#xff1f;下面来给大家说一下方法&#xff0c;第一种方法&#xff0c;就是进入数据库里面修改密码&#xff0c;第二种就是从新搭建&#…

对Spring框架的一些总结

对Spring框架的一些总结 在文章开头我真心推荐大家一个优秀的编程老师&#xff1a;孙帅老师(孙哥suns)&#xff0c;孙帅老师在哔哩哔哩的Spring5教学视频时长接近33个小时&#xff0c;从0基础到一步一步手把手的教你抽丝剥茧分析Spring框架的所有知识&#xff0c;孙帅老师的教…

基于单片机智能电子秤称重系统设计

**单片机设计介绍&#xff0c;基于单片机智能电子秤称重系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能电子秤称重系统是一种通过使用单片机、载荷传感器等组件来实现精准称重的系统。 该系统的设计流程如下&…

Java基础-----Math类相关的API(一)

文章目录 1. Math类1.1 简介1.2 常用方法1.3 小练身手 2.Random类2.1 简介2.2 构造方法2.3 常用方法 3. BigInteger和BigDecimal3.1 简介3.2 创建方式3.3 方法3.4 RoundingModel处理方式(8种)3.4.1 **UP**3.4.2 **DOWN**3.4.3 **CEILING**3.4.4 **FLOOR**3.4.5 **HALF_UP**3.4.…

神经网络(第三周)

一、简介 1.1 非线性激活函数 1.1.1 tanh激活函数 使用一个神经网络时&#xff0c;需要决定在隐藏层上使用哪种激活函数&#xff0c;哪种用在输出层节点上。到目前为止&#xff0c;只用过sigmoid激活函数&#xff0c;但是&#xff0c;有时其他的激活函数效果会更好。tanh函数…

18487.1 - 2015 电动汽车充电系统标准 第1部分 关键点梳理

一、部分知识介绍 1、连接方式 使用电缆和连接器将电动汽车接入电网&#xff08;电源&#xff09;的方法。 1.1、连接方式A 1.2、连接方式B 1.3、连接方式C 2、电动汽车控电设备 2.1、按照输出电压分类 1&#xff09;交流 单相 220V&#xff0c;三相 380V. 2&#xff09…

2015年五一杯数学建模C题生态文明建设评价问题解题全过程文档及程序

2015年五一杯数学建模 C题 生态文明建设评价问题 原题再现 随着我国经济的迅速发展&#xff0c;生态文明越来越重要&#xff0c;生态文明建设被提到了一个前所未有的高度。党的十八大报告明确提出要大力推进生态文明建设&#xff0c;报告指出“建设生态文明&#xff0c;是关系…

prometheus|云原生|kubernetes内部安装prometheus

架构说明&#xff1a; prometheus是云原生系统内的事实上的监控标准&#xff0c;而kubernetes集群内部自然还是需要就地取材的部署prometheus服务了 那么&#xff0c;prometheus-server部署的方式其实是非常多的&#xff0c;比如&#xff0c;kubesphere集成方式&#xff0c;h…