详解队列的接口函数

队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。
进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。
因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
请添加图片描述

简而言之:
队列是必须满足先进先出的线性表


准备工作

普通的队列一般用单链表实现
但也可以使用顺序表实现

-本篇文件采用单链表实现-

创建头文件Stack.h

将头文件和函数定义等放在Stack.h中,方便管理

创建源文件Stack.c

将接口函数的实现放在里面,方便管理

头文件的包含

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
  • stdio.h:用于标准输入输出等
  • assret.h:用于使用assret函数,实现报错
  • stdbool.h:用于使用布尔(bool)类型
  • stdlib.h:用于使用动态内存管理函数

定义保存队列数据的结构体

在这里插入图片描述
为什么要将队列里的数据的数据类型重命名?
这是为了以后如果改变了SL结构体中数据存储的类型时,
不用到处改函数参数等地方的数据类型,只要改typedef后的int 为对应要改成的数据类型就可以。

至于给结构体重命名则仅是为了方便使用


定义维护队列的队头和队尾指针的结构体

在这里插入图片描述
定义该结构体后,使用该结构体再定义一个结构变量,将其初始化后便可用其操作队列


初始化函数

在这里插入图片描述


从队尾插入数据

void QueuePush(Queue* p, QuDataType x)
{assert(p);   如果传入的p是NULL,则属于操作错误,assert就会进行报错QN* tmp = (QN*)malloc(sizeof(QN));if (tmp == NULL)  如果tmp为NULL则动态内存申请失败,结束程序{printf("malloc失败!");exit(-1);  结束程序}tmp->data = x;tmp->next = NULL;  只能在  队尾  插入数据,所以插入的数据的下一个必定时NULLif (p->head == NULL)  如果队头为空,则队尾也一定为空{p->head = tmp;  让队头指向唯一的一个数据节点p->tail = tmp;  让队尾指向唯一的一个数据节点}else{p->tail->next = tmp;  让队尾指针指向的节点的next指向新节点tmpp->tail = tmp;  因为新节点tmp成为了最后一个节点,所以将队尾指针指向更新成tmp}
}

图解

在这里插入图片描述

删除队头数据

在这里插入图片描述

图解

在这里插入图片描述

取队头数据(只取不删)

在这里插入图片描述


取队尾数据(只取不删)

在这里插入图片描述


统计队列的数据个数

在这里插入图片描述


判断队列是否为空

在这里插入图片描述


销毁队列

在这里插入图片描述


全部代码

Queue.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QuDataType;typedef struct QueueNode
{QuDataType data;struct QueueNode* next;
}QN;typedef struct Queue
{QN* head;QN* tail;
}Queue;//初始化
void QueueInit(Queue* p);//队尾入
void QueuePush(Queue* p, QuDataType x);//队头出(删一个队头)
void QueuePop(Queue* p);//取队头数据(只取不删)
QuDataType QueueFront(Queue* p);//取队尾数据(只取不删)
QuDataType QueueBack(Queue* p);//队列的数据个数
int QueueSize(Queue* p);//判断队列是否为空
bool QueueEmpty(Queue* p);//销毁队列
void QueueDestory(Queue* p);

Queue.c

#define _CRT_SECURE_NO_WARNINGS#include"Queue.h"void QueueInit(Queue* p)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错p->head= NULL;//队列为空时队头指针为空p->tail= NULL;//队列为空时队尾也指针为空
}//队尾入
void QueuePush(Queue* p, QuDataType x)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错QN* tmp = (QN*)malloc(sizeof(QN));if (tmp == NULL)//如果tmp为NULL则动态内存申请失败,结束程序{printf("malloc失败!");exit(-1);//结束程序}tmp->data = x;tmp->next = NULL;//只能在  队尾  插入数据,所以插入的数据的下一个必定时NULLif (p->head == NULL)//如果队头为空,则队尾也一定为空{p->head = tmp;//让队头指向唯一的一个数据节点p->tail = tmp;//让队尾指向唯一的一个数据节点}else{p->tail->next = tmp;//让队尾指针指向的节点的next指向新节点tmpp->tail = tmp;//因为新节点tmp成为了最后一个节点,//所以将队尾指针指向更新成tmp}
}//队头出(删一个队头)
void QueuePop(Queue* p)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错assert(p->head);//队头为空 即队列为空,队列为空时不能再删除//队列只有一个数据if (p->head == p->tail)//队头指针和队尾指针指向同一节点时{                      //队列只有一个节点p->tail = NULL;//删除最后一个节点后,队尾指针应该置空}//一般情况和特殊情况(队列只有一个数据)都可处理QN* tmp = p->head->next;//让tmp指向队的下一个节点free(p->head);//释放队头p->head = tmp;//让原队头的下一个节点成为新的队头
}//取队头数据(只取不删)
QuDataType QueueFront(Queue* p)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错assert(p->head);//队头为空 即队列为空,队列为空时取不出数据return p->head->data;//将  队头  指针指向节点的  数据返回出去
}//取队尾数据(只取不删)
QuDataType QueueBack(Queue* p)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错assert(p->tail);//队头为空 即队列为空,队列为空时取不出数据return p->tail->data;//将  队尾  指针指向节点的  数据返回出去
}//统计队列的数据个数
int QueueSize(Queue* p)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错QN* cur = p->head;//定义cur接收队头指针,用来遍历链表int count=0;//定义count用来统计数据个数while (cur)//cur不为空,就继续循环{count++;cur = cur->next;//让cur指向下一个节点}return count;
}//判断队列是否为空
bool QueueEmpty(Queue* p)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错return p->head == NULL;//如果队头指针为空,队列就为空//队头为空时就return ture//队头不为空就  return false
}//销毁队列
void QueueDestory(Queue* p)
{assert(p);//如果传入的p是NULL,则属于操作错误,assert就会进行报错if (p->head == NULL)//如果队头为空,队列就已经为空了,不用再销毁return;QN* cur = p->head;//定义cur接收队头指针,用来遍历链表QN* next = p->head->next;//定义next接收cur的下一个节点,用来存储下一个节点的地址p->head = NULL;//销毁队列后 队头指针要置空p->tail = NULL;//销毁队列后 队尾指针要置空while (next)//next不为空就继续循环{free(cur);//释放cur指向的节点cur = next;//让cur接收next中存储的下一个节点的地址next = next->next;//让next指向next的节点的下一个节点}free(cur);
}

