大家好!这篇我们继续讲解数据结构里的队列。

文章目录

  • 队列的概念
  • 队列的实现
    • 队列的结构
    • 初始化
    • 销毁
    • 判断队列是否为空
    • 插入函数
    • 删除函数
    • 取对头和队尾
    • 队列中有多少数据

队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的原则。

入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

队列的结构

在单链表中,我们只定义了一个头指针,没有定义尾指针。因为定义尾指针,能方便尾插,但不能方便其它问题,所以我们没有必要。
但是队列只在队尾插入,所以这里我们可以定义一个尾指针。

所以,当我们定义多个变量时,我们需要一个结构体。

所以,队列的结构如下:

typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QueueNode;typedef struct Queue
{QueueNode* head;QueueNode* tail;
}Queue;

初始化

我们要改变结构体里的内容,所以我们可以传一个结构体指针(一级指针)。

void QueueInit(Queue* pq)
{assert(pq);pq->head = NULL;pq->tail = NULL;
}

销毁

销毁非常的简单,直接看代码:

void QueueDestroy(Queue* pq)
{assert(pq);QueueNode* cur = pq->head;while (cur){//保存下一个节点的地址QueueNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;
}

判断队列是否为空

这个非常简单,我们直接看代码:

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->tail == NULL;
}

插入函数

插入我们要分为两种情况:
1.没有节点
2.有节点

void QueuePush(Queue* pq,QDataType x)
{assert(pq);//创建一个节点QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){printf("malloc is fall\n");exit(-1);}else{newnode->data = x;newnode->next = NULL;}if (pq->head == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}
}

删除函数

队列的删除是有规定的,只能在队头删除。所以我们要更新头指针。

代码如下:

void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));//记录下一个节点QDataType* next = pq->head->next;free(pq->head);pq->head = next;}

但是这里,我们有一个错误。

我们删除了4个,程序应该会给我们断言,但是没有,程序挂了,这是为什么?因为我们删除了最后一个,tail变成了一个野指针。

而此时head为NULL了,所以我们应该加一个判断。

void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));QDataType* next = pq->head->next;free(pq->head);pq->head = next;if (pq->head == NULL){pq->tail = NULL;}}

取对头和队尾

这里很简单,我们直接看代码:

取队头数据:

QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}

取队尾数据:

QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

队列中有多少数据

这个也简单,我们遍历一遍就行了。

int QueueSize(Queue* pq)
{assert(pq);int n = 0;QueueNode* cur = pq->head;while (cur){n++;cur = cur->next;}return n;
}

好了,到这里,我们的队列就实现完成了,后面我还会说一些其它内容。如果大家觉得有帮助,希望可以点个赞支持一下,谢谢大家。

队列的实现(C语言版)相关推荐

  1. 数据结构——链式队列解析(C语言版)

    摘自:数据结构学习--链式队列解析(C语言版) 作者:正弦定理 发布时间:2020-11-26 21:07:08 网址:https://blog.csdn.net/chinesekobe/articl ...

  2. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  3. c语言动态双端栈的原理,数据结构(C语言版)例题(第三章:栈和队列)

    数据结构(C语言版)例题(第三章:栈和队列) 数据结构(C语言版)例题(第三章:栈和队列) (2008-05-09 12:33:13) 转载▼ ◆3.15③ 假设以顺序存储结构实现一个双向栈,即在一维 ...

  4. 数据结构(八) -- C语言版 -- 栈和队列 - 队列的设计与实现

    我让你知道我有啥 零.读前说明 一.队列的概述 二.队列的操作 三.队列的两种存储结构的模型概述 四.顺序存储结构的队列及实现 4.1.顺序存储结构的传统队列简易实现与测试 4.2.顺序存储结构的队列 ...

  5. 【数据结构 C语言版】第六篇 栈、队列经典必刷面试考研题

    [数据结构 C语言版]第六篇 栈.队列经典必刷面试考研题 写在前面 更新情况记录: 最近更新时间 更新次数 2022/10/20 1 参考博客与书籍以及链接: (非常感谢这些博主们的文章,将我的一些疑 ...

  6. 【数据结构 C语言版】第五篇 队列(看完刷题无敌)

    [数据结构 C语言版]第五篇 队列(看完刷题无敌) 写在前面 更新情况记录: 最近更新时间 更新次数 2022/10/19 1 参考博客与书籍以及链接: (非常感谢这些博主们的文章,将我的一些疑问得到 ...

  7. 资料分享:送你一本《数据结构(C语言版)》电子书!

    要想写出可复用.可扩展.易维护.灵活性好的代码,「数据结构」这一关必须要过啊! 在数据结构与算法的众多教材中,奉为经典的当属清华大学严蔚敏老师的著作.很多学校也选择这本书作为考研指定教材. 正在学习数 ...

  8. 资料分享:送你一本《数据结构(C#语言版)》电子书!

    对于信息类专业的学生而言,数据结构与算法是一门必修的课程.只有学好这门课程,熟练掌握线性表.栈.队列.树.图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题. 如何学好这门课程呢, ...

  9. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  10. 数据结构c语言函数大全,数据结构习题库(c语言版).doc

    数据结构习题库(c语言版) 第一章 绪 论 一.基本内容 数据.数据元素.数据对象.数据结构.存储结构和数据类型等概念术语的确定含义.抽象数据类型的定义.表示和实现方法.描述算法的类C语言.算法设计的 ...

最新文章

  1. Mysql5.7版本ERROR 1055问题
  2. [转]边框回归(Bounding Box Regression)详解
  3. 企业级应用与互联网应用的区别
  4. 浏览器窗口尺寸clientHeight / scrollHeight / offsetHeight / innerHeight
  5. php博客手机版模板下载器,【织梦模板下载】高端响应式游艇租赁类网站模板(自适应手机端) PHP源码带数据...
  6. 查询同一张表符合条件的某些数据的id拼接成一个字段返回
  7. 唐努乌梁海问题的由来
  8. Java_学生信息管理系统——数组版——尝试将main函数单独放了一个类,并加了文件...
  9. 点餐系统——数据库设计
  10. 他山之石 | 小米小爱Query识别
  11. 在div中加本地html,div加载另一个HTML页面
  12. HBuilderX 导入uniapp后,无法运行或发行,提示“[微信小程序开发者工具] × open IDE”
  13. 获取USB摄像头名字和device ID等信息
  14. 用U盘安装系统 WinPE 安装操作系统
  15. 【Java】 杨辉三角 二维数组打印杨辉三角
  16. 将checkbox选中样式用图片替换
  17. TestNg常用enable、timeOut、exceptedException、groups、dependsOnGroups、dependsOnMethods、@Paramters、priority
  18. 发布Java应用实践结合CCE
  19. html5相邻选择器,相邻选择器 - 无可奈何花落去 似曾相识燕归来 - BlogJava
  20. java队列(Queue)

热门文章

  1. 机器学习算法之——卷积神经网络(CNN)原理讲解
  2. U盘病毒 hypertrm.exe 修复
  3. 2022大厂高频面试题之CSS篇
  4. STM32实现水下四旋翼(三)通信任务——遥控器SBUS通信
  5. 【Vue】Nodejs下载与安装
  6. CentOS 8 安装Tomcat
  7. VINS_Fusion学习01——官方教程翻译解读
  8. 计算机用户太多怎样删除,删除电脑中多余的用户的4个小技巧
  9. 线性调频信号及仿真[python]
  10. 【现控】系统状态空间表达式