当前位置:网站首页>链队
链队
2022-08-04 20:42:00 【柯基@】
链队就是采用链式存储结构存储队列,这里采用单链表来实现 ~
- 链队定义
/* 链队结点类型定义,定义下图中 A,B,C 结点 */
typedef struct QNode{
int data;
struct QNode *next;
}QNode;
/* 链队类型定义,可理解为链队列的 “头结点” ,与单链表的头结点相比,链队列的头结点必不可少 */
typedef struct{
QNode *front;
QNode *rear;
}LiQueue;
- 初始化
void initQueue(LiQueue *&lqu){
lqu=(LiQueue*)malloc(sizeof(LiQueue)); //为链队列的 “头结点” 申请空间
lqu->front=lqu->rear=NULL; //头、尾指针皆指向空
}
- 判断队空
int isEmpty(LiQueue *lqu){
if(lqu->rear==NULL || lqu->front=NULL)
return 1;
else
return 0;
}
- 入队
/* 思路:链队的特点就是不存在队列满上溢的情况,所以不用考虑队满的情况。 1.申请空间,创建结点,其 data 为 x 2.若为原始队列为空队,则头、尾指针都指向新插结点 3.不为空队,则尾插法,即:lqu->rear->next=q; lqu->rear=q; */
void enQueue(LiQueue *lqu,int x){
QNode *p; //为将要插入的值 x 创建结点
p=(QNode*)malloc(sizeof(QNode));
p->data=x;
p->next=NULL;
if(lqu->rear==NULL)
lqu->front=lqu->rear=p; //队列中只有一个结点时,front 和 rear 指向同一结点
else{
lqu->rear->next=p; //尾插法
lqu->rear=p;
}
}
- 出队
/* 思路:存在空队情况,记得考虑 1.判断是否为空队列,若为空,则直接退出 2.不为空,则采用头删法出队,但注意要分情况 3.情况一:删完后队列没有结点 。情况二:删完后队列还有结点 。 */
int deQueue(LiQueue *lqu,int &x){
if(lqu->rear==NULL || lqu->front==NULL)
return 0;
else
QNode *p;
p=lqu->front; //指向即将被删的结点
if(lqu->front==lqu->rear) //队列中只有一个结点时的出队操作需特殊处理
lqu->front=lqu->rear=NULL;
else
lqu->front=lqu->front->next; //头删法
x=p->data;
free(p);
return 1;
}
与链队相比,️顺序队 的定义、操作等都要简单,因此在考研的程序设计题目中,要尽量采用顺序队来解决问题,尽可能地避免用链队,除非题目明确规定要用链队。
边栏推荐
猜你喜欢
随机推荐
刷题-洛谷-P1317 低洼地
Tensorflow2 环境搭建
零知识证明笔记——私密交易,pederson,区间证明,所有权证明
Debug locally and start the local server in vs code
[TypeScript] In-depth study of TypeScript enumeration
知识分享|如何设计有效的帮助中心,不妨来看看以下几点
项目难管理?先学会用好甘特图(内附操作方法及实用模板)
无代码平台字段设置:基础设置入门教程
拒绝服务攻击DDoS介绍与防范
腾讯云胡启明:Kubernetes云上资源的分析与优化
手撕SparkSQL五大JOIN的底层机制
香港暂停进口俄罗斯部分地区禽肉及禽类产品
关于 SAP 电商云 Spartacus UI SSR 的 state transfer 问题
QT(41)-多线程-QTThread-同步QSemaphore-互斥QMutex
该如何训练好深度学习模型?
DICOM医学影像协议
win10 uwp 使用 ScaleTransform 放大某个元素
ADB 安装 + 打驱动全教程
Web3安全风险令人生畏,应该如何应对?
【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库