C语言中队列的结构和函数接口的使用示例
作者:[Pokemon]大猫猫 发布时间:2022-01-08 06:56:40
标签:C语言,队列结构,函数接口
一、队列的结构
队列:一种操作受限的线性表,只允许在线性表的一端进行插入,另一端进行删除,插入的一端称为队尾,删除的一端称为队头
通过 动态顺序表 的实现,可以发现在数组的头部进行插入删除操作时,需要移动数据,效率较低,因此不采用数组来实现队列
但通过 单链表 的实现,可以发现在对单链表进行头插时效率很高,而进行尾插时,需要找尾数据,较为麻烦,但是可以通过增加一个尾指针的方式来提升效率,因此用单链表的头尾指针来实现队列,结构如下:
//队列的元素类型
typedef int QueueDataType;
//队列的结点结构
typedef struct QueueNode
{
QueueDataType data;
struct QueueNode* next;
}QNode;
//队列结构,需要包含指向链表的头指针和尾指针
//为了求队列数据个数时,时间复杂度为 O(1),这里增加一个 size 变量
typedef struct Queue
{
QNode* head;
QNode* tail;
int size;
}Queue;
二、队列的函数接口
1. 初始化和销毁
初始化函数如下:
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = pq->tail = NULL;
pq->size = 0;
}
链表的结点都是动态开辟的,不用队列时,应当销毁
销毁函数如下:
void QueueDestroy(Queue* pq)
{
assert(pq);
//从头结点开始销毁
QNode* cur = pq->head;
while (cur)
{
//保存下一个结点
QNode* next = cur->next;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
pq->size = 0;
}
2. 入队和出队
入队:在队尾插入元素
入队函数如下:
void QueuePush(Queue* pq, QueueDataType x)
{
assert(pq);
//创建新结点
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
//没有结点时,插入元素,需要改变队列的头尾指针
//有结点时,直接链接在尾结点之后,tail 变成新的尾
if (pq->tail == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
//插入元素后,数据个数需要自增
pq->size++;
}
出队:删除队头元素
出队函数如下:
void QueuePop(Queue* pq)
{
assert(pq);
//没有元素时,不能删除,这里直接调用判空函数
assert(!QueueEmpty(pq));
//如果只有一个结点时,需要改变队列的头尾指针
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
//删除元素后,数据个数需要自减
pq->size--;
}
3. 访问队头和队尾元素
访问队头元素函数如下:
QueueDataType QueueFront(Queue* pq)
{
assert(pq);
//没有元素时,不能取队头元素,这里直接调用判空函数
assert(!QueueEmpty(pq));
return pq->head->data;
}
访问队尾元素函数如下:
QueueDataType QueueBack(Queue* pq)
{
assert(pq);
//没有元素时,不能取队尾元素,这里直接调用判空函数
assert(!QueueEmpty(pq));
return pq->tail->data;
}
4. 判空和元素个数
判空函数如下:
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->size == 0;
}
元素个数函数如下:
size_t QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
来源:https://blog.csdn.net/qq_70793373/article/details/128494299


猜你喜欢
- 跟同事讨论到- 用C# Stopwatch 取得效能数值,Stopwatch.ElapsedMilliseconds 只到毫秒(ms),如果
- spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单
- 前言最近写了一篇博客是关于使用Jenkins来构建SVN+Maven项目 ,这里使用的的代码版本工具是SVN,但是事实上也有很多公司使用GI
- 一、文件1、基本解释(1)什么是文件?文件是保存数据的地方,比如大家经常使用的word文档、txt文件、excel文件等都是文件。它还可以保
- 本文实例讲述了C#判断日期是否到期的方法,在C#程序开发中非常具有实用价值。分享给大家供大家参考之用。具体方法如下:一般在用户权限系统中,有
- 微信公众号提供了微信支付、微信优惠券、微信H5红包、微信红包封面等等促销工具来帮助我们的应用拉新保活。但是这些福利要想正确地发放到用户的手里
- J2ee 高并 * 况下 * 实例详解引言:在高并发下限制最大并发次数,在web.xml中用过滤器设置参数(最大并发数),并设置其他相关参数。
- JFormDesigner概述jformdesigner是一款功能强大的Swing设计工具,这是全面的程序,可帮助您创建Swing GUI,
- 1、前言最近在用Kotlin+Spring Boot写一个后端项目,实体类习惯性地用了Kotlin中的data class,但是Spring
- 在上篇文章给大家介绍了WebService教程详解(一)使用工具的原因:1、 使用工具可以更好的了解WebService请求的过程 2、 使
- 指示器时间轴在外卖、购物类的APP里会经常用到,效果大概就像下面这样,看了网上很多文章,大都是自己绘制,太麻烦,其实通过ListView就可
- 本文实例为大家分享了java文件读写工具类的具体代码,供大家参考,具体内容如下import java.io.BufferedInputStr
- 首先选择保存图片的路径:saveFileDialog1.Title = "保存"; &
- 初识LinkedHashMap大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭
- 1. 效果图展示2. 工程目录结构注意: webapp下的resources目录放置easyui和js(jQuery文件是另外的) 
- 我们知道,值类型的变量是在堆栈上分配内存的,而引用类型包括System.Object的对象是在堆上分配内存的,基于这一特点,当值类型被类型转
- 一、准备工作小编今天以 QQ邮箱 进行演示操作。想要使用代码操作邮箱发送邮件,需要在邮箱设置中申请开通 POP3/SMTP 服务。接下来跟着
- 迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象
- 自定义Starter命名规则注意artifactId的命名规则,Spring官方Starter通常命名为spring-boot-starte
- 投篮小游戏规则,点击投篮目标点,就会有一个球沿着相关抛物线,然后,判断是否进入篮子里,其实就是一个矩形,直接是按照碰撞检测来的,碰到就算进去