链式队列基本操作

链式队列的基本概念

链式队列是一种常见的数据结构,它使用链表作为其底层数据存储结构。链式队列的特点是动态的内存分配,可以有效地处理队列的入队和出队操作。下面,我将介绍链式队列的实现方法,并提供相应的C语言代码示例。

链式队列遵循先进先出(FIFO)原则,即最早进入队列的元素将最先被移除。它由节点组成,每个节点包含数据和指向下一个节点的指针。

实现链式队列的步骤

  1. 创建队列:首先,我们需要创建一个队列结构,它包含当前队列的大小、队首指针和队尾指针。
  2. 创建节点:每个节点包含数据和指向下一个节点的指针。
  3. 判断队列是否为空:检查队列的当前大小是否为0。
  4. 入队操作:在队尾添加新节点。
  5. 出队操作:从队首移除节点。
  6. 获取队首元素:返回队首节点的数据,但不移除节点。
  7. 获取队列大小:返回队列中元素的数量。
  8. 销毁队列:释放队列占用的所有内存。

链式队列的操作说明参考书籍《大话数据结构》:

项目文件:LinkQueue.h,其中有结构体以及相关的函数声明

#pragma once
#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h> 
#include <assert.h>// 定义队列中的元素类型  
typedef int Datatype;// 定义队列节点结构体  
typedef struct QueueNode {Datatype data; // 节点中的数据  struct QueueNode* next; // 指向下一个节点的指针  
} QueueNode;// 定义链式队列结构体  
typedef struct LinkQueue {QueueNode* front; // 队列头部节点指针  QueueNode* rear;  // 队列尾部节点指针  int curSize;         // 队列中元素的数量  
} LinkQueue;// 初始化链式队列  
LinkQueue* createLinkQueue();//创建节点
QueueNode* createNode(Datatype data);//判断链式队列是否为空  
bool isEmptyLinkQueue(LinkQueue* queue);//入队操作  
void enLinkQueue(LinkQueue* queue, Datatype element);//出队操作  
void deLinkQueue(LinkQueue* queue);// 获取队列的前端元素  
Datatype peekLinkQueue(LinkQueue* queue);// 获取链式队列的大小  
int sizeLinkQueue(LinkQueue* queue);// 销毁链式队列  
void destroyLinkQueue(LinkQueue* queue);

LinkQueue.c:其中是全部的函数实现,需要在其中引用LinkQueue.h

#include "LinkQueue.h"//创建链式队列  
LinkQueue* createLinkQueue()
{LinkQueue* queue = (LinkQueue*)malloc(sizeof(LinkQueue));assert(queue);queue->curSize = 0;queue->front = queue->rear = NULL;return queue;
}//创建节点
QueueNode* createNode(Datatype data)
{QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));assert(newNode);newNode->data = data;newNode->next = NULL;return newNode;
}//判断链式队列是否为空  
bool isEmptyLinkQueue(LinkQueue* queue)
{assert(queue);if (queue->curSize == 0){return true;}else{return false;}
}//入队操作  这里思考链表的表尾和队列的表尾是否是一样的
//这里一定要思考插入的位置在哪?队列的尾是链表的尾,所以入队相当于链表数据尾插
void enLinkQueue(LinkQueue* queue, Datatype data)
{assert(queue);//创建新的节点QueueNode* newNode = createNode(data);//如果链表为空,那么表头和表尾指针指向同一个节点if (queue->curSize == 0){queue->front = newNode;queue->rear = newNode;}else{//先插入数据,而后更新队列尾指针queue->rear->next = newNode;queue->rear = newNode;}queue->curSize++;
}//出队操作 (数据头删)
void deLinkQueue(LinkQueue* queue)
{assert(queue);//如果队列为空,那么无需删除直接返回if (queue->curSize==0){return;}//保存第一个节点QueueNode* temp = queue->front;//将表头指针移动到下一个节点queue->front = queue->front->next;//删除之前保存的第一个节点free(temp);queue->curSize--;
}// 获取队列的前端元素  
Datatype peekLinkQueue(LinkQueue* queue)
{assert(queue);assert(queue->curSize);return queue->front->data;
}// 获取链式队列的大小  
int sizeLinkQueue(LinkQueue* queue)
{assert(queue);return queue->curSize;
}// 销毁链式队列  
void destroyLinkQueue(LinkQueue* queue)
{assert(queue);while (queue->curSize){deLinkQueue(queue);}free(queue);
}

总结

链式队列是一种灵活且高效的数据结构,适用于需要动态内存分配的场景。通过上述代码,我们可以看到链式队列的实现相对简单,但功能强大。它在很多应用中都非常有用,比如任务调度、事件处理等。

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

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

