C语言实现队列数据结构:思路与代码详解

目录

一、引言 

二、整体思路 

三、代码模块分析 

(一)头文件包含与宏定义 

(二)数据类型定义 

(三)队列操作函数 

1. 队列初始化 

2. 队列销毁 

3. 入队操作 

4. 出队操作 

5. 获取队头元素 

6. 获取队尾元素 

7. 获取队列大小 

8. 判断队列是否为空 

(四)主函数测试 

四、总结 


作者主页:共享家9527-CSDN博客

一、引言
 


队列是一种重要的数据结构,遵循先进先出(FIFO)的原则。在C语言中,我们可以通过自定义结构体和一系列操作函数来实现一个队列。本文将详细介绍如何实现一个简单的队列,并对代码的各个部分进行深入分析。
 


二、整体思路
 


队列的实现主要涉及队列节点的定义、队列结构体的定义以及对队列的各种操作,如初始化、入队、出队、获取队头和队尾元素、判断队列是否为空和获取队列大小等。我们将这些操作模块化,每个函数负责一个特定的功能,使得代码结构清晰,易于维护和扩展。
 


三、代码模块分析
 


(一)头文件包含与宏定义
 


c#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>


 
 _CRT_SECURE_NO_WARNINGS 宏定义用于关闭Visual Studio中一些函数的安全警告。后面依次包含了标准输入输出库、标准库、布尔类型库和断言库,为后续代码提供必要的功能支持。
 


(二)数据类型定义
 


ctypedef int QDatatype;
typedef struct QueueNode
{struct QueueNode* next;QDatatype data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;


 
-  QDatatype  定义为  int  类型,表示队列中存储的数据类型,这里是整型,也可以根据实际需求改为其他类型。
 
-  QueueNode  结构体定义了队列节点,包含一个指向下一个节点的指针  next  和存储数据的  data  成员。
 
-  Queue  结构体表示整个队列,包含指向队头的指针  head 、指向队尾的指针  tail  和记录队列元素个数的  size 。
 


(三)队列操作函数
 


1. 队列初始化
 


cvoid QueueInit(Queue* pq)
{pq->head = pq->tail = NULL;pq->size = 0;
}


 
 QueueInit  函数用于初始化一个队列,将队头和队尾指针设为  NULL ,队列大小设为  0 。
 


2. 队列销毁
 


cvoid QueueDestroy(Queue* pq)
{assert(pq);Queue* cur = pq->head;while (cur){pq->head = pq->head->next;free(cur);cur = pq->head;}pq->head = pq->tail = NULL;pq->size = 0;
}


 
 QueueDestroy  函数用于释放队列占用的内存空间。通过遍历队列,逐个释放每个节点,最后将队头、队尾指针设为  NULL ,队列大小设为  0 。
 


3. 入队操作
 


cvoid QueuePush(Queue* pq, QDatatype x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;if (pq->head == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}


 
 QueuePush  函数用于将一个元素入队。首先分配一个新节点的内存空间,若分配失败则打印错误信息并返回。然后将新节点的数据设为传入的元素值, next  指针设为  NULL 。如果队列为空,则新节点既是队头也是队尾;否则将新节点连接到队尾,并更新队尾指针。最后队列大小加  1 。
 


4. 出队操作
 


cvoid QueuePop(Queue* pq)
{assert(pq);assert(pq->head != NULL);if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}pq->size--;
}


 
 QueuePop  函数用于将队头元素出队。首先进行断言,确保队列指针有效且队列不为空如果队列只有一个元素,释放队头节点并将队头、队尾指针设为  NULL ;否则保存队头节点的下一个节点,释放队头节点,然后将队头指针指向下一个节点。最后队列大小减  1 。
 


5. 获取队头元素
 


cQDatatype QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}


 
 
 QueueFront  函数用于获取队头元素的值。先进行断言确保队列有效且不为空,然后返回队头节点的数据。
 


