[c语言]数据结构之用单链表实现队列

C语言中常见的数据结构及其代码实现 本文介绍了C语言中五种常见数据结构的实现方法,包括队列(FIFO)、堆栈(LIFO)、单链表、双链表和二叉树。每种数据结构都提供了基础操作的完整代码实现,如初始化、插入、删除和遍历等。其中队列和堆栈采用数组实现,链表和二叉树采用动态内存分配。代码示例包含详细的注释和测试用例,展示了数据结构的基本特性和操作方法。这些实现可作为C语言数据结构学习的参考模板。 阅读详情

简介

本文将用链表的形式实现队列的基础接口功能:
1.初始化/销毁
2.增加/删除
还实现了返回队首元素的值,返回队列元素个数,以及判断队列是否为空

在这里插入图片描述
  上图是队列的简单描述,队列遵循的规律是只能从队尾进队,出队只能从队首出队,这就意味着删除和插入元素简单了许多。
  用两个指针分别指向队首元素以及队尾元素,这样就才能对相应的结点进行操作。
  下面是代码的实现
头文件Queue.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdlib.h>
//用链表实现队列
//定义数据类型
typedef int QDataType;

//定义链表队列结点
typedef struct QNode{
	 QDataType val;
	 struct QNode *next;
} QNode;

//队列
typedef struct Queue{
	 int size; //队列元素个数
	 QNode *front;//指向队列第一个元素,如果队列为空,则等于NULL
	 QNode *rear;//指向队列最后一个元素,如果队列为空,则等于NULL
} Queue;

//初始化
void QueueInit(Queue *queue);

//销毁
void QueueDestroy(Queue *queue);

//插入,由于是队列,只能从队尾插结点
void QueuePush(Queue *queue, QDataType val);

//删除,只能从队首删
void QueuePop(Queue *queue);

//返回队首结点的值
QDataType QueueFront(const Queue *queue);

//判断队列是否为空,为空返回1,不空返回0
int QueueEmpty(const Queue *queue);

//返回队列结点的个数
int QueueSize(const Queue *queue);

//打印
void QueuePrint(const Queue *queue);

函数实现部分Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
//初始化
void QueueInit(Queue *queue)
{
	 queue->front = queue->rear = NULL;
	 queue->size = 0;
}

//销毁
void QueueDestroy(Queue *queue)
{
	 //队内如果有元素,就先释放
	 QNode *next;
	 for (QNode *cur = queue->front; cur != NULL; cur = next)
	 {
		  next = cur->next;
		  free(cur);
	 }
	 queue->front = queue->rear = NULL;
	 queue->size = 0;
}

//插入
void QueuePush(Queue *queue, QDataType val)
{
	 //先创建结点
	 QNode *node = (QNode *)malloc(sizeof(QNode));
	 assert(node != NULL);
	 node->val = val;
	 node->next = NULL;
	 queue->size++;
	 //再判断队列是否为空
	 if (queue->rear == NULL)
	 {
	 	 queue->front = queue->rear = node;
	 }
	 else
	 {
	 	 queue->rear->next = node;
	 	 queue->rear = node;
	 }
}
	
//删除
void QueuePop(Queue *queue)
{
	 assert(queue->rear != NULL);//确保队列不为空
	 queue->size--;
	 QNode *old_front = queue->front;
	 queue->front = queue->front->next;
	 free(old_front);
	 //如果删完队列空了的话,就要设置rear的指向NULL
	 if (queue->front == NULL)
	 {
	 	 queue->rear = NULL;
	 }
}
	
//返回队首结点的值
QDataType QueueFront(const Queue *queue)
{
	 assert(queue->size > 0);
	 return queue->front->val;
}

//判断队列是否为空,为空返回1,不空返回0
int QueueEmpty(const Queue *queue)
{
	 return queue->size == 0 ? 1 : 0;
}

//返回队列结点的个数
int QueueSize(const Queue *queue)
{
	 return queue->size;
}

void QueuePrint(const Queue *queue)
{
	 for (QNode *cur = queue->front; cur != NULL; cur = cur->next)
	 {
	 	 printf("%d-->", cur->val);
	 }
	 printf("\n");
}

