考研篇——数据结构王道3.2.3_队列的链式实现

news/2024/10/24 10:13:28/

目录

  • 1.链队列
  • 2.代码实现
    • 2.1 带头结点
    • 2.2 不带头结点
  • 总结

1.链队列

队列是一种线性结构,线性是指其在逻辑结构,上一节我们顺序存储实现队列,这次链式存储实现队列。与单链表的实现不同的是,只能在表头删除,表尾插入。

2.代码实现

2.1 带头结点

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LinkNode {ElemType data;struct LinkNode* next;
}LinkNode;
typedef struct {LinkNode* front, * rear;//int size;//如果频繁使用队列长度的话,考虑增加变量size记录,否则每遍历的时间复杂度是O(n)
}LinkQueue;
//带头结点
void InitQueue(LinkQueue& Q)
{Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));if (Q.front == NULL)return;Q.front->next = NULL;
}
bool IsEmpty(LinkQueue Q)
{if (Q.front == Q.rear)//Q.front->next==NULLreturn true;elsereturn false;
}
void EnQueue(LinkQueue& Q, ElemType x)
{LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));if (s == NULL)return;s->next = NULL;s->data = x;Q.rear->next = s;Q.rear = s;
}
bool DeQueue(LinkQueue& Q, ElemType& x) {if (Q.front == Q.rear)return false;LinkNode* s = Q.front->next;x = s->data;Q.front->next = s->next;if (Q.rear == s)Q.rear = Q.front;free(s);return true;
}

2.2 不带头结点

与代码2.1相同的部分省略

//不带头结点
void InitQueue1(LinkQueue &Q)
{Q.front = Q.rear = NULL;
}
bool IsEmpty1(LinkQueue Q)
{if (Q.front == NULL)//Q.rear==NULLreturn true;elsereturn false;
}
void EnQueue1(LinkQueue& Q, ElemType x)
{LinkNode* s= (LinkNode*)malloc(sizeof(LinkNode));if (s == NULL)return;s->next = NULL;s->data = x;if (Q.rear == NULL)Q.front = Q.rear = s;//不带头结点,第一个元素入队时单独处理,与后续元素入队不同的是,要更改头指针的指向else {Q.rear->next = s;Q.rear = s;}
}
bool DeQueue1(LinkQueue& Q, ElemType& x) {if (Q.front == Q.rear)return false;LinkNode* p = Q.front;x = p->data;Q.front = p->next;if (Q.rear == p)Q.rear = Q.front=NULL;free(p);return true;
}

总结

链式存储实现的队列与顺序存储相比,好处在于,顺序存储的空间是预分配的,一旦满了就不能再插入。但链式存储一般不存在队满的情况,除非内存不足。
在书写代码时,思考不带头结点与带头节点在操作上的区别,是否单独处理要分情况。


http://www.ppmy.cn/news/1541571.html

相关文章

大数据-185 Elasticsearch - ELK 家族 Logstash 安装配置 Input 插件-stdin stdout

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

美的空调SAP ERP信息化整体规划方案|141页PPT

文档是关于美的空调SAP ERP信息化整体规划方案的详细介绍。文档从不同角度深入探讨了美的空调在实施SAP ERP系统时的规划方案、实施路线图、业务挑战、管理提升建议、系统架构设计、核心诉求、数据管理、供应链管理、生产管理、物料管理、质量管理、财务管理等多个方面。 案例介…

R语言笔记(一)

文章目录 一、R objects二、Types of data三、Operators1、Operators2、Comparison operators3、Logical operators 四、Check types of data objects五、Convertion between data objects六、R workspace 一、R objects Two basic types of things/objects: data and functio…

定时任务使用kafka

定时任务使用kafka 在上述业务场景中使用 Kafka 而不是直接定时执行任务有以下几个重要原因&#xff1a; 一、解耦 任务触发与执行分离&#xff1a; 使用 XXL-JOB 定时触发任务并将任务消息发送到 Kafka&#xff0c;实现了任务触发端&#xff08;通常是调度系统&#xff09;和…

element 中 el-dialog 在不同的文件中使用

在实际中工作&#xff0c;我们经常需要使用 el-dialog 来做一个弹框的功能。最常见的就是在父组件中点击一个按纽&#xff0c;然后弹出一个框。而这个框就是子组件。同时&#xff0c;父子组件是分布在不同的文件中。 <!--父组件--> <template> <div> <…

LabVIEW继电器视觉检测系统

随着制造业的自动化与高精度要求不断提升&#xff0c;传统的人工检测方法逐渐难以满足高效和高精度的需求。特别是在航空航天、医疗设备等高端领域&#xff0c;密封继电器推动杆部件的质量直接影响到设备的性能与可靠性。LabVIEW自动化视觉检测系统&#xff0c;能对推动杆部件进…

TCP(三次握手)和UDP(面向无连接)的原理以及区别

TCP(三次握手)和UDP&#xff08;面向无连接&#xff09;的原理以及区别 网络协议是每个前端工程师都必须要掌握的知识&#xff0c;TCP/IP 中有两个具有代表性的传输层协议。 概述 &#x1f4e1;TCP&#xff08;Transmission Control Protocol&#xff09;是一种网络协议&#…

计算机视觉中的坐标变换

1.概述 高级驾驶辅助系统&#xff08;ADAS&#xff09;领域&#xff0c;存在多种常用的坐标系&#xff1a;LiDAR 坐标系、车辆坐标系、相机坐标系、图像坐标系等。因为和这些坐标系频繁打交道&#xff0c;本文对点的旋转与坐标系旋转等变换给出直观推导与说明。 2.坐标点平移…