队列的定义及基本操作实现(链式)

简介: 队列的定义及基本操作实现(链式)

一.队列是什么?🧐🧐🧐


和栈相反,队列( queue)是一种先进先出( First In First Out, FIFO) 的线性表。它只允许在表的一端进行插人,而在另一端删除元素。这和日常生活中的排队是一致的, 最早进入队列的元素最早离开。在队列中,允许插入的一端称为队尾( rear),允许删除的一端则称为队 头( front) 。假设队列为q=(a1,a2, .,an),那么,a就是队头元素, a,则是队尾元素。队列中的元素是按照a, a, … a,的顺序进人的,退出队列也只能按照这个次序依次退出,也就是说,只有在a,a., an,都离开队列之后,a,才能退出队列。


bede318c28c363c91c3feb75b2e103e4_207a6d14876b4048b0fe6d111bf40e25.jpeg


二、队列与线性表的关系🆚🆚🆚


与栈一样队列也是一种重要的线性结构。从数据结构角度看,队列也是线性表,其特殊性在于队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为具有限定性的数据结构。但从数据类型角度看,它是和线性表不相同的两类重要的抽象数据类型。


三、队列的基本操作🔬🔬🔬


1.队列的储存结构结构💻


typedef struct Qnode
{
  Elemtype data;
  struct Qnode* next;
}QNode, * QueuePrt;//建立链表
typedef struct
{
  QueuePrt front;
  QueuePrt rear;//指向头和尾的两个指针
}LinkQueue;//建立队列


2.队列的初始化✨


InitQueue(LinkQueue* q)
{
  q->front = q->rear = (QueuePrt)malloc(sizeof(QNode));//创建头结点
  if (!q->front)
  exit(0);
  q->front->next = NULL;
}//初始队列


其实就是链表中的创建头结点


3. 入队🚗


InsertQueue(LinkQueue *q, Elemtype e)
{
  QueuePrt p;
  p = (QueuePrt)malloc(sizeof(QNode));//创建结点
  if (p == NULL)
  exit(0);
  p->data = e;//赋值
  p->next = NULL;//
  q->rear->next = p;//头指针指向下一个结点
  q->rear = p;
}



4.出队🚅


DeletQueue(LinkQueue* q, Elemtype* e)
{
  QueuePrt p;
  if (q->front == q->rear)
  return 0;
  *e = p->data;
  q->front->next = p->next;
  if (q->rear == p)
  q->rear = q->front;
  free(p);
}


5.清空与销毁🆘


DesteoyQueue(LinkQueue* q)
{
  while (q->rear = q->front->next)
  {
  free(q->front);
  q->front = q->rear;
  }
}


总结🎆🎆🎆


队列是一种先进先出的线性表。它只允许在表的一端进行插人, 而在另一端进行删除。队列也有两种存储表示,顺序表示(循环队列)和链式表示( 链队)。队列的主要操作是进队和出队,对于顺序表示的循环队列的进队和出队操作要注意判断队满或队空。凡是涉及队头或队尾指针的修改都要将其对MAXQSIZE求模。


#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;//定义类型
typedef struct Qnode
{
  Elemtype data;
  struct Qnode* next;
}QNode, * QueuePrt;//建立链表
typedef struct
{
  QueuePrt front;
  QueuePrt rear;//指向头和尾的两个指针
}LinkQueue;//建立队列
InitQueue(LinkQueue* q)
{
  q->front = q->rear = (QueuePrt)malloc(sizeof(QNode));//创建头结点
  if (!q->front)
  exit(0);
  q->front->next = NULL;
}//初始队列
InsertQueue(LinkQueue *q, Elemtype e)
{
  QueuePrt p;
  p = (QueuePrt)malloc(sizeof(QNode));//创建结点
  if (p == NULL)
  exit(0);
  p->data = e;//赋值
  p->next = NULL;//
  q->rear->next = p;//头指针指向下一个结点
  q->rear = p;
}
DeletQueue(LinkQueue* q, Elemtype* e)
{
  QueuePrt p;
  if (q->front == q->rear)
  return 0;
  *e = p->data;
  q->front->next = p->next;
  if (q->rear == p)
  q->rear = q->front;
  free(p);
}
DesteoyQueue(LinkQueue* q)
{
  while (q->rear = q->front->next)
  {
  free(q->front);
  q->front = q->rear;
  }
}
目录
相关文章
|
关系型数据库 MySQL 数据库连接
连接和管理RDS
连接和管理RDS
970 2
|
存储 算法
数据结构— —栈的基本操作(顺序栈和链栈)
数据结构— —栈的基本操作(顺序栈和链栈)
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
11月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
447 10
|
9月前
|
算法
重磅!2025年中科院预警期刊名单正式发布!
中国科学院文献情报中心发布的《国际期刊预警名单》旨在防范学术不端与不当出版行为,保护科研生态良性发展。2025年版本聚焦两大问题:学术不端(如引用操纵、论文工厂)和不利于中国学术成果国际化传播的行为(如中国作者占比过高或APC费用不合理)。预警名单动态调整,发布时点从年底改为年初,便于科研人员及时调整投稿策略。被列入预警名单的期刊可能影响职称评审及科研经费认可,建议优先选择中科院分区表推荐期刊,警惕“快速代发”陷阱,并关注期刊官网声明。未来科研生态将更注重规范化与原创性,推动高质量学术发表。维护健康的学术环境对提升中国科研全球影响力至关重要。
1300 0
|
11月前
|
搜索推荐 算法 大数据
大数据无处不在:揭秘日常生活中的大数据魔力
大数据无处不在:揭秘日常生活中的大数据魔力
526 10
|
监控 调度
队列的深度解析:链式队列的实现
队列的深度解析:链式队列的实现
|
数据采集 C++ 开发者
掌握VS Code调试技巧:解决Scrapy模块导入中断问题
在使用VS Code调试Scrapy爬虫时,可能会遇到程序在模块导入阶段中断的问题,影响开发效率。本文通过技术分析,探讨了该问题的原因并提供了解决方案,包括正确配置Python路径与`launch.json`文件。此外,以爬取微博数据为例,详细介绍了如何在Scrapy中设置代理IP、Cookie、User-Agent及利用多线程技术提高采集效率。这些技巧有助于优化爬虫性能并在VS Code环境中顺利进行调试工作。
320 2
掌握VS Code调试技巧:解决Scrapy模块导入中断问题
|
SQL Java 数据库连接
既生瑜何生亮,浅析下层出不穷的新ORM框架: MyBatis-Flex
这里先说说我的观点哈,仅是个人观点哦,不喜勿喷。现在这些框架层出不穷,其实吧个人感觉没必要过度关注,因为这些框架并没有完完全全做到推陈出新,反倒是有一点互相“学习copy”的感觉,并没有那么新颖强大、从无到有的一个过程。那说回今天的主题ORM框架,在Java后端技术栈里面我们都知道`MyBatis`是主流的ORM框架,现在很多公司都在使用着,后来在`MyBatis`基础上出现了两个比较主流的增强框架`Mybatis-Plus`和`Fluent-MyBatis`
955 0
|
小程序 安全 搜索推荐
闪灵CMS电子商城系统源码v5.0(自带微信小程序)
闪灵CMS电子商城系统源码,双语带手机版,PHP+MYSQL进行开发,网站安装简单、快捷。
301 0

热门文章

最新文章