相关文章

ABAP开发(3)数据类型和变量

文章目录 1、常用数据类型2、变量定义1、定义基本类型变量2、定义结构体3、定义类型 1、常用数据类型 2、变量定义 在ABAP中&#xff0c;使用关键字DATA定义变量&#xff0c;句号结尾。 1、定义基本类型变量 定义变量ID&#xff0c;字符串&#xff0c;长度20。 DATA ID(20)…

【2022 深圳 ArchSummit 】大数据架构稳定性保障实践

文章目录 一、前言二、现状三、大数据架构的历史变迁&#xff08;一&#xff09;洪荒期&MR&#xff08;二&#xff09;远古期&MPP&#xff08;四&#xff09;近现代&Flink/Spark&#xff08;五&#xff09;现如今&实时数据湖架构 四、架构稳定的关键因素&#…

【intro】图卷积神经网络(GCN)

本文为Graph Neural Networks(GNN)学习笔记-CSDN博客后续&#xff0c;内容为GCN论文阅读&#xff0c;相关博客阅读&#xff0c;kaggle上相关的数据集/文章/代码的阅读三部分&#xff0c;考虑到本人是GNN新手&#xff0c;会先从相关博客开始&#xff0c;进一步看kaggle&#xff…

【软考】I/O系统的层次结构

目录 1. 说明2. 图示3. 用户进程4.设备无关软件5.设备驱动程序6.中断处理程序7.交互过程 1. 说明 1.设备管理软件的设计水平决定设备管理的效率。2.设计I/O软件的主要目标是设备独立性和统一命名。3.I/O软件独立于设备&#xff0c;可以提高设备管理软件的设计效率。4.I/O设备管…

windows系统双网卡其中一个网卡访问速度很慢解决办法

电脑双网卡&#xff0c;一个是公司的内网&#xff0c;另一个是外网&#xff0c;而且还是外接的USB网卡&#xff0c;这种情况下&#xff0c;不管USB网卡做内网还是外网&#xff0c;它都很慢。 浏览器打开网页&#xff0c;每个网页都要加载1分钟&#xff0c;十分烦&#xff0c;但…

如何省下5000培训费学会月薪8000的嵌入式Linux?

嵌入式底层开发无疑是一项极为关键的技术&#xff0c;它在众多嵌入式系统中都有着广泛而重要的应用。在当今科技飞速发展的时代&#xff0c;嵌入式系统已经深入到我们生活的每一个角落&#xff0c;成为了我们日常生活中不可或缺的一部分&#xff0c;这也更加凸显了嵌入式开发的…

真希望我父母读过这本书的笔记(二)

系列文章目录 真希望我父母读过这本书的笔记&#xff08;一&#xff09; 真希望我父母读过这本书的笔记&#xff08;二&#xff09; 文章目录 系列文章目录PART 5 培养心理健康的孩子亲子关系决定心理健康互动及来回交流如何开始交流互看游戏交流恐惧症 若遇棘手之际&#xff0…

一般显卡3d建模渲染够用吗?3d云渲染助力

3D建模和渲染对计算机硬件有较高要求&#xff0c;特别是显卡。显卡的性能直接影响渲染速度&#xff0c;低端和高端显卡在渲染效率上存在显著差异。对于追求快速渲染的用户&#xff0c;高端显卡是首选。那么&#xff0c;4050显卡是否能够满足3D建模渲染的需求呢?下面我们来探讨…

【c2】编译预处理,gdb,makefile,文件,多线程,动静态库

文章目录 1.编译预处理&#xff1a;C源程序 - 编译预处理【#开头指令和特殊符号进行处理&#xff0c;删除程序中注释和多余空白行】- 编译2.gdb调试&#xff1a;多进/线程中无法用3.makefile文件&#xff1a;make是一个解释makefile中指令的命令工具4.文件&#xff1a;fprint/f…

常见通信协议

1、串口&#xff1a;&#xff08;串行异步全双工&#xff0c;先发低位&#xff09; 因为是异步的&#xff0c;所以没有时钟线&#xff0c;因为是全双工&#xff0c;所以有两条数据传输线&#xff0c;实现数据的收发。 帧格式 起始位1位&#xff0c;数据位8位&#xff0c;校验…

SparkSql介绍

概述 SparkSQL&#xff0c;顾名思义&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而叫Shark&#xff0c;最开始的时候底层代码优化&#xff0c;sql的解析、执行引擎等等完全基于Hive&#xff0c…

vue3—项目创建

背景 初次学习vue3&#xff0c;需要从项目创建开始。 步骤 打开cmd命令行&#xff0c;进入项目存放目录下&#xff0c;执行创建命令&#xff1a; npm create vuelatest 这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 …