链队列(详解)--->数据结构、C++实现

2023-05-16

问题引入

        在数据结构中,队列也是一种重要的线性结构,常和栈放在一起进行学习。队列分为多种类型,常见的如循环队列、链队列等,如果此时此刻你对“链队列”感到困惑,那就继续看下去,我们一步一步去剖析。

问题分析

        如果想要搞明白队列,首先你要明白两个问题:

        1.什么是队列?

        答:“队列”(queue)是一种“先进先出”的线性表。

        2.队列的特点是什么?

        答:队列只允许在表的一端进行插入元素,在另一端删除元素。

        通过上面两个问题,综合到一起就是,队列也是一种线性表,有两端,一端是队列的开头,一端是队列的结尾,例如:& 1 2 3 4 5 6 #,“&”就相当于队列的头,“#”就相当于队列的尾。同时,队列是“先进先出”的特点,一端进行插入,一端进行删除,例如:& 1 2 3 4 5 6 #,我们要插入元素必须从队尾#后进行插入,删除元素必须从&开始删除,只有这种顺序才能满足队列“先进先出”的特点,因为排在队头的一定是先到来的。(如果迷糊,不妨再多看一遍。)

        如下图所示,顺序由0-8,0是队头,元素从队尾进入,从队头删除。

 

        那么,现在明白了什么是队列,他的特点是什么,紧接着你要想到一个问题,“线性表”你疑惑吗?如果你对线性表不疑惑,那么你对线性表中的“链式结构”即“链表”的结构熟悉吗?如果你熟悉,那么就接着往下看;如果你不熟悉,先暂停在这里,看一看线性表中的“链式结构”,请看文章“链表(详解)”(点击查看),如果明白了链表,那么对“链队列”的理解会很顺利。

链队列整体结构分析

        链队列与循环队列很相似,都具有“队头指针、队尾指针”,我们通过两个指针来实现队列中元素的进出。

        涉及到“链式结构”就必定要使用“结点”的方式储存元素,那么最开始没有元素入队列的时候,队头、队尾指针均指向“头结点”,之后若有元素要入队列,我们就动态分配一个新的结点并存入数据,之后连接这个结点到头结点上,队尾指针再后移,就实现了队列队头删除、队尾插入的特点。如下图,如果仍然感到困惑,接下来我们分过程去看元素入链队列和出链队列的过程。

 

元素入链队列分析

        学习过链表的我们知道,链式结构主要是将一个一个存储信息的结点通过结点前驱记录结点的地址信息并连接在一起,形成一种链式结构,其本质上又是一个线性表,因此称为“链表”。

        那么,对于链队列而言,实际上也是一种“链式结构”的表,因为它具有“先进先出”的特点,像排队一样,先排的人先离开,因此删除元素只能在“队头”,插入元素只能在“队尾”。另一方面,我们知道,对于链式结构,我们是必须要知道“头结点”的位置,只有通过头结点才可以找到后续结点,因此链队列分别设置队头指针、队尾指针,令队头指针一直记录头结点位置,队尾指针后移指向插入的元素。

        例如:

                        在链队列中插入元素66。

        分析:首先需要分配一个“新结点的存储空间”,其次将数据输入结点数据域中,之后将结点的指针域next置为NULL,最后将结点链接到队列中。如图1分配了一个新结点s,s->data=66,将元素放入结点数据域中,s->next=NULL,将结点的指针域next置为空。接下来看图2。

图1

 

        结点s信息输入后,接下来就要考虑将结点s连接到队列中。因为每次队尾指针rear是指向队尾元素的,因此令队尾元素的指针域指向结点s,即rear->next=s,那么如何将队尾指针rear指向结点s呢?接下来看图3。

图2

         如果要使队尾指针指向结点s,通过将结点s的地址赋给队尾指针rear即可,Q.front=s;

图3

