C语言——队列的实现

        队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加到队列的尾部;出队(dequeue),从队列的头部移除元素。

        如果用顺序表实现队列,在删除队头数据时,需要后面的数据覆盖前面的数据,比较麻烦,所以采用链表,头删尾插代替出队和入队。但是如果用链表实现的话,寻找队尾入队还需要一直 ->next ,所以干脆我们就记录下头指针和尾指针方便头山尾插。

首先就是定义每个节点的结构体和定义队列的结构体:

struct QueueList {
	int val;
	struct QueueList* next;
};
struct Queue {
	struct QueueList* head;
	struct QueueList* tail;
};

        这里用QueueNode命名第一个结构体更好,因为我们要记录头尾指针,所以Queue结构体就有头尾两个指针。

接下来是初始化函数和销毁函数;

void QueueInit(struct Queue* list) {
	list->head = NULL;
	list->tail = NULL;
}
void QueueDes(struct Queue* list) {
	while (list->head!=list->tail)
	{
		struct QueueList* next = list->head->next;
		free(list->head);
		list->head = next;
	}
	free(list->head);
	list->head = list->tail = NULL;
}

        初始化函数让list的头指针和尾指针都置为空,销毁函数,如果头尾指针相等,有两种情况,一种是空队列,这时 free(NULL) ,还可以是只有一个元素,头尾指针都指向这个元素,这时free掉,然后指针置空,所以不会有野指针或者free错误的情况。

然后是入队出队函数:

void QueuePushBack(struct Queue* list,int num) {
	if (list->head == list->tail && list->head == NULL) {
		list->head = list->tail = malloc(sizeof(struct QueueList));
		list->head->val = num;
		list->tail->next = NULL;
	}
	else if (list->head == list->tail) {
		list->tail = malloc(sizeof(struct QueueList));
		list->tail->val = num;
		list->tail->next = NULL;
		list->head->next = list->tail;
	}
	else {
		struct QueueList* tail_pre = list->tail;
		list->tail = malloc(sizeof(struct QueueList));
		list->tail->val = num;
		list->tail->next = NULL;
		tail_pre->next = list->tail;
	}
}
int QueueFrontPop(struct Queue* list) {
	struct QueueList* new_head = list->head->next;
	int val = list->head->val;
	free(list->head);
	list->head = new_head;
	return val;
}

        对于尾插函数,头尾指针相等时有可能是空队列也有可能是只创建了一个元素,所以要分开讨论,简单逻辑就是让尾节点的next指向新开辟的节点,然后更新尾指针使新开辟的节点变为尾指针,最后让尾节点的next置为NULL。

        对于头删Pop函数,就是先存头节点下一个节点的地址然后free掉头节点,更新头指针,返回数值。

最后是打印函数方便我们观察:

void QueuePrint(struct Queue* list) {
	struct QueueList* cur = list->head;
	while (cur != NULL) {
		printf("%d ", cur->val);
		cur = cur->next;
	}
}

这就是文章的全部内容,希望对你有所帮助,如有错误欢迎评论。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DSP实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台

6U CPCI振动数据DSP实时分析平台 一、产品概述 基于CPCI结构完成40路AD输入,30路DA输出的信号处理平台,处理平台采用双DSPFPGA的结构,DSP采用TI公司新一代DSP TMS320C6678,FPGA采用Xilinx V5 5VLX110T-1FF1136芯片&#xff…

《QT实用小工具·五十》动态增删数据与平滑缩放移动的折线图

1、概述 源码放在文章末尾 该项目实现了带动画、带交互的折线图,包含如下特点: 动态增删数值 自适应显示坐标轴数值 鼠标悬浮显示十字对准线 鼠标靠近点自动贴附 支持直线与平滑曲线效果 自定义点的显示类型与大小 自适应点的数值显示位置 根据指定锚点…

java并发编程-AQS介绍及源码详解

介绍 AQS 的全称为 AbstractQueuedSynchronizer ,就是抽象队列同步器。 从源码上可以看到AQS 就是一个抽象类,它继承了AbstractOwnableSynchronizer,实现了java.io.Serializable接口。 public abstract class AbstractQueuedSynchronizere…

redis缓存详情

redis安装包及图形化软件: 百度链接:https://pan.baidu.com/s/1wljo7JzgrSQyqldv9d5HZA?pwdht1m 提取码:ht1m 目录 1.redis的下载及安装 1.1redis的启动与停止 1.2Redis服务启动与停止 2.redis数据类型及常用指令 2.1redis数据类型 2.2redis常用…

读天才与算法:人脑与AI的数学思维笔记15_声响的数学之旅

1. 音乐 1.1. 巴赫的作品以严格的对位著称,他十分中意对称的结构 1.2. 巴托克的作品很多都以黄金比例为结构基础,他非常喜欢并善于使用斐波纳契数列 1.3. 有时,作曲家是本能地或者不自知地被数学的模式和结构所吸引,而他们并没…

