链式队列基本操作

news/2024/11/16 5:30:39/

链式队列的基本概念

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

相关文章

redux实现原理

Redux 是一个用于 JavaScript 应用程序状态管理的库。它被设计用来管理整个应用程序的状态&#xff0c;并且与 React 结合使用时非常流行。Redux 的实现原理可以简要概括为以下几个关键概念&#xff1a; 单一数据源 (Single Source of Truth)&#xff1a;Redux 应用程序的所有状…

01-xss基本原理

核心:攻击的是前端&#xff0c; 一、课程引入 1、开发一个简单的PHP页面&#xff0c;代码如下&#xff1a; <?php // xss 基础演示代码&#xff1a;从浏览器中接受一个URL地址参数名为content if(isset($_GET[content])){$content$_GET[content];echo "你输入的内容…

k8s保持pod健康

存活探针 Kubemetes 可以通过存活探针 (liveness probe) 检查容器是否还在运行。可以为 pod 中的每个容器单独指定存活探针。如果探测失败&#xff0c;Kubemetes 将定期执行探针并重新启动容器。 Kubemetes 有以下三种探测容器的机制&#xff1a; HTTP GET 探针对容器的 IP 地…

【SolidWorks】快速做一个密闭箱体的方法

最近博主在用SolidWorks搭建一个带有上盖的方壳体&#xff0c;经过一番摸索&#xff0c;发现采用“特征”里的“拉伸”和“抽壳”两个功能&#xff0c;就可以快速搭建一个封闭箱体。这里将快速做密闭箱体的方法分享给大家。 1、在草图里画一个箱体的底部图形&#xff0c;比如方…

如何使用Knife4j进行接口测试

Knife4j是一个为Java MVC框架提供增强的Swagger UI界面的开源工具&#xff0c;它集成了Swagger UI并提供了更丰富的功能。使用Knife4j可以进行接口的测试&#xff0c;以下是使用Knife4j进行接口测试的详细步骤和解释&#xff1a; 1. 引入Knife4j依赖 首先&#xff0c;确保你的…

python获取图像边缘轮廓

在计算机视觉领域,图像边缘检测是基础且关键的一环,它能够帮助我们从复杂的图像数据中提取有用的结构信息,进而用于物体识别、形状分析等多种应用。Python凭借其丰富的库支持,如OpenCV、Pillow、Scikit-image等,成为了实现图像边缘检测的热门工具。本文将详细介绍如何使用…

虚幻引擎5 Gameplay框架(二)

Gameplay重要类及重要功能使用方法&#xff08;一&#xff09; 配置LOG类及PlayerController的网络机制 探索验证GamePlay重要函数、类的执行顺序与含义 我们定义自己的日志&#xff0c;专门建立一个存放自己日志的类&#xff0c;这个类继承自BlueprintFunctionLibrary 然后…

c++ 唤醒指定线程

在C中&#xff0c;直接唤醒一个特定的线程并不像在Java的Thread类中有interrupt()方法或者某些操作系统特定的API&#xff08;如POSIX的pthread_cond_signal或Windows的SetEvent&#xff09;那样简单。C标准库没有提供一个直接的方法来"唤醒"一个正在等待的线程。然而…