元素出链队列分析

        例如:

                        在链队列中删除元素11。

        明白了元素入队列,那么元素的出队列与入队列相似,我们也是通过设置一个辅助结点p用于指向要删除的队头元素,将队头元素划分出来,进行删除。如图1,通过p=Q.front->next,令新结点p指向队头元素,并返回值e=p->data。下一步就是令头结点指向p结点的下一结点而舍弃p结点,请看图2。

 图1

        我们通过Q.front->next=p->next;语句,令头结点指针域指向队头元素下一元素的结点位置,从而舍弃结点p。接下来对结点p进行删除,请看图3。

 图2

        我们通过库函数中的free(p)或者delete(p)删除p所指向的结点,即实现了将该结点删除,避免该结点占用空间,浪费系统资源。

 图3

代码实现

        说明:采用C++语言,编译环境为DevC++。

//导入头文件
#include<stdio.h>
#include<malloc.h>
#include<iostream>
using namespace std;

//定义队列
typedef struct qNode{
	int data;//整型数据(可以根据需要修改数据类型) 
	struct qNode *next;
}qNode,*queue;
typedef struct{
	queue front;
	queue rear;
}Queue;

//初始化队列
void initQueue(Queue &Q){
	Q.front=Q.rear=(queue)malloc(sizeof(qNode));//队头指针、队尾指针指向同一空结点 
	if(!Q.front){
		exit(-1);//内存分配失败,退出
	}
	Q.front->next=NULL;
}

//判断队列是否为空
bool emptyQueue(Queue &Q){
	if(Q.front==Q.rear){
		return false;
	}else{
		return true;
	}
}
//入队列
void inQueue(Queue &Q,int data){
	queue p;	
	p=(queue)malloc(sizeof(qNode));//分配一个结点空间
	p->data=data;
	p->next=NULL;
	Q.rear->next=p;//队尾指针指向p
	Q.rear=p;//队尾指针后移一位
	cout<<"数据 "<<data<<" 已经入队列"<<endl<<endl;
}
//出队列
void outQueue(Queue &Q,int &data){
	queue p;
	p=(queue)malloc(sizeof(qNode));//分配一个结点空间
	p=Q.front->next;//指定一个新的结点指向队头指针指向的结点
	data=p->data;//返回结点数据值
	Q.front->next=p->next;//将p指向的下一数据给队头指针,令下一数据前移到队头 
	cout<<"数据 "<<data<<" 已经出队列"<<endl<<endl;
	if(Q.rear==p){
		Q.rear=Q.front;//使队尾指针回到初始位置
		cout<<"请注意:队列中已经没有数据!"<<endl<<endl;//提示用户队列无数据 
	}
	delete(p);//释放p所指结点空间 
	
}  

//输出链队列中储存的全部字符 
void outQ(Queue Q){
	queue q;//辅助变量
	q=Q.front->next;
	//如果链队列不为空,输出其全部字符 
	while(q){
		cout<<q->data<<' ';
		q=q->next;
	}
	cout<<endl;
}

int main(){
	int data;//入队列的数据
	int choose;//控制循环的执行 
	Queue Q;
	initQueue(Q);
	
	cout<<"请选择操作:"<<endl<<
	"1.元素入队列"<<endl<<
	"2.元素出队列"<<endl<<
	"3.输出队列中的全部元素"<<endl<<
	"0.退出"<<endl<<endl;
	cin>>choose;
	while(choose!=0){
		switch(choose){
			case 1:{
				cout<<"请输入数据:";
				cin>>data;
				inQueue(Q,data);
				break;
			}
			case 2:{
				outQueue(Q,data); 
				break;
			}
			case 3:{
				cout<<"链队列中全部的数据元素为:"<<endl;
				outQ(Q);
				cout<<endl;
				break;
			}
			default:
				cout<<"您输入的选择不正确,请重新进行选择!"<<endl;
		}
		cin>>choose;//输入选择 
	}
	
}

运行结果

 

