用链表实现的C语言队列
一、队列概述
在数据结构中,队列是一种先进先出(FIFO)的线性表。它在许多应用场景中非常有用,例如任务调度、进程管理、资源管理等。队列是一种重要的数据结构,其主要特点是先进先出(FIFO, First In First Out)。这意味着在队列中,最先进入队列的元素将最先被移出。队列的这种特性使得它在许多实际应用中非常有用,例如打印队列、任务调度、进程管理等。
队列的基本操作包括:
- 入队(Enqueue):将元素加入到队列的末尾。
- 出队(Dequeue):将队列最前面的元素移出队列。
- 获取队首元素(Front):查看队列最前面的元素,但不移出。
- 检查队列是否为空(IsEmpty):判断队列是否为空。
- 获取队列大小(Size):获取队列中的元素个数
今天 我将会用链表实现队列:
二、队列基本操作
队列的结点定义
首先,我们定义一个节点结构体来存储每个元素及其指向下一个节点的指针。
#define eleType int //定义队列元素数据类型//定义结点
typedef struct Node
{eleType data; //数据域struct Node* next; //指针域
} Node;
队列结构体
接下来,我们定义一个队列结构体,包含指向队首和队尾的指针以及队列中的元素个数。
//定义队列结构体
typedef struct
{Node* front; //链表头队列首元素指针Node* rear; //队尾元素指针size_t size; //队列元素个数
} Quene;
队列的创建
初始化一个队列,需要将队首和队尾指针都设置为NULL,并将队列的大小初始化为0。、
void QueneCreat(Quene *q)
{q->front = q->rear = NULL;q->size = 0; //初始化为零
}
队列的销毁
销毁队列需要释放所有节点的内存,并将队首和队尾指针设置为NULL,队列的大小重置为0。
void QueneDestroy(Quene* q)
{while (q->front) //队首元素开始遍历{Node* temp = q->front; //每次遍历将队首指针存入到temp变量中q->front = q->front->next; //将队首指向后继free(temp); //删除游离出来的原来的队首结点}q->rear = NULL; //遍历完成后,将队尾指向空q->size = 0; //将队列重置为0,表示已经清空
}
入队操作
在队尾插入一个新元素。首先为新元素分配内存,然后根据队列是否为空更新队首和队尾指针。
void QuenePush(Quene* q, eleType element)
{//分配一个Node类型的空间,将其地址赋给newNode变量Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = element; //将要添加的元素赋值给新结点的数据域newNode->next = NULL; //将新结点的后继结点指向空if (q->rear == NULL) //判断当前队列是否为空,只需要判断队尾是否为空q->front = q->rear = newNode; //如果为空,将队首和队尾都指向新结点else //如果不为空{q->rear->next = newNode; //将新结点排入队尾q->rear = newNode; //更新队尾结点}q->size++; //队列大小加1
}
出队操作
在队首删除一个元素。首先检查队列是否为空,然后更新队首指针并释放原队首节点的内存。
eleType QuenePop(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}eleType element = q->front->data; //将队首元素赋值给element,用于返回Node* temp = q->front; //将队首指针存储到temp变量中q->front = q->front->next; //更新队首,游离出来原来的队首free(temp); //删除原来的队首q->size--; //队列大小减1if (q->size == 0) //如果队列空了的话q->rear = NULL; //将队尾指向空return element; //
}
获取队首元素
获取队首元素的数据,而不删除队首元素。
eleType QueneFront(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}return q->front->data; //返回队首元素
}
获取队列大小
获取队列中元素的个数。
size_t QueneSize(Quene* q)
{return q->size; //返回队列大小
}
三、完整代码
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#define eleType int //定义队列元素数据类型//定义结点
typedef struct Node
{eleType data; //数据域struct Node* next; //指针域
} Node;//定义队列结构体
typedef struct
{Node* front; //链表头队列首元素指针Node* rear; //队尾元素指针size_t size; //队列元素个数
} Quene;//队列的创建
void QueneCreat(Quene *q)
{q->front = q->rear = NULL;q->size = 0; //初始化为零
}//队列的销毁
void QueneDestroy(Quene* q)
{while (q->front) //队首元素开始遍历{Node* temp = q->front; //每次遍历将队首指针存入到temp变量中q->front = q->front->next; //将队首指向后继free(temp); //删除游离出来的原来的队首结点}q->rear = NULL; //遍历完成后,将队尾指向空q->size = 0; //将队列重置为0,表示已经清空
}//入队
void QuenePush(Quene* q, eleType element)
{//分配一个Node类型的空间,将其地址赋给newNode变量Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = element; //将要添加的元素赋值给新结点的数据域newNode->next = NULL; //将新结点的后继结点指向空if (q->rear == NULL) //判断当前队列是否为空,只需要判断队尾是否为空q->front = q->rear = newNode; //如果为空,将队首和队尾都指向新结点else //如果不为空{q->rear->next = newNode; //将新结点排入队尾q->rear = newNode; //更新队尾结点}q->size++; //队列大小加1
}//出队
eleType QuenePop(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}eleType element = q->front->data; //将队首元素赋值给element,用于返回Node* temp = q->front; //将队首指针存储到temp变量中q->front = q->front->next; //更新队首,游离出来原来的队首free(temp); //删除原来的队首q->size--; //队列大小减1if (q->size == 0) //如果队列空了的话q->rear = NULL; //将队尾指向空return element; //
}//获取队首元素
eleType QueneFront(Quene* q)
{if (q->rear == NULL) //判断队列是否为空{printf("Quene is empty!\n");exit(1); //如果为空,退出程序}return q->front->data; //返回队首元素
}//获取队列大小
size_t QueneSize(Quene* q)
{return q->size; //返回队列大小
}
今天介绍了如何使用链表在C语言中实现一个队列,并详细解释了每个步骤的实现方法。通过这种方式实现的队列,不仅可以动态扩展,还能高效地进行插入和删除操作。在实际应用中,这种链表实现的队列可以用于任务调度、进程管理等场景。
相关文章:
用链表实现的C语言队列
一、队列概述 在数据结构中,队列是一种先进先出(FIFO)的线性表。它在许多应用场景中非常有用,例如任务调度、进程管理、资源管理等。队列是一种重要的数据结构,其主要特点是先进先出(FIFO, First In First …...
国产SDI视频均衡驱动器,功能与 LMH0387/LMH0344 一致
视频均衡驱动器,功能与 LMH0387 一致、LMH0344。本期间支持 DVB-ASI,作为驱动器能够选择输出速率,作为均衡接收器能支持100m以上传输距离(线缆类型Belden 1694A)。最大支持3Gbps 速率的信号 2 产品特征 a)…...
如何用Xinstall CPS结算系统打破传统营销桎梏,实现用户增长?
在互联网流量红利逐渐衰退的今天,App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系,成为了众多企业急待解决的问题。而在这个关键时刻,Xinstall CPS结算系统应运而生,以其独特的优势帮助企业解决了一系列…...
(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2+bx+c0 的两个根:
(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2bxc0 的两个根: b2-4ac 称作一元二次方程的判别式。如果它是正值,那么一元二次方程就有两个实数根。 如果它为 0,方程式就只有一个根。如果它是负值,方程式无实根。 编写程序,提示…...
如何提高网站收录?
GSI服务就是专门干这个的,这个服务用的是光算科技自己研发的GPC爬虫池系统。这个系统通过建立一个庞大的站群和复杂的链接结构,来吸引谷歌的爬虫。这样一来,你的网站就能更频繁地被谷歌的爬虫访问,从而提高被收录的机会。 说到效…...
Docker 学习总结(83)—— 配置文件daemon.json介绍及优化建议
一、daemon.json 文件概述 daemon.json是Docker守护进程的配置文件,它允许系统管理员自定义Docker守护程序的行为。此文件通常位于/etc/docker/目录下。通过修改daemon.json,可以调整Docker守护进程的多种设置,包括网络配置、日志记录、存储驱动等。 二、daemon.json 文件结…...
Javaweb04-Servlet技术2(HttpServletResponse, HttpServletRequest)
Servlet技术基础 HttpServletResponse对象 HttpServletResponce对象是继承ServletResponse接口,专门用于封装Http请求 HttpServletResponce有关响应行的方法 方法说明功能描述void setStatus(int stauts)用于设置HTTP响应消息的状态码,并生成响应状态…...
chat gpt基本原理解读
chat gpt基本原理解读 ChatGPT是一种基于生成式预训练变换器(Generative Pre-trained Transformer, GPT)的对话模型,主要通过大量的文本数据训练生成自然语言回复。以下是ChatGPT的基本原理解读: 1. 基本架构 ChatGPT 是基于 GPT…...
单目标应用:基于蛇鹫优化算法SBOA的微电网优化(MATLAB代码)
一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、蛇鹫优化算法求解微电网 2.1算法简介 蛇鹫优化算法(Secre…...
MySQL系列-安装配置使用说明(MAC版本)
1、前言 本文将介绍MySQL的安装配置以及基本语法操作说明 环境:mac 版本:MySQL 8.0.28 之前电脑安装卸载过,后面在装的时候遇到一些问题,用了四五天才解决,主要是参考 https://blog.csdn.net/zz00008888/article/deta…...
vue elementui el-input 正则验证,限制只能输入数字和小数
vue elementui el-input 正则验证 限制只能输入数字和小数,以下两种方法都可以: 1、οninput“value value.replace(/[^0-9.]/g,‘’)” 2、οninput“value value.replace(/[^\d.]/g, ‘’)” 限制只能输入数字: 1、oninput “valuevalu…...
强化学习入门
简介 强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化…...
简约不简单,建筑装饰演绎现代美学
走在城市的大街小巷,你是否曾被那些独特而精美的建筑装饰所吸引?每一栋建筑都像是艺术家的杰作,通过精美的装饰诉说着它的故事。 我们的建筑装饰,不仅注重外在的美观,更追求内在的品质。从古典的雕花到现代的简约线条&…...
SpringBoot调用WebService的实践
作者所在公司的系统间的信息交互是通过webservice完成。如:MES与SAP的交互,MES与WMS的交换,MES与SRM的交互,MES与IOT的交互等。 MES是用.NET VS2008 C#写的,调用webservice很简单,这里不再赘述。如有想了解…...
源码编译构建LAMP
Apache 起源 源于A Patchy Server,著名的开源Web服务软件1995年时,发布Apache服务程序的1.0版本由Apache软件基金会(ASF)负责维护最新的名称为“Apache HTTP Server”官方站点:http://httpd.apache.org/ 主要特点 开发源代码/…...
搜索是门艺术,大神都是这样找资源
以下所有资源均可在星云导航找到,网站地址:https://www.xygalaxy.com/ 浏览器搜索高级用法 1、排除干扰,指定关键词 1.1、排除指定关键字 格式:关键字1 -关键字2比如搜索:星云导航,不想要CSDN的内容 星…...
【设计模式深度剖析】【5】【行为型】【迭代器模式】
👈️上一篇:策略模式 | 下一篇:中介者模式👉️ 设计模式-专栏👈️ 文章目录 迭代器模式定义英文原话直译如何理解呢? 迭代器模式的角色1. Iterator(迭代器)2. ConcreteIterator(具体迭代器…...
怎么更快捷的修改图片大小?压缩图片jpg、png、gif的快捷方法
jpg作为最常用的一种图片格式,在遇到图片太大问题时,该如何操作能够快速在压缩图片jpg的大小呢?图片太大无法上传时目前常见的一个使用问题,只有将图片处理到合适的大小才可以正常在平台上传使用,一般情况下想要快速解…...
Shell脚本 if语句
条件测试: $? 返回码 判断命令或者脚本是否执行成功(最近的一条) 0 true 为真就是成功 成立 非0 false 失败或者异常 test命令 可以进行条件测试 然后根据的是返回值来判断条件是否成立。 -e 测试目录或者文件是否存在 exist -d 测试…...
集合查询-并(UNION)集运算、交(INTERSECT)集运算、差(EXCEPT)集运算
一、概述 集合查询是对两个SELECT语句的查询结果进行再进行处理的查询 二、条件 1、两个SELECT语句的查询结果必须是属性列数目相同 2、两个SELECT语句的查询结果必须是对应位置上的属性列必须是相同的数据类型 三、并(UNION)运算 1、语法格式: SELECT 语句1…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