Golang | Leetcode Golang题解之第61题旋转链表

题目: 题解: func rotateRight(head *ListNode, k int) *ListNode {if k 0 || head nil || head.Next nil {return head}n : 1iter : headfor iter.Next ! nil {iter iter.Nextn}add : n - k%nif add n {return head}iter.Next headfor add > …

【项目构建】04:动态库与静态库制作

OVERVIEW 1.编译动态链接库(1)编译动态库(2)链接动态库(3)运行时使用动态库 2.编译静态链接库(1)编译静态库(2)链接静态库(3)运行时使…

matlab学习007-已知离散时间系统的系统函数并使用matlab绘制该系统的零极点图;判断系统的稳定性;幅频和相频特性曲线

目录 题目 离散时间系统的系统函数:H(z)(3*z^3-5*z^210z)/(z^3-3*z^27*z-5) 1,绘制该系统的零极点图 1)零极点图 2)代码 2,判断系统的稳定性 1)判断结果 2)代码 3,试用MATL…

C++的未来之路:探索与突破

在计算机科学的浩瀚星空中,C无疑是一颗璀璨的明星。自诞生以来,它以其强大的性能和灵活的特性,赢得了无数开发者的青睐。然而,随着技术的不断进步和应用的日益复杂,C也面临着前所未有的挑战和机遇。本文将探讨C的未来之…

腾锐D2000-8 MXM VPX,全国产,可广泛应用于边缘计算网关、入侵检测、VPN、网络监控等等应用领域

腾锐D2000-8 MXM VPX 1. 概述 XMVPX-108 是一款基于飞腾 D2000/8 处理器的低功耗逻辑运算和图形处理 VPX 刀片, 板贴 32GB DDR4 内存,搭载飞腾 X100 套片,满足通用 IO 接口功能。GPU 采用 MXM 小型插卡形式, 搭配 8GB 显卡。提供…

【16-降维技术:PCA与LDA在Scikit-learn中的应用】

文章目录 前言主成分分析(PCA)原理简介Scikit-learn中的PCA实现应用示例线性判别分析(LDA)原理简介Scikit-learn中的LDA实现应用示例总结前言 降维是机器学习中一种常见的数据预处理方法,旨在减少数据集的特征数量,同时尽量保留原始数据集的重要信息。这不仅有助于减少计…

开箱子咸鱼之王H5游戏源码_内购修复优化_附带APK完美运营无bug最终版__GM总运营后台_附带安卓版本

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 1.包括原生打包APK,资源全部APK本地化,基本上不跑服务器宽带 2.优化后端,基本上不再一直跑内存,不炸服响应快! 3.优化前端&#xff0c…

【源码阅读】Golang中的go-sql-driver库源码探究

文章目录 前言一、go-sql-driver/mysql1、驱动注册:sql.Register2、驱动实现:MysqlDriver3、RegisterDialContext 二、总结 前言 在上篇文章中我们知道,database/sql只是提供了驱动相关的接口,并没有相关的具体实现,具…

NLP 笔记:TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种用于信息检索和文本挖掘的统计方法,用来评估一个词在一组文档中的重要性。TF-IDF的基本思想是,如果某个词在一篇文档中出现频率高&#xff0…

不坑盒子2024.0501版,Word朗读、Word表格计算、Word中代码高亮显示行号、Excel中正则提取内容……

通过“听”来审阅Word中的内容,能轻松找出那些容易被眼看忽视的错字。 不坑盒子2024.0501版来了,很多奇妙的事情,正在发生…… 功能一览 此版本共带来10余项变动,来看看有没有你感兴趣的吧~ 接入Azure的“语音”能力 接入“语…

Flutter笔记:Widgets Easier组件库(3)使用按钮组件

Flutter笔记 Widgets Easier组件库(3):使用按钮组件 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddre…

C语言之详细讲解文件操作(抓住文件操作的奥秘)

什么是文件 与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等。文件通常具有点三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以KPEG格式保存并且文件…

JDBC连接MySQL8 SSL

1.创建用户并指定ssl连接 grant all on . to test% identified by imooc require SSL(X509); 2.查看是否使用ssl SELECT ssl_type From mysql.user Where user"test" 3.配置用户必须使用ssl ALTER USER test% REQUIRE SSL(X509); FLUSH PRIVILEGES; 注意&#xff…

Ollamallama

Olllama 直接下载ollama程序,安装后可在cmd里直接运行大模型; llama 3 meta 开源的最新llama大模型; 下载运行 1 ollama ollama run llama3 2 github 下载仓库,需要linux环境,windows可使用wsl; 接…

mac如何打开exe文件?如何mac运行exe文件 如何在Mac上打开/修复/恢复DMG文件

在macOS系统中,无法直接运行Windows系统中的.exe文件,因为macOS和Windows使用的是不同的操作系统。然而,有时我们仍然需要运行.exe文件,比如某些软件只有Windows版本,或者我们需要在macOS系统中运行Windows程序。 虽然…
最新文章