链表形式队列

news2024/11/14 15:15:51

🌈队列相关概念

1.储存了数据的节点从一端(队尾)进入队列(入队尾插),从另一端(队头)出队列(出队头删),先进先出。进行插入操作的一端称为队尾,进行进行删除操作的一端称为队头。在这里插入图片描述在这里插入图片描述
2.用途:由于先进先出的功能,链队列可以用来历史重演,如排队叫号(先到的人先被叫到)。(栈结构由于后进先出的功能,可以用来历史的回溯,比如撤销上一秒操作的内容)

🌈链队列基础框架

🎈Queue.h定义声明

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

typedef int DataType;
typedef struct Node {
	DataType data;
	struct Node* next;
}Node;
typedef struct Queue {
	Node* head;
	Node* tail;
	int size;
}Queue;

void InitQueue(Queue* pq);
void Destroy(Queue* pq);
void Push(Queue* pq, DataType x);
void Pop(Queue* pq);
DataType Front(Queue* pq);
void Display(Queue* pq);

🎈Queue.c函数实现

☀️初始化:InitQueue()

#define _CRT_SECURE_NO_WARNINGS
#include"Queue.h"
void InitQueue(Queue* pq) {
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}


☀️销毁:Destroy()

void Destroy(Queue* pq) {
	assert(pq);
	if (pq->head) {
		Node* cur = pq->head->next;
		while (cur) {
			Node* next = cur->next;
			free(cur);
			cur = next;
		}
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

☀️入队:Push()

void Push(Queue* pq, DataType x) {
	assert(pq);
	Node* newnode = (Node*)malloc(sizeof(Node));
	newnode->data = x;
	newnode->next = NULL;
	if (!newnode) {
		perror("malloc fail");
		exit(-1);
	}
	//首次入队
	if (pq->tail == NULL) {
		pq->head = pq->tail = newnode;
	}
	//非首次入队,对头是有元素的
	else {
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

☀️出队:Pop()

void Pop(Queue* pq) {
	assert(pq);
	//当头指针与尾指针重合,说明队内只剩一个元素,该元素出队后,队列回到初始化状态(头尾指针都为空)
	if (pq->head == pq->tail) {
		pq->head = pq->tail = NULL;
	}
	else {
		Node* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
	pq->size--;
}

☀️得到队头元素:Front()

DataType Front(Queue* pq) {
	assert(pq);
	assert(pq->tail);
	return pq->head->data;
}

☀️打印整个队列:Display()

void Display(Queue* pq) {
	assert(pq);
	Node* cur = pq->head;
	while (cur) {
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL");
}

🎈test.c主函数,测试

#define _CRT_SECURE_NO_WARNINGS
#include"Queue.h"
int main() {
	Queue Q;
	InitQueue(&Q);

	DataType data = 1;
	Push(&Q, data);
	data = 2;
	Push(&Q, data);
	data = 3;
	Push(&Q, data);
	data = 4;
	Push(&Q, data);
	Display(&Q);
	printf("\n");

	DataType del = Front(&Q);
	Pop(&Q);
	Display(&Q);
	printf(" 出队元素是%d\n", del);
	del = Front(&Q);
	Pop(&Q);
	Display(&Q);
	printf(" 出队元素是%d\n", del);
	del = Front(&Q);
	Pop(&Q);
	Display(&Q);
	printf(" 出队元素是%d\n", del);
	del = Front(&Q);
	Pop(&Q);
	Display(&Q);
	printf(" 出队元素是%d\n", del);

	Destroy(&Q);
}

☀️测试运行结果:

在这里插入图片描述

🌈用链队列形式实现学生信息的入队与出队

🎈Queue.h定义声明

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef struct student {
	int age;
	int height;
	double weight;
}Student;
typedef struct Node {
	Student stu;
	struct Node* next;
}Node;
typedef struct Queue {
	Node* head;
	Node* tail;
	int size;
}Queue;

void InitQueue(Queue* pq);
void Destroy(Queue* pq);
void GetVal(Student* stu);
Node* CreateNode(Student* stu);
void Push(Queue* pq, Student* stu);
void Pop(Queue* pq);
void PrintNode(Student* stu);
void Display(Queue* pq);

🎈Queue.c函数实现

#define _CRT_SECURE_NO_WARNINGS
#include"Queue.h"
void InitQueue(Queue* pq) {
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

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

void GetVal(Student* stu) {
	printf("请输入学生年龄、身高、体重:");
	scanf("%d %d %lf", &stu->age, &stu->height, &stu->weight);
}

Node* CreateNode(Student* stu) {
	GetVal(stu);
	Node* newnode = (Node*)malloc(sizeof(Node));
	if (!newnode) {
		perror("malloc fail");
		exit(-1);
	}
	newnode->stu.age = stu->age;
	newnode->stu.height = stu->height;
	newnode->stu.weight = stu->weight;
	//newnode->stu = *stu;
	newnode->next = NULL;
	return newnode;
}

void Push(Queue* pq, Student* stu) {
	assert(pq);
	Node* newnode = CreateNode(stu);
	if (pq->tail == NULL) {
		pq->head = pq->tail = newnode;
	}
	else {
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

void Pop(Queue* pq) {
	assert(pq);
	if (!pq->head)return;
	else if (pq->head == pq->tail) {
		pq->head = pq->tail = NULL;
		pq->size = 0;
	}
	else{
		Node* newhead = pq->head->next;
		free(pq->head);
		pq->head = newhead;
		pq->size--;
	}
}

void PrintNode(Student* stu) {
	assert(stu);
	printf("年龄:%-5d 身高:%-5d 体重:%-5lf", stu->age, stu->height, stu->weight);
}

void Display(Queue* pq) {
	assert(pq);
	Node* cur = pq->head;
	if (!cur)printf("队列中无信息\n");
	while (cur) {
		PrintNode(&cur->stu);
		printf("\n");
		cur = cur->next;
	}
}

🎈test.c主函数,测试

#define _CRT_SECURE_NO_WARNINGS
#include"Queue.h"
int main() {
	Queue Q;
	InitQueue(&Q);
	Student stu;
	Push(&Q, &stu);
	Push(&Q, &stu);
	Push(&Q, &stu);
	Display(&Q);

	Student del = Q.head->stu;
	Pop(&Q);
	printf("出队的一组数据是:");
	PrintNode(&del);
	printf("\n");
	del = Q.head->stu;
	Pop(&Q);
	printf("出队的一组数据是:");
	PrintNode(&del);
	printf("\n");
	del = Q.head->stu;
	Pop(&Q);
	printf("出队的一组数据是:");
	PrintNode(&del);
	printf("\n");

	Destroy(&Q);
}

🎈测试运行结果:

在这里插入图片描述

注意:scanf的占位符只能写类似"%d %lf"等等,不能写"%-5d",否则会导致数据存储不到目的空间,并且数据与数据间用什么符号隔开,在输入数据时就要严格用同样符号隔开。只有在使用printf函数并且需要调整数据打印出的位置时才用类似"%-5d"。以下是scanf占位符书写有误时的运行结果:
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试Day4|软件测试理论02

目录 6. 测试用例基础6.1 测试用例的定义6.2 测试用例要素6.3 测试用例设计和编写的作用 7. 黑盒测试用例设计方法7.1 用例设计方法分类7.2 测试数据选择7.2.1 等价类划分&#xff08;1&#xff09;等价类划分原理&#xff08;2&#xff09;确定等价类的原则&#xff08;3&…

群晖DS923+扩展ECC 64G内存

1 有必要上64G吗&#xff1f; 如果你不运行大型应用以及安装的套件不多&#xff0c;并且不使用虚拟机&#xff0c;确实没有太大必要。 但是大内存除了这些用处&#xff0c;还会被系统作为缓存使用。在资源监控中查看内存结构&#xff0c;虽然内存利用率只有4%&#xff0c;但缓存…

企业供应链数字化怎么做?企业数字化供应链流程落地方式

什么是供应链&#xff1f;简单来说&#xff0c;供应链是围绕客户需求&#xff0c;以提高产品流通各个环节的效率为目标&#xff0c;通过资源整合的方式来实现产品从设计、生产到销售、服务整个环节的组织形态。如同人工智能、区块链、5G等技术的发展带来的各种行业变化&#xf…

mov怎么改成mp4?跟我一起操作吧

mov怎么改成mp4&#xff1f;mov因为并不是一种常见的视频文件格式&#xff0c;因此大家对这种视频文件可能知道的并不多&#xff0c;但如果你是用的是苹果手机&#xff0c;那么你会发现苹果手机拍摄的视频转移到电脑上后就是mov格式的&#xff0c;因为mov格式的视频并没有受到大…

运算放大器典型应用(一)

这里写目录标题 一、反向比例运算电路怎么优化&#xff1f;平衡电阻的讨论 二、同向比例运算电路三、电压跟随器重要事项 四、加法运算电路反向加法同向加法 五、减法运算电路专用减法器 六、积分电路微分电路七、对数指数运算电路八、测量放大电路&#xff08;仪表放大电路&am…

低代码概念——初步认识低代码

随着数字化转型和软件需求的不断增长&#xff0c;传统的手写代码开发方式已经无法满足迅速推出应用程序的需求。为了加快软件开发的速度并降低技术门槛&#xff0c;低代码开发模式应运而生。 一、低代码的定义 低代码是一种软件开发方法&#xff0c;通过使用可视化编程工具和少…

webpack(三)loader

定义 loader用于对模块的源代码进行转换&#xff0c;在imporrt或加载模块时预处理文件 webpack做的事情&#xff0c;仅仅是分析出各种模块的依赖关系&#xff0c;然后形成资源列表&#xff0c;最终打包生成到指定文件中。 在webpack内部&#xff0c;任何文件都是模块&#x…

堆的 shift up(Java 实例代码)

目录 堆的 shift up Java 实例代码 src/runoob/heap/HeapShiftUp.java 文件代码&#xff1a; 堆的 shift up 本小节介绍如何向一个最大堆中添加元素&#xff0c;称为 shift up。 假设我们对下面的最大堆新加入一个元素52&#xff0c;放在数组的最后一位&#xff0c;52大于父…

蓝桥杯 2240. 买钢笔和铅笔的方案数c++解法

最近才回学校。在家学习的计划不翼而飞。但是回到学校了&#xff0c;还是没有找回状态。 现在是大三了&#xff0c;之前和同学聊天&#xff0c;说才大三无论是干什么&#xff0c;考研&#xff0c;找工作&#xff0c;考公&#xff0c;考证书 还都是来的及的。 但是心里面…

深度刨析数据在内存中的存储

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 深度刨析数据在内存中的存储 1.数据类型介绍1.1 类型的基本归类 2.整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍 3.浮点型在内存中的存储3.1 一个例子3.2 浮点数的存储规则3.3指数…

树和二叉树基础

引言&#xff1a; 树是一种非线性的结构&#xff0c;也是由一个一个的结点构成。 树的一些基本概念&#xff1a; 节点的度&#xff1a;一个节点含有的子树的个数称为该节点的度&#xff1b;如上图&#xff1a;A的度为6 叶节点或终端节点&#xff1a;度为0的节点称为叶节点。…

聊天机器人将取代人工客服?电商界的超级“贵人”

聊天机器人在全球范围内取得了成功&#xff0c;目前有58%的 B2B公司和42%的 B2C公司使用聊天机器人&#xff0c;而且这个数字预计还会继续增长。原因有很多&#xff0c;聊天机器人能够模拟人类交互并每天 24小时提供客户服务。当客户有疑问时&#xff0c;不用等上几小时才能得到…

【RabbitMQ】RabbitMQ 服务无法启动。系统出错。发生系统错误 1067。进程意外终止。

问题描述 RabbitMQ 服务无法启动。 rabbitmq-service.bat startRabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。系统出错。发生系统错误 1067。进程意外终止。原因分析 RabbitMQ和Erlang版本不匹配。 解决方案 查询并安装RabbitMQ版本对应Erlang版本 https://www.rabbitm…

[ROS]yolov8部署ROS

Yolov8是一种基于PyTorch深度学习框架的轻量级目标检测算法&#xff0c;具有高效、准确和快速的特点&#xff0c;因此在机器人领域得到了广泛的应用。而ROS&#xff08;Robot Operating System&#xff09;是一个用于机器人软件开发的框架&#xff0c;提供了各种工具和库&#…

高级DBA带你解决达梦国产数据库数据同步至clickhouse数据库通用方法(全中国唯一一份)关键技术讲解

步骤1、安装达梦8国产数据库 参考笔者之前写的博文&#xff0c;怎么安装国产达梦8数据库&#xff0c;按博文提前装好&#xff01; https://blog.csdn.net/nasen512/article/details/126872483 步骤2、安装好clickhouse数据库 参考笔者之前写过的博文&#xff0c;将clickho…

Hadoop HDFS 高阶优化方案

目录 一、短路本地读取&#xff1a;Short Circuit Local Reads 1.1 背景 ​1.2 老版本的设计实现 ​1.3 安全性改进版设计实现 1.4 短路本地读取配置 1.4.1 libhadoop.so 1.4.2 hdfs-site.xml 1.4.3 查看 Datanode 日志 二、HDFS Block 负载平衡器&#xff1a;Balan…

python通过docker打包执行

背景 正常情况下,python脚本执行需要安装有python环境,那python环境虽然也可以通过移植的方法来安装,那总归是比较麻烦的,下面通过docker打包的方式来执行python脚本 1、安装python镜像 准备两个文件即可,dockerfile、requirements.txt两个文件的内容分别如下 同目录下…

如何做好住宅区门禁监控,这回总算说全了

门禁监控在现代社会中已经变得愈发重要&#xff0c;特别是在住宅小区。随着城市化进程的加速和人口密度的增加&#xff0c;住宅小区的安全管理成为了一个至关重要的挑战。为了确保居民的安全和财产的保护&#xff0c;门禁监控系统逐渐成为了必备的设施之一。 客户案例 太原某小…

人大金仓V8数据库安装补充资料

之前写过一篇人大金仓数据库安装文档,自我感觉太过简练。这里补充一些资料。 命令行安装过程中,英文提示还比较简单。 安装默认第一项是完整安装,第二项是安装客户端软件,第三项是自定义安装。 这里选择了第一项。 File Path需要输入license文件的绝对路径且包括文件名。…

Jetpack Compose Accompanist最近的更新-2023年8月25日

Jetpack Compose Accompanist最近的更新-2023年8月25日 这篇文章更新了Jetpack Compose Accompanist库的情况&#xff0c;介绍了其目的和最新上传的功能&#xff0c;包括Pager、Flow Layout、Navigation Animation和Insets-UI。同时&#xff0c;提到了对一些库未来发展的讨论。…