6. 获取队尾元素
 


cQDatatype QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}


 
 QueueBack  函数用于获取队尾元素的值。同样先进行断言确保队列有效且不为空,然后返回队尾节点的数据。
 


7. 获取队列大小
 


cint QueueSize(Queue* pq)
{return pq->size;
}QueueSize  函数直接返回队列结构体中记录的元素个数。


8. 判断队列是否为空
 


cbool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL;
}


 
 QueueEmpty  函数通过判断队头指针是否为  NULL  来确定队列是否为空,为空则返回  true ,否则返回  false 。
 


(四)主函数测试
 


cint main()
{Queue Q;QueueInit(&Q);QueuePush(&Q, 1);QueuePush(&Q, 2);QueuePush(&Q, 3);QueuePush(&Q, 4);QueuePush(&Q, 5);while (!QueueEmpty(&Q)){printf("%d ", QueueFront(&Q));QueuePop(&Q);}printf("\n");QueueDestroy(&Q);return 0;
}


 
在  main  函数中,我们对实现的队列进行了测试。首先初始化一个队列,然后依次将  1  到  5  这五个元素入队,接着通过循环不断获取队头元素并打印,同时将其出队,直到队列为空。最后销毁队列,释放内存。
 


四、总结
 


通过以上模块化的代码实现,我们完成了一个基本的队列数据结构。每个函数都有明确的功能,使得代码逻辑清晰,易于理解和维护。在实际应用中,可以根据具体需求对队列进行进一步的扩展和优化,如添加更多的操作函数或者改变数据存储类型等。

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

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

相关文章

商业智能BI的未来,如何看待AI+BI这种模式?

昨天在和一位朋友线上聊天的时候&#xff0c;提了一个问题&#xff0c;你是如何看待AI&#xff08;人工智能&#xff09;BI&#xff08;商业智能&#xff09;这种模式和方向的&#xff0c;我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业&#xff0c;…

如何制作Windows系统盘、启动盘?(MediaCreationTool_22H2)

文章目录 每日一句正能量前言一、准备工作二、制作启动盘后记 每日一句正能量 每个在你生命里出现的人&#xff0c;都有原因。喜欢你的人给你温暖关心。你喜欢的人让你学会爱和付出&#xff0c;不喜欢你的人让你自省成长。你不喜欢的人教会你宽容尊重&#xff0c;没有人是偶然出…

DataWhale 大语言模型 - 语言模型发展历程

大语言模型 LLMBook 项目背景 本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

C#带有设备仿真功能串口调试助手

本文档介绍一种方法,可以用来仿真串口设备。这样调试PLC程序时可以在没有仪器时用于测试程序的运行。详细代码见: https://download.csdn.net/download/qq_34047402/90477066 C#带有设备仿真功能串口调试助手资源-CSDN文库 步骤如下: 1.把串口设备接收和发送仿真数据放到一…

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本&#xff0c;其他的没尝试&#xff0c;如果大家系统和我的不一致&#xff0c;请自行判断&#xff0c;基本上没什么大的出入啊。 openManus的Git地址&#xff1a;https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…

01 | Go 项目开发极速入门课介绍

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课。 你好&#xff0c;欢迎学习本课程。本课程是一个 Go 项目开发极速入门课程。旨在帮助刚学习完 Go 基础语法的 Go 开发者&#xff0c;快速掌握如何开发一个功能相对全面的 Go 项目。 根据课程设计目标…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者&#xff1a;来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中&#xff0c;现在 Elastic-Agent 和 Beats 已正式支持 Debian 12&#xff01; 本文演示了我们正在开发的功能&#xff0c;以支持使用 Journald 存储系统和身份验…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

【Linux】:封装线程

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来封装线程相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

全球领先的光学方案设计公司:倚光科技

在光学技术革新的浪潮中&#xff0c;倚光&#xff08;深圳&#xff09;科技有限公司以创新者的姿态迅速崛起&#xff0c;成为全球光学领域的标杆企业。自 2021 年成立以来&#xff0c;公司始终聚焦纳米光学技术研发与超精密加工&#xff0c;凭借顶尖的技术实力和前瞻性的市场布…

2.2.3 TCP—UDP-QUIC

文章目录 2.2.3 TCP—UDP-QUIC1. TCP如何做到可靠性传输1. ACK机制2. 重传机制3. 序号机制4. 窗口机制5. 流量机制6. 带宽机制 2. tcp和udp如何选择1. tcp和udp格式对比2. ARQ协议&#xff08;Automatic Repeat reQuest&#xff0c;自动重传请求&#xff09;1. ARQ协议的主要类…

【动手实验】TCP 连接的建立与关闭抓包分析

本文是基于知识星球程序员踩坑案例分享中的作业进行的复现和总结&#xff0c;借此加深对 TCP 协议的理解&#xff0c; 原文参见TCP 连接的建立和关闭 —— 强烈建议新手看看。 实验环境 这里使用两台位于同一子网的腾讯云服务器&#xff0c;IP 分别是 node2&#xff08;172.1…

视频理解之Actionclip(论文宏观解读)

配合解读代码解读 1.研究背景 1. 视频行为识别的重要性 视频行为识别是视频理解领域的核心任务之一&#xff0c;旨在通过分析视频内容来识别和分类其中的人物行为或活动。这一任务在多个领域具有重要的应用价值&#xff0c;例如智能监控、人机交互、自动驾驶、医疗健康等。随…

基于LabVIEW的脚本化子VI动态生成

该示例展示了一种利用LabVIEW VI脚本&#xff08;VI Scripting&#xff09;技术&#xff0c;通过程序化方式动态生成并替换子VI的解决方案。核心逻辑为&#xff1a;基于预定义的模板VI&#xff0c;根据用户选择的数学操作&#xff08;加法或乘法&#xff09;&#xff0c;自动生…

Debian系统grub新增启动项

参考链接 给grub添加自定义启动项_linux grub定制 启动项名称自定义-CSDN博客 www.cnblogs.com 1. boot里面的grub.cfg 使用vim打开boot里面的grub.cfg sudo vim /boot/grub/grub.cfg 这时候会看到文件最上方的提示 2. 真正配置grub的文件 从刚才看到的文件提示中&#x…

ctfhub-web-SSRF通过攻略

1.URL Bypass 打开题目 请求的URL中必须包含http://notfound.ctfhub.com&#xff0c;使用来绕过即可 /?urlhttp://notfound.ctfhub.com127.0.0.1/flag.php 成功获得flag 2.数字IP Bypass 开启题目 发现127以及172被过滤了 尝试别的绕过 127.0.0.1–>localhost 127.0…

C语言(23)

字符串函数 11.strstr函数 1.1函数介绍&#xff1a; 头文件&#xff1a;string.h char *strstr ( const char * str1,const char *str2); 作用&#xff1a;在一个字符串&#xff08;str1&#xff09;中寻找另外一个字符串&#xff08;str2&#xff09;是否出现过 如果找到…

uniapp+Vue3 组件之间的传值方法

一、父子传值&#xff08;props / $emit 、ref / $refs&#xff09; 1、props / $emit 父组件通过 props 向子组件传递数据&#xff0c;子组件通过 $emit 触发事件向父组件传递数据。 父组件&#xff1a; // 父组件中<template><view class"container">…

晨控CK-FR08与汇川H5U系列PLC配置EtherNet/IP通讯连接手册

晨控CK-FR08与汇川H5U系列PLC配置EtherNet/IP通讯连接手册 晨控CK-FR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围…

BLDC直流无刷电机转速电流双闭环调速MATLAB仿真

微♥&#xff1a;“电击小子程高兴的MATLAB小屋”获取巨额优惠 1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.仿真算法&#x…