写在最后:

        读两遍下来,如果仍然有不清楚的地方,可在评论区留言。

        如果你有其他感到困惑的问题,欢迎留言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链队列(详解)--->数据结构、C++实现 的相关文章

  • TRIZ创新方法——技术系统进化趋势

    技术系统进化趋势 技术系统及进化趋势S曲线法则技术系统的S曲线产品的进化曲线 八大技术系统进化法则 xff08 1 xff09 完备性法则 xff08 2 xff09 能量传递法则 xff08 3 xff09 协调性进化法则 xff08 4
  • 英特尔 NUC X15 笔记本 评测 英特尔上架新款 NUC X15 笔记本参数配置

    配置方面 xff0c 这款笔记本搭载了 i7 12700H 处理器 xff0c 14 核 20 线程 xff0c 睿频可达 4 7GHz 显卡为英特尔锐炫 A730M xff0c 搭载 24 个 Xe 内核 xff0c 拥有 12GB 19
  • vs2019未能正确加载解决方案的项目

    网上朋友们说是路径出了问题 xff0c 需要修改 vcxproj文件的内容 xff0c 我试了一下没成功 最后发现 xff0c 所以打不开 xff0c 是因为我下载了别人的项目 xff0c 用解压软件解压后直接打开了 sln 当我把解压后的
  • 自我提升解决bug的能力(一)

    我和大家分享一个我的自我提升解决bug的能力 满满的干货 一名优秀的程序员会具备较强解决bug的能力 如果你觉得自己不够优秀 xff0c 解决bug能力不足 xff0c 学习处于被动的状态 那我要大声的告诉你请不要迷茫 xff0c 陷入低沉
  • 论文笔记:VIBE: Video Inference for Human Body Pose and Shape Estimation

    要解决的问题 有3D关键点标注的数据集太少 xff0c 所以我们想生成这样的数据集 所以我们提出了一个 利用视频进行动作估计的新方法 xff0c 解决了数据集缺乏和预测准确率不佳的问题 主要创新点 利用 对抗式生成网络 来区分 真实人类动作
  • 2022年春招实习十四面(嵌入式面经)(已完结)

    文章目录 前言CVTE xff08 嵌入式软件 xff09 CVTE一面 xff08 嵌入式软件开发 xff09 时长 xff1a 50分钟CVTE二面 xff08 55分钟 xff09 阿里菜鸟网络 xff08 嵌入式软件 xff09 阿
  • 二分算法简单介绍

    二分算法 xff0c 顾名思义 就是把一组有序数据的搜索区域缩小一半 下面给大家举例说明一下 如何确定被缩小的搜索区间 原理分析 拿一个有序的整形数组来举例 int a 10 61 1 2 3 4 5 6 7 8 9 10 xff0c 在初
  • 论文投稿指南——中文核心期刊

    gt gt gt 深度学习Tricks xff0c 第一时间送达 lt lt lt 目录 xff08 一 xff09 国内三大核心 1 中文社会科学引文索引 xff08 CSSCI 南大核心 xff09 2 中国科学引文数据库 xff08
  • linux opendir(打开目录函数) readdir(读取目录函数) closedir(关闭目录函数)

    Linux下opendir readdir 和closedir 这三个函数主要用来遍历目录 在使用这三个函数前必须先包括以下两个头文件 xff1a include lt sys types h gt include lt dirent h
  • Cmakelists.txt 的基本框架

    执行 cmake 表示在当前目录下执行 cmake cmake 表示在前一级目录下执行 cmake make 在当前目录下执行 make 语法 1 设置 cmake 版本需求 cmake minimum required VERSION 2
  • UartAssist - 串口调试助手。

    由于项目需要用到串口 xff0c 所以我就找到一个简单易上手的串口调试助手 串口调试助手 1 助手界面 xff1a 2 设置串口 xff0c 点击 打开 3 设置发送区和接收区参数 4 输入发送内容 xff0c 点击 发送 即可
  • 网络摄像机rtsp地址详解。

    RTSP xff08 Real Time Streaming Protocol xff09 xff0c RFC2326 xff0c 实时流传输协议 xff0c 是TCP IP协议体系中的一个应用层协议 xff0c 由哥伦比亚大学 网景和Re
  • Qt 登陆界面实现

    简单的QT用户登录界面 一 项目描述 在登录界面输入用户名和密码正确之后才进入欢迎界面 用户名 xff1a xiaoxian 密码 xff1a 1240 二 效果图 三 源代码 loginform span class token punc
  • FFMPEG保存视频流数据至本地(rtsp转mp4)

    将rtsp流中的h264视频流在没解码之前获取下来 xff0c 并保存到本地文件mp4中的h264流中 xff0c h264 gt mp4 网络摄像机rtsp地址详解 流程图 xff1a 源码 xff1a span class token
  • Qt + FFmpeg实现播放器(FFmpeg可以解码的格式基本都可以播放)。

    一 开发环境的准备 Linux下移植ffmpeg开源库 二 代码实现播放功能 1 打开音视频流并获取音视频流信息 xff1b 2 查找视频流位置以及查找并打开视频解码器 xff1b 3 视频解码的同时处理图片像素数据 xff1b 4 最后要
  • SecureCRT 下的串口不能输入指令。

    1 在 SecureCRT 下的串口不能输入指令 解决方法 xff1a Session Options gt Connection gt Serial gt Flow Control xff0c 将原先默认选中的 RTS CTS取消掉即可
  • Qt实现简单密码登陆界面

    效果图 xff1a 代码实现 span class token macro property span class token directive hash span span class token directive keyword i
  • error: ‘uint8_t’,‘uint32_t’ does not name a type

    c 43 43 里用了c的代码 xff0c 确切的说 xff0c 是引用了c写的x264 h xff0c 结果报错了 xff1a 解决方法 xff1a span class token macro property span class t
  • gitlab 同时拉取整个项目

    一 xff1a 下载repo工具包 下载地址 xff1a GitHub NeutionWei repo unzip repo 刚下载的repo包解压 xff0c 其中的repo只是一个几百行的脚本 xff0c 需要repo init才可以获
  • CMakeLists.txt详解

    一 xff1a CMakeLists txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 学习cmake需要提前了解gcc等编译命令 xff0c 先来解释一条最简单的命令 gcc source c o bin

