链式队列基本操作

链式队列的基本概念

链式队列是一种常见的数据结构,它使用链表作为其底层数据存储结构。链式队列的特点是动态的内存分配,可以有效地处理队列的入队和出队操作。下面,我将介绍链式队列的实现方法,并提供相应的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.mzph.cn/web/7134.shtml

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

相关文章

C语言-设置控制台信息

Win_API Win_API是Windows应用程序接口&#xff08;Windows Application Programming Interface&#xff09;的缩写&#xff0c;它是一组函数、系统服务和程序接口&#xff0c;允许开发者在微软Windows操作系统上创建应用程序。Win32 API 是Windows API的一个主要部分&#xff…

Linux PXE高效批量网络装机

系统初始化 systemctl disable --now firewalld.service setenforce 0 vim /etc/selinux/config 安装软件 yum install -y tftp-server xinetd dhcp vsftpd syslinux 复制 vmlinuz initrd.img pxelinux.0 到 /var/lib/tftpboot/ 目录 [rootlocalhost ~]# cd /mnt/…

设计模式之业务代表模式

在编程江湖的风雨中漂泊多年&#xff0c;每当我遇到那些错综复杂的业务逻辑和系统交互&#xff0c;总有一个模式像一位忠诚的骑士&#xff0c;默默守护着我的代码城堡&#xff0c;那就是——业务代表模式&#xff08;Business Delegate Pattern&#xff09;。它不是最耀眼的明星…

C++ 如何进阶?

一、C基础&#xff08;3个月&#xff09; 1、面向对象的三大特性&#xff1a;封装、继承、多态 2、类的访问权限&#xff1a;private、protected、public 3、类的构造函数、析构函数、赋值函数、拷贝函数 4、移动构造函数与接贝构造函数对比 5、深接贝与浅贝的区别 6、空…

【C++语言】类和对象--默认成员函数 (中)

文章目录 前言类的六个默认成员函数&#xff1a;1. 构造函数概念特性做了什么&#xff1f;易错注意&#xff1a;显式定义和默认构造函数 2. 析构函数概念特征做了什么?注意事项&#xff1a; 3.拷贝构造函数概念特征做了什么&#xff1f;注意事项&#xff1a; 4.赋值运算符重载…

MySQL基础_4.排序与分页

文章目录 一、排序二、分页 一、排序 使用 ORDER BY 子句排序&#xff1a; ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序 二、分页 MySQL中使用 LIMIT 实现分页&#xff0c;格式&#xff1a; LIMIT [位置偏移量,] 行数第一个“位置偏…

Linux程序库文件调试测试方法

Linux编译后的.so文件是需要进行上机测试的&#xff0c;对于已经量产的硬件平台来说一般是通过具有相同功能的样机测试新版本的功能&#xff0c;具体如下。 Linux的量产固件由于已经经过裁剪系统内部的usr lib etc等目录是只读的权限不可以修改因此不能将测试库直接放到其下进行…

JavaScript异步编程——01-单线程和异步任务

单线程 JS 是单线程的 JavaScript 语言的执行是单线程的。即同一时间&#xff0c;只能处理一个任务。 具体来说&#xff0c;所谓单线程&#xff0c;是指 JS 引擎中负责解释和执行 JavaScript 代码的线程只有一个&#xff0c;即同一时间&#xff0c;只能处理一个任务。这个任…

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…

ComfyUI 基础教程(十三):ComfyUI-Impact-Pack 面部修复

SD的WebUI 中的面部修复神器 ADetailer,无法在ComfyUI 中使用。那么如何在ComfyUI中进行面部处理呢?ComfyUI 中也有几个面部修复功能,比如ComfyUI Impact Pack(FaceDetailer),以及换脸插件Reactor和IPAdapter。 ComfyUI-Impact-Pack 是一个功能强大的插件,专为 ComfyUI …

GDB的常用命令

GDB&#xff08;GNU Debugger&#xff09;是Linux和其他类Unix系统中常用的调试工具&#xff0c;用于调试C、C等编程语言编写的程序。以下是一些GDB常用的命令&#xff1a; 启动和基本操作 gdb [executable-file]&#xff1a;启动GDB并加载指定的可执行文件。 run [arguments]…

淘宝扭蛋机小程序开发:开启你的惊喜之旅

一、扭出新世界&#xff0c;惊喜不断 在这个充满无限可能的数字时代&#xff0c;淘宝扭蛋机小程序为你带来了一种全新的购物与娱乐体验。扭蛋机&#xff0c;这个充满童趣和惊喜的玩具&#xff0c;如今在我们的小程序中焕发出新的活力&#xff0c;为你带来一波又一波的惊喜与快…

【CTF Web】XCTF GFSJ0485 simple_php Writeup(代码审计+GET请求+PHP弱类型漏洞)

simple_php 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 解法 &#xfeff;<?php show_source(__FILE__); include("config.php"); $a$_GET[a]; $b$_GET[b]; if($a0 and $a){echo $flag1; } if(is_numeric($b)){exit(); } if($b>1234){ech…

jquery项目 html使用export import方式调用模块

jquery的老项目&#xff0c;引入vue3, 需要方便使用export, import方式引用一些常用的方法与常量 导出模块 export js/numberUtil.js /*** Description:* Author Lani* date 2024/1/10*//* * 【金额】 保留2位小数&#xff0c;不四舍五入 * 5.992550 >5.99 , 2 > 2.…

【Kaggle】练习赛《洪水数据集的回归预测》(下)

前言 上篇《洪水数据集的回归预测》(上) 介绍了该数据集非常特殊之处&#xff0c;各特征都非常类似&#xff0c;没有特别之处&#xff0c;各特征之间的相关系数几乎为零。同时&#xff0c;各类模型不敏感&#xff0c;最理想的模型居然是线性回归&#xff0c;决定系数 R 2 R^2 …

64位Office API声明语句第118讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

Python进阶:函数

Python进阶 函数的定义和调用 函数定义通常采用def关键词,后面跟着函数名及圆括号内的参数列表。 def function_name (parameters):"""函数文档字符串"""# 函数体...return expression # 可选&#xff0c;用于返回函数结果function_name是函数…

富格林:曝光欺诈陷阱阻挠受骗亏损

富格林悉知&#xff0c;今年以来&#xff0c;国际金融市场动荡&#xff0c;黄金价格则表现强势&#xff0c;黄金投资热潮再起&#xff0c;黄金作为避险工具的价值再度成为世人瞩目的焦点。然而做好黄金投资却不是那么容易的&#xff0c;没有掌握一定的做单技巧&#xff0c;便难…

达梦数据库导入数据问题

进行数据导入的时候遇到了导入数据问题 第一个问题&#xff1a; 该工具不能解析此文件&#xff0c;请使用更高版本的工具 这个是因为版本有点低&#xff0c;需要下载最新的达梦数据库 第二个问题&#xff1a; &#xff08;1&#xff09;本地编码&#xff1a;PG_GBK, 导入文…

全国31省对外开放程度、经济发展水平、ZF干预程度指标数据(2000-2022年)

01、数据介绍 自2000年至2022年&#xff0c;中国的对外开放程度不断深化、经济发展水平不断提高、ZF不断探索并调整自身在经济运行中的角色和定位&#xff0c;以更好地适应国内外环境的变化&#xff0c;也取得了举世瞩目的成就。这一期间&#xff0c;中国积极融入全球经济体系…