当前位置: 首页 > news >正文

【数据结构:队列】——队列的实现(C语言)

1、什么是队列?

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列和出队列。
队尾:进行插入操作的一端
队头:进行删除操作的一端
详细了解:队列的详解
出队和入队

2、队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

数组结构:
在这里插入图片描述
链表结构:
在这里插入图片描述

3、代码实现

Queue.h文件

#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<malloc.h>


typedef char QUDataType;

typedef struct QueueNode
{
	struct QueueNode* _next;
	QUDataType _data;
}QueueNode;

typedef struct Queue
{
	QueueNode* _front;
	QueueNode* _tail;
}Queue;


void QueueInit(Queue* pq);//初始化
void QueueDestory(Queue* pq);//销毁
QueueNode* BuyQueueNode(QUDataType x);//创建一个节点
void QueuePush(Queue* pq,QUDataType x);//尾插
void QueuePop(Queue* pq);//头删
QUDataType QueueFront(Queue* pq);//取出当前头部元素
QUDataType QueueBack(Queue* pq);//取出当前尾部元素
int QueueEmpty(Queue* pq);//判断队列是否为空
int QueueSize(Queue* pq);//计算当前队列元素
void QueuePirnt(Queue* pq);//依次取出队列元素

Queue.c文件


void QueueInit(Queue* pq)//初始化
{
	assert(pq);

	pq->_front = pq->_tail = (QueueNode*)malloc(sizeof(QueueNode));
	assert(pq->_front);
	pq->_front->_next = NULL;
	pq->_front->_data = 0;
}

void QueueDestory(Queue* pq)//销毁
{
	assert(pq);
	QueueNode *cur = pq->_front;
	while (cur)
	{
		QueueNode *next = cur->_next;
		free(cur);
		cur = next;
	}
	pq->_front = pq->_tail = NULL;
}

QueueNode* BuyQueueNode(QUDataType x)//创建一个节点
{
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	assert(newnode);
	newnode->_data = x;
	newnode->_next = NULL;
	return newnode;
}

void QueuePush(Queue* pq, QUDataType x)//尾插
{
	assert(pq);
	QueueNode* newnode = BuyQueueNode(x);
	assert(newnode);//判断申请空间是否成功
	pq->_tail->_next = newnode;
	pq->_tail = newnode;
}

void QueuePop(Queue* pq)//头删
{
	assert(pq && pq->_front->_next != NULL);
	QueueNode* next = pq->_front->_next;//保存对头第一个元素
	if (pq->_tail == next)
	{
		pq->_tail = pq->_front;
	}
	pq->_front->_next = next->_next;
	free(next);
	next = NULL;

}

QUDataType QueueFront(Queue* pq)//取出当前头部元素
{
	assert(pq);

	return pq->_front->_next->_data;;
}

QUDataType QueueBack(Queue* pq)//取出当前尾部元素
{
	assert(pq);

	return pq->_tail->_data;
}

int QueueEmpty(Queue* pq)//判断队列是否为空
{
	assert(pq);

	return pq->_front == pq->_tail ? 0 : 1;
}

int QueueSize(Queue* pq)//计算当前队列元素
{
	assert(pq);

	QueueNode* cur = pq->_front->_next;
	int count = 0;

	if (QueueEmpty == 0)
	{
		return 0;
	}
	else
	{
		while (cur)
		{
			++count;
			cur = cur->_next;
		}
	}
	return count;
}

void QueuePirnt(Queue* pq)//依次取出队列元素
{
	assert(pq);

	QueueNode* cur = pq->_front->_next;

	while (cur)
	{
		printf("%d->", cur->_data);
		cur = cur->_next;
	}
	printf("NULL\n");
}

main.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"

int main()
{
	Test();
	system("pause");
	return 0;
}

运行截图
在这里插入图片描述

相关文章:

  • 【数据结构:栈】——栈的实现(C语言)
  • 【数据结构:链表】——无头单向非循环链表的实现(C语言)
  • 【数据结构:链表】——带头双向循环链表的实现(C语言)
  • 【数据结构:堆】——堆及堆的相关操作(C语言)
  • c++入门——基础知识点(1)
  • c/c++内存管理
  • 函数模板、类模板初识
  • 【Linux】进程地址空间了解
  • 【Linux】入门基础命令(1)
  • c++入门——基础知识点(2)
  • 【Linux】基础文件的I/O操作(1)
  • 【Linux】进程信号
  • 【Linux】网络编程套接字(1)
  • 【Linux】UDP网络套接字编程
  • 【数据结构:树】——搜索二叉树-K模型(非递归和递归)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【Linux系统编程】快速查找errno错误码信息
  • 〔开发系列〕一次关于小程序开发的深度总结
  • co模块的前端实现
  • css布局,左右固定中间自适应实现
  • javascript 哈希表
  • js如何打印object对象
  • Spring Boot MyBatis配置多种数据库
  • 给初学者:JavaScript 中数组操作注意点
  • 基于webpack 的 vue 多页架构
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 面试遇到的一些题
  • 判断客户端类型,Android,iOS,PC
  • 用quicker-worker.js轻松跑一个大数据遍历
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (52)只出现一次的数字III
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转) RFS+AutoItLibrary测试web对话框
  • *1 计算机基础和操作系统基础及几大协议
  • ./configure,make,make install的作用
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .Net的DataSet直接与SQL2005交互
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Asp.net mvc]国际化
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C++基础]-初识模板