链式队列基本操作

news2024/9/22 21:31:25

链式队列的基本概念

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

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

相关文章

曼奇立德10节春季插画研修课

课程介绍 课程探讨了存在主义心理学的基本原理和方法。通过学习该课程&#xff0c;您将了解到存在主义的核心概念&#xff0c;如自由意志、责任感和意义寻求。您将学会运用存在主义理论和技巧来帮助个人面对挑战、追求自我实现&#xff0c;并寻找生活的意义。这门课程将启发您的…

力扣每日一题-去掉最低工资和最高工资后的工资平均值-2024.5.3

力扣题目&#xff1a;去掉最低工资和最高工资后的工资平均值 开篇 题目链接: 1491.去掉最低工资和最高工资后的工资平均值 题目描述 代码思路 太简单了。先利用sort排序对数组进行从小到大排序&#xff0c;然后计算时数组最小值和最大值不要加进去即可。 代码纯享版 clas…

C#图像处理实例1:opencvsharp获取轮廓凸包

在OpenCvSharp中&#xff0c;你可以使用Cv2.ApproxPolyDP函数来获取轮廓的凸包。这个函数使用Douglas-Peucker算法来近似轮廓。 以下是一个简单的例子&#xff0c;展示如何使用OpenCvSharp获取轮廓的凸包&#xff1a; Mat src Cv2.ImRead("保存图像\2.jpg", ImreadM…

C++例题:大数运算---字符串相加(使用数字字符串来模拟竖式计算)

1.代码速览 class Solution2 { public:string addStrings(string num1, string num2){//end1和end1是下标int end1 num1.size() - 1;int end2 num2.size() - 1;string str;//下标(指针)从后向前走,走到头才可以结束,所以是end>0int next 0;while (end1 > 0 || end2 &…

利用大语言模型(KIMI)构建智能产品的信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一件非常繁杂和耗费人工的事情。利用大语言模型&#xff0c;能够轻松地生成设备的信息模型&#xff0c;我们的初步实验表明&#xff0c;只要提供足够的模板&#xff0c;就能够准确地生成设备的数字化模型。 我们尝…

CyberDemo解读

CyberDemo: Augmenting Simulated Human Demonstration for Real-World Dexterous Manipulation解读 摘要1. 简介2. Related Work2.1 Data for Learning Robot Manipulation2.2 机器人的预训练视觉表征2.3 Sim2Real Transfer 3. CyberDemo3.1 收集人体遥操作数据3.2 在模拟器中…

颠覆传统?「一束光子,两种频率」的量子纠缠!

在最新的研究中&#xff0c;科学家们开发了一种革命性的量子纠缠方式——“频域光子数路纠缠”&#xff08;frequency-domain photon number-path entanglement&#xff09;。这一量子物理学的重大进展涉及到一个创新性的工具&#xff1a;频率分束器&#xff08;frequency beam…

景源畅信:抖音运营做什么工作内容?

在如今这个信息爆炸的时代&#xff0c;抖音已经成为了人们生活中不可或缺的一部分。无论是消磨时间、获取信息还是展示自我&#xff0c;抖音都扮演着重要的角色。那么&#xff0c;作为抖音运营&#xff0c;他们需要做些什么呢? 一、内容策划与制作 抖音运营的首要任务就是内容…

USB3.0

用万用表测量电容&#xff0c;电阻的好坏&#xff1a; 直接用万用表的电容档位测量电容的值&#xff0c;若所测值与电容表面所写或原理图中电容大小一样的话则判断电容是好的&#xff0c;否则是坏的。电阻一样。 有时候万用表并不好用&#xff0c;LCR仪则更为准确&#xff1a…

AArch64 内存管理

本文是对arm developer网站《Learn the architecture - AArch64 memory management Guide》的学习笔记&#xff08;Documentation – Arm Developer&#xff09; 一、背景概述 本文介绍了AArch64中的内存转换&#xff0c;这是内存管理的关键&#xff0c;它解释了虚拟地址如何转…

Java模块化系统:引领代码革命与性能飞跃

JDK工程结构的问题 在说Java模块化系统之前&#xff0c;先来说说Java9之前的JDK在工程结构上的问题&#xff0c;从JDK本身的问题说起&#xff0c;Java从1996年发布第一版到2017年发布Java9&#xff0c;中间经历了近20年的时间&#xff0c;在这期间发布了无数个大大小小的版本用…

鸿蒙开发-ArkTS语言-容器

鸿蒙开发-UI-交互事件-键鼠事件 鸿蒙开发-UI-交互事件-焦点事件 鸿蒙开发-UI-交互事件-手势事件 鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 文章目录 前言 一、容器类库概述 二、线性容器 1…

Linux网络服务的存储,FTP服务和NFS共享

目录 一.存储 1.存储类型 2.应用场景 二.FTP服务 1.FTP工作原理介绍 2.FTP协议的两种模式 3.用户类型 4.匿名用户案例 三.NFS 1.NFS简介 2.NFS服务主要进程 3.NFS特点 4.NFS共享配置文件格式 5.NFS工具 5.1 exportfs 5.2 showmount 5.3 mount.nfs 6.创建文…

张大哥笔记:卖盗版网课,获利 100 万被抓

这几天刷视频&#xff0c;看到一个新闻&#xff0c;某大学生卖盗版网课&#xff0c;把别人2000多正版网课&#xff0c;以做活动名义售卖20元&#xff0c;获利100多万被抓。 下方图片来自&#xff1a;极目新闻 卖这种盗版网课&#xff0c;门槛低&#xff0c;成本低&#xff0c;…

CWDM、DWDM、MWDM、LWDM:快速了解光波复用技术

在现代光纤通信领域&#xff0c;波分复用&#xff08;WDM&#xff09;技术作为一项先进的创新脱颖而出。它通过将多个不同波长和速率的光信号汇聚到一根光纤中来有效地传输数据。本文将深入探讨几种关键的 WDM 技术&#xff08;CWDM、DWDM、MWDM 和 LWDM&#xff09;&#xff0…

软考中、高项变成了一年考一次,还有机会上岸吗?

真正想考试的人机会一直都在&#xff0c;虽然这次考试频次减少了&#xff0c;但整个调整还未涉及到考试内容方面&#xff0c;所以如果你现在考不过的话&#xff0c;之前也未必可以&#xff0c;主要还是要对考试内容有足够的熟悉才能顺利通过。 一、做了哪些科目调整 将软考初…

04-19 周四 GitHub CI 方案设计

04-19 周四 GitHub CI 方案设计 时间版本修改人描述2024年4月19日14:44:23V0.1宋全恒新建文档2024年4月19日17:22:57V1.0宋全恒完成部署拓扑结构的绘制和文档撰写 简介 需求 由于团队最近把代码托管在GitHub上&#xff0c;为解决推理、应用的自动化CI的需要&#xff0c;调研了…

c++笔记——概述运算符重载——解析运算符重载的难点

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例的实现来讲述…

docker的安装以及docker-compose

什么事docker Docker是一种轻量级的容器技术&#xff0c;可以帮助开发者更加方便地打包、发布和管理应用程序。在Linux系统上安装Docker非常容易. 安装和使用docker 1:首先安装必须的管理工具&#xff0c;使用Linux 终端命令 sudo yum install -y yum-utils device-mapper-per…

LearnOpenGL(七)之摄像机

一、摄像机/观察空间 当我们讨论摄像机/观察空间(Camera/View Space)的时候&#xff0c;是在讨论以摄像机&#xff08;人&#xff09;的视角作为场景原点时场景中所有的顶点坐标&#xff1a;观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标。要定义一个摄像机…