随机推荐

  • opencv估计两图的三维坐标变换矩阵

    cv estimateAffine3D MatFrom MatTo Transfrom inlier Transform得到的是重MatFrom到MatTo的变换矩阵 inlier给一个空矩阵就可以 MatFrom和MatTo都是点的矩阵
  • shell脚本详解

    通俗来讲shell脚本就是把shell命令放在一个 脚本 中 xff0c 脚本的第一行 xff01 bin bash 意思为这个脚本指定一款在 bin 下名叫bash的shell解释器 xff0c 来解释接下来的任何命令 xff0c 如果我
  • 车载以太网测试规范tc8下载地址

    网上只要搜到下载就要积分 xff0c VIP xff0c 其实他们也是从别处免费下载的 xff0c 拿到别处骗钱 xff0c 话不多说下载地址如下 xff1a Open Alliance 不用谢 xff01
  • ARP包解析及工作原理

    ARP数据包42字节 参照以下例子 xff1a 前12字节为以太网的目的地址 54 89 98 0f 2b be 和源地址 54 89 98 5b 5b 8a xff0c 当目的地址全为1时是以太网广播地址 xff0c 此时ARP还未建立缓
  • Jetson Xavier NX刷机安装Ubuntu20.04,配置CUDA,cuDNN,Pytorch等环境教程(英伟达官方源安装,理论适用其它Jetson设备)

    一 准备工作 硬件 xff1a Jetson Xavier NX开发板 xff08 笔者购入为带128g内存条的EMMC版 xff09 跳线帽 xff08 杜邦线 xff09 microUSB转USB数据线 电源线 软件 xff1a Ubu
  • Hadoop伪分布搭建完整步骤

    1 新建虚拟机配置网络并测试网络连接 1 鼠标单击左侧虚拟机名称 xff0c 接着单击菜单栏 编辑 xff0c 在下拉菜单中选择 虚拟网络适配器 xff0c 如图 1 2 20 所示 4 在打开的 虚拟网络编辑器 对话框 xff0c 单击
  • linux--top命令查看系统所有详情

    Linux系统可以通过top 命令查看系统的CPU 内存 运行时间 交换分区 执行的线程等信息 通过top命令可以有效的发现系统的缺陷出在哪里 是内存不够 CPU处理能力不够 IO读写过高 一 top命令的第一行 top 19 56 47
  • OPENMV巡线

    将openmv图片划分成三个ROI区域 import sensor image time lcd from pyb import UART from pyb import LED ROIS 61 0 0 160 40 0 6 0 40 16
  • C++学习笔记

    一 一些重要的常见知识点 1 函数的分文件编写 xff1a h的头文件 xff08 写函数声明 xff09 cpp的源文件 xff08 写函数功能实现 xff09 2 空指针和野指针 xff1a 0 255的内存是系统所占有的 96 int
  • 使用XTDrone遇到的问题的解决

    在使用XTDrone时 xff0c 遇到了px4包找不到的问题 xff1a RLException mavros posix sitl launch is neither a launch file in package 使用官方配置文档h
  • 树莓派书籍全方位推荐

    相关书籍 python编程篇1 Python硬件开发树莓派从入门到实践 内容简介作者简介 2 Python树莓派开发从入门到精通内容简介编辑推荐 3 树莓派Python编程入门与实战书籍简介 4 树莓派Python编程指南内容简介作者简介
  • 总结几个比较常用的数学公式(新手入门)

    合理的公式可以帮助我们优化代码 xff0c 比如可以减少遍历的次数 xff0c 减少思考的难度 xff0c 提高算法效率 xff0c 此文章将持续更新 一 换底公式 Logab 61 logxb logxa 换底公式虽然不常用 xff0c
  • 【Linux/C/C++】面试题总结

    1 static关键字的作用 答 xff1a 在C语言中 xff0c 局部变量不会在诞生时被编译器自动初始化 xff0c 且生命周期终止于该变量所在的函数结束时 通过使用static关键字修饰局部变量 xff0c 可以使编译器自动为其赋初始
  • 匿名上位机V7与stm32通信协议

    一 xff0c 通信介绍 1 通信帧格式介绍 为了适应多种数据类型的传输 xff0c 保证高效的通信效率 xff0c 所有数据的通信 xff0c 均需要遵守本通信帧格式 本格式在 确保通信高效 源码简单 可移植性高的基础上 xff0c 实现
  • 酒店管理系统( JAVA)

    最近在学JAVA的数组学完之后做了一个简易的酒店管理系统 xff0c 酒店管理系统应该包含三部分 xff0c 第一部分是我们酒店管理系统的主题 xff0c 第二部分是我们酒店里的信息 xff0c 第三部分则是我们的房间信息 xff0c 具体
  • Ubuntu20.04下使用Qt5.15.2编译qgc源码

    下载QGC源码 可以在QGC官网按照教程根据自己的需求来下载源码QGC git clone recursive j8 https github com mavlink qgroundcontrol git git submodule upd
  • #ROS通讯机制:参数服务器

    参数服务器修改小海龟背景色 1 进入工作空间的src目录新建工作包 lzw08 64 ubuntu span class token operator span span class token operator span cd ros w
  • 9.19 GoogLeNet

    GoogLeNet GoogLeNet在2014年ImageNet图像识别挑战赛中大放异彩虽然NiN现在基本上没有被使用了 xff0c 但是GoogLeNet现在还是大量地被使用GoogLeNet是第一次做到快100层卷积层 xff08 第
  • react路由参数传递

    react路由的三种传参方式 1 向路由组件传递params参数 参数传递 在注册路由时接收参数 注意这里后面时冒号在前面的 在要展示的组件内接收params参数 2 第二种 xff0c 利用search传递参数 向路由组件传递参数 这种方
  • 链队列(详解)--->数据结构、C++实现

    问题引入 在数据结构中 xff0c 队列也是一种重要的线性结构 xff0c 常和栈放在一起进行学习 队列分为多种类型 xff0c 常见的如循环队列 链队列等 xff0c 如果此时此刻你对 链队列 感到困惑 xff0c 那就继续看下去 xff