以上就是全部内容了,如果对你有帮助的话,可以点个赞支持一下!!!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CleanMyMac X2024免费Mac电脑清理和优化工具

CleanMyMac X是一款专业的 Mac 清理和优化工具&#xff0c;它具备一系列强大的功能&#xff0c;可以帮助用户轻松管理和维护他们的 Mac 电脑。以下是一些关于 CleanMyMac X 的主要功能和特点&#xff1a; 智能清理&#xff1a;CleanMyMac X 能够智能识别并清理 Mac 上的无用文件…

AJAX实例

AJAX - Asynchronous JavaScript and XML - 异步的JavaScript与XML&#xff0c;不是一门新技术&#xff0c;只是一个新的术语。&#xff08;老技术新玩法&#xff09; - 使用AJAX&#xff0c;网页能够将增量更新呈现在页面上&#xff0c;而不需要刷新整个页面。 - 虽然X代表…

考研机试C++题目精选

更多内容会在godownio.github.io更新 算法练习&#xff08;C代码&#xff09; 考研上机或C语言代码笔试准备&#xff0c;暨大机试原题letcode牛客中南大等高校机试 快速幂算法 题目&#xff1a;输入一个整数 n &#xff0c;求 n^n 的个位数是多少。 快速幂算法&#xff1a;…

初识C语言—常见关键字

变量的命名最好有意义 名字必须是字母&#xff0c;数字&#xff0c;下划线组成&#xff0c;不能有特殊字符&#xff0c;同时不能以数字开头 变量名不能是关键字 typedef---类型定义&#xff0c;类型重命名 #include <stdio.h>typedef unsigned int uint; //将unsigne…

第七十二天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第72天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

Qt/自定义控件的封装

新建文件&#xff0c;选择Qt设计师界面类 创建空界面 这是自己控件封装的文件&#xff0c;双击跳转到设计界面进行设计 跳转到其他的ui界面&#xff0c;创建一个widget 右键&#xff0c;选择提升为 在提升的类名称输入刚刚创建的类名&#xff0c;添加后选择提升&#xff0c;勾选…

2024年经典【自动化面试题】附答案

一、请描述一下自动化测试流程&#xff1f; 自动化测试流程一般可以分为以下七步&#xff1a; 编写自动化测试计划&#xff1b; 设计自动化测试用例&#xff1b; 编写自动化测试框架和脚本&#xff1b; 调试并维护脚本&#xff1b; 无人值守测试&#xff1b; 后期脚本维…

C++:内存管理|new和delete

创作不易&#xff0c;感谢三连支持&#xff01; 一、内存分布 为什么需要内存管理呢&#xff1f;&#xff1f;因为我们在程序的运行过程中会需要各种各样的数据&#xff0c;而我们根据数据的不同存储在不同的区域里面&#xff0c;是为了更高效地处理数据。而C语言相比Java来说…

可视化场景(1):销售业绩大屏-是骡子是马,牵出溜溜

销售业绩可视化大屏的是一种有力的销售数据管理工具&#xff0c;贝格前端工场分享一批给友友们&#xff0c;如需要定制&#xff0c;可以与我们联络&#xff0c;开始了。 销售业绩可视化大屏是一种将销售数据以图表、数字、文字等形式展示在大屏幕上的数据可视化工具。它的作用主…

flutter 文字一行显示,超出换行

因为app有多语言&#xff0c;中文和其他语言长度不一致&#xff0c;可能导致英文会很长。 中文样式 英文样式 代码 Row(mainAxisAlignment: MainAxisAlignment.end,crossAxisAlignment: CrossAxisAlignment.end,children: [Visibility(visible: controller.info.fee ! null,ch…

图论 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…

Java中心校智慧校园智慧班牌物联网平台源码

目录 智慧班牌 班牌首页 班级信息 课表信息 视频 图片 进离校管理 人脸登录页 学生个人中心 请假管理 成绩管理 家长留言 学生绑卡 学生评价 系统设置 通知管理 值日管理 倒计时 班级德育 班牌模式 1.课堂授课模式 2.家长会签到模式 3.考场模式 4.班级…