测试部分test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
#include<stdio.h>
#include<stdlib.h>
void test()
{
	 Queue queue;
	 QueueInit(&queue);
	 QueuePush(&queue, 1);
	 QueuePush(&queue, 2);
	 QueuePush(&queue, 3);
	 QueuePush(&queue, 4);
	 QueuePush(&queue, 7);
	 QueuePrint(&queue);
	
	 QueuePop(&queue);
	 QueuePrint(&queue);
	
	 printf("%d", QueueFront(&queue));//输出队首元素
	 printf("\n");
	 printf("%d", QueueEmpty(&queue));//判断是否为空,为空输出1,不空输出0
	 printf("\n");
	 printf("%d", QueueSize(&queue));//输出队列元素个数
	 printf("\n");
	 QueueDestroy(&queue);
}
int main()
{
	 test();
	 system("pause");
	 return 0;
}

ps:欢迎讨论以及批评指正


【系统分析师】2026年上半年真题:案例分析-答案及详解(回忆版) 案例一聚焦因果分析法(鱼骨图)的应用,分析企业订单履约问题。问题1阐述因果分析法定义及常见方法(鱼骨图、5个为什么等);问题2将8个原因归类为人员、方法、合同等5类;问题3筛选适合鱼骨图的场景(如系统响应慢、服务器故障等),强调其适用于复杂根因分析。 案例二对比嵌入式系统中Linux与RTOS的差异(实时性、资源占用等),结合智能监控终端需求推荐Linux+四核ARM方案(高算力、性价比),并列选Linux的5大优势(生态成熟、多任务支持等)。 案例三设计互联网医院系统用例图(患者、医生等参与 阅读详情

相关推荐

从零开始学习信号完整性(SIPI)--2

上一节我们已经谈过,信号完整性研究的是如何使驱动器输出的信号传输到接收器件并被正确的接收。 信号完整性的三要素包含了:信号、驱动接收芯片、传输通道。 这其中信号是主体,我们要做的主要工作就是设计好信号的传输路径为信号的正确传输扫清障碍。要做信号完整性分析与设计首先要了解信号的特性,以及信号质量的判别标准。 对一个信号进行描述通常需要如下几个指标: 信号特性的描述 摆幅:信号从低电平到高电平之间的电压差,对于单端信号通常由信号的供电电压决......

qq_29476769的博客 2万+

蓝桥训练5

一、队列操作 问题描述   队列操作题。根据输入的操作命令,操作队列(1)入队、(2)出队并输出、(3)计算队中元素个数并输出。 输入格式   第一行一个数字N。   下面N行,每行第一个数字为操作命令(1)入队、(2)出队并输出、(3)计算队中元素个数并输出。 输出格式   若干行每行显示一个2或3命令的输出结果。注意:2.出队命令可能会出现空队出队(下溢),请输出“no”,并...

qq_42569807的博客 382

TK抓包协议分析:So层逆向

第三个参数是一个回调函数,这里他的返回值1表示成功,0表示失败,那我们手动把他Hook为0,让他不支持quic协议,实现降级。等,我们是为了解决抓包问题,那很有可能是在net目录下(network),那来搜索一下。开了抓包以后APP直接是网络无连接了,并且抓到的请求也是不正常的,下面我们就开始定位。看了半天感觉也没啥有用的东西,那下面我们整理一下已经有信息,来猜测一下,后续怎么进行。那可以猜测,我们真正需要Hook的那个函数也有可能是这样加载的,可以字符串搜索一下。

2503_90751938的博客 3417

2.5 【队列操作】根据输入的操作命令,操作队列:1入队、2出队并输出、3计算队中元素个数并输出。1<N <50

文章目录题目描述输入描述输出描述输入输出样例最终代码1. c/c++2. java3. python过程理解 题目描述 根据输入的操作命令,操作队列: 1入队 2出队并输出 3计算队中元素个数并输出。1<N <50 输入描述 第一行一个数字N。 接下来N行,每行第一个数字为操作命令:1入队、2出队并输出、3计算队中元素个数并输出。 输出描述 若干行每行显示一个2或3命令的输出结果。注意:2.出队命令可能会出现队出队(下溢),请输出"no",并退出。 输入输出样例 输入: 7 1 19

你说的白是什么白_ 3629

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1679

Nvidia Isaac Sim图形界面 入门教程 2024(3)

在使用Isaac Sim时,最先接触到的应该是它的图形界面,此处将简单介绍图形界面中常用的一些组件:Isaac Sim的界面的常用内容可以分为几个板块。

m0_56661101的博客 4546

Python:每日一题之队列操作(queue、list、deque)

接下来 N 行,每行第一个数字为操作命令:1入队、2 出队并输出、3 计算队中元素个数并输出。2.出队命令可能会出现空队出队(下溢),请输出“no”,并退出。poplift:出队,从队头删除一个元素并返回该元素。appendleft:入队,从队列左端(队头)插入。pop:出队,从队尾删除一个元素并返回该元素。append:入队,从队列右端(队尾)插入。q.get(),从队头删除,并返回。q.empty(),队列是否为空。q.append(),从队尾插入。q.put (),从队尾插入。len(q)队列大小。

qq_65144447的博客 1448

RK3568 开发实战:手动构建 Linux 4.19 内核镜像与设备树优化

本文详细介绍了为RK3568开发板手动编译Linux 4.19内核的完整实战流程。从环境搭建、源码获取、内核配置,到设备树深度定制与优化,再到镜像打包与烧写,旨在帮助开发者脱离官方SDK依赖,实现对嵌入式Linux系统的完全掌控,提升硬件适配与性能优化能力。

weixin_29175469的博客 269

蓝桥杯精选赛题系列——队列操作

题目描述 根据输入的操作命令,操作队列:1 入队、2 出队并输出、3 计算队中元素个数并输出。1≤N≤50。 输入描述 第一行一个数字 N。 接下来 N 行,每行第一个数字为操作命令:1入队、2出队并输出、3 计算队中元素个数并输出。 输出描述 若干行每行显示一个 2 或 3 命令的输出结果。注意:2.出队命令可能会出现空队出队(下溢),请输出“no”,并退出。 输入输出样例 示例 输入 7 1 19 1 56 2 3 2 3 2 输出 19 1 56 0 no 运行限制 最大运行时间:1s 最大运

wzy的博客 1647

EDKII环境配置完整版

参考博客【EDK2 UDK2018的环境搭建】:https://blog.youkuaiyun.com/qq_39155263/article/details/82965744下载EDK2 1.直接从https://github.com/tianocore/edk2/ 网站下载.zip压缩文件 2.运用svn 从http://svn.code.sf.net/p/edk2/code/trunk/edk2edk2下载 3.安装Visual Studio2017 安装其他Tool 1.IASL 从https..

tianpu2320959696的博客 1852

YOLOv8改进策略【Backbone/主干网络】| 2023 U-Net V2 替换骨干网络,加强细节特征的提取和融合

一、本文介绍 本文记录的是基于U-Net V2的YOLOv8目标检测改进方法研究。本文利用U-Net V2替换YOLOv8的骨干网络,UNet V2通过其独特的语义和细节融合模块(SDI),能够为骨干网络提供更丰富的特征表示。并且其中的注意力模块可以使网络聚焦于图像中与任务相关的区域,增强对关键区域特征的提取,进而提高模型精度。本文配置了原论文中pvt_v2_b0、pvt_v2_b1、pvt_v2_b2、pvt_v2_b3、pvt_v2_b4和pvt_v2_b5六种模型,以满足不同的需求。 文章目录一、本文

Limiiiing的博客 1721

蓝桥杯-算法提高-队列操作

问题描述   队列操作题。根据输入的操作命令,操作队列(1)入队、(2)出队并输出、(3)计算队中元素个数并输出。 输入格式   第一行一个数字N。   下面N行,每行第一个数字为操作命令(1)入队、(2)出队并输出、(3)计算队中元素个数并输出。 输出格式   若干行每行显示一个2或3命令的输出结果。注意:2.出队命令可能会出现空队出队(下溢),请输出“no”,并退出。 样例输入

obession的博客 679

A2A 协议详解:Agent Card 的设计与实现

Agent Card 是 Agent2Agent (A2A) 协议中实现智能体发现与互操作性的核心组件。本文将深入剖析 Agent Card 的设计理念、关键字段及其在智能体生态系统中的作用。我们将通过详细的 JSON Schema 解析和 Python SDK 示例,帮助您理解如何精确地定义和发布智能体能力,为构建可发现、可协作的 AI 智能体奠定基础。当您使用a2a.Agent类初始化一个智能体时,SDK 会根据您提供的参数(nameversion等)自动构建内部的 Agent Card 表示。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1476

【算法与数据结构】 C语言实现单链表队列详解

前面我们学习了队列的顺序表的实现,本节将用单链表实现队列。 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。下面我们先复习一下队列的基本概念: 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 首先,我们需要定义队列节点的数据结构和队列的数据结构: 当我们去定义队列的出队和入

a_sen的博客 2592

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数据结构(c语言) 单链表 中缀表达式转换与计算 循环队列的实现 舞伴问题

数据结构

mystery27的博客 1139

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C语言-数据结构-用单链表实现队列

用顺序表实现栈

linkang007的博客 650

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构-单链表模拟实现循环队列(c语言实现)

1.

weixin_59799963的博客 1999

(数据结构)C语言实现单链表队列

参考:https://blog.youkuaiyun.com/juanqinyang/article/details/51354293 temp = (Node *)malloc(sizeof(Node));这句要特别注意,我看很多人是用Queue去强制性转换malloc申请的空间地址的,即,temp = (Queue *)malloc(sizeof(Node));,个人觉得这是错误的。 另外,有人初始化...

天泉证道 1558

C语言数据结构编程练习-通过单链表实现队列的操作

【代码】C语言数据结构编程练习-通过单链表实现队列的操作。

jhbuy的博客 282

C语言实现队列(链表)

C语言实现队列 &amp;nbsp; 原理: 通过单链表实现的队列,队列就是一个尾插头删的单链表,先实现一个链表 ,再实现一个队列包括队头指针和队尾指针 图 头文件 #ifndef Queue_h #define Queue_h #include &amp;lt;stdio.h&amp;gt; typedef int QDataType; //数据类型 typedef struct ListNode //通...

Ruichen_L的博客 4517

【数据结构】栈和队列

数据结构中的栈和队列

m0_62531913的博客 2498

C语言队列的实现

C语言利用单链表实现队列的先进先出操作。难点在数据结构的使用。 代码如下: #include<stdio.h> #include<stdlib.h> typedef int elemtype, QElemType; #define OVERFLOW 0 typedef struct link { elemtype data; link *next; }link,*QueuePtr; typedef struct linkqu

a1561216的博客 1638

队列的实现

队列的链式实现(单链表) #include <stdio.h> struct queue //队列节点信息 { int val; struct queue *next; }; typedef struct queue Queue; static int queue_len = 0; //计算队列长度 Queue *front, *rear, *head; ...

qq_43499599的博客 186

数据结构与算法:队列-单链表实现(c语言实现,带详细注释)

数据结构与算法:队列-单链表实现(c语言实现,带详细注释)

yuride的博客 201

C语言 ,单链表实现队列(初始化,入队,出队,元素个数,队首元素,是否为空)

单链表实现队列: 链表为空的判断条件:pQueue-&gt;pFront==pQueue-&gt;pRear或者若结构体中存在数的个数时,判断pQueue-&gt;size==0,即元素个数为0 头文件:队列.h #pragma once #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; //利用单链表实现队列 //函数接口 : type...

xinger_28的博客 2008

数据结构:单链表实现队列

1、队列示意图: 2、单链表实现队列的存储结构: 3、C语言实现: (1)lqueue.h: #pragma once //利用带头节点的单链表实现队列,队头为第一个数据节点 typedef struct Node { int data; struct Node *next; }Node;//数据节点 typedef struct HNode { str...

yy_0733的博客 338
上一篇: [C语言]数据结构之双向链表
下一篇: Linux进程调度之 大O(1)调度算法
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值