首页 > 其他分享 >Queue 队列 -- C语言实现 -

Queue 队列 -- C语言实现 -

时间:2024-08-06 13:05:25浏览次数:10  
标签:assert head pq -- NULL next Queue C语言

队列

队列的概念

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

  • 入队:进行插入操作的一端称为队尾
  • 出队:进行删除操作的一端称为队头

链实栈代码实现

Ququq.h

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

typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode *next;
	QDataType data;
}QNode;

//控制变量结构体
//只有一个值,就不用定义结构体,有多个就定义结构题。

typedef struct Queue
{
	struct QueueNode *head; //队头,出队,头删
	struct QueueNode *tail; //队尾,入队,尾插
}Queue;
//是指针变量就传二级指针,是普通变量就传一级

void QueueInit(Queue *pq);
void QueueDestroy(Queue *pq);

void QueuePush(Queue *pq, QDataType x);
void QueuePop(Queue *pq);

QDataType QueueFront(Queue *pq);
QDataType QueueBack(Queue *pq);

int QueueSize(Queue *pq);
bool QueueEmpty(Queue *pq);

Queue.c

#include "Queue.h"


void QueueInit(Queue *pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
	

}

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode * next = NULL;
	QNode *cur = pq->head;
	while (cur)
	{
		next = pq->head->next;//放这里防止没节点时解引用。
		free(cur);
		cur = next;
	}
	pq->head=pq->tail = NULL;
}

void QueuePush(Queue *pq,QDataType x)
{
	assert(pq);
	QNode *newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail ");
		exit(-1);
	}
	//先初始化再使用
	newnode->data = x;
	newnode->next = NULL;
	//单链表队列-尾插头删。
	if (pq->head == NULL)//头尾都行,判断一个就可以了 ---用头更好,不要用尾--用尾可能插不进,如果删完后尾没有置空的话
	{
		pq->head = pq->tail = newnode;
	}
	else                             //尾插
	{
		pq->tail->next = newnode; //队尾指向的节点链接上新节点
		pq->tail = newnode;      //队尾指向新节点
	}
}

void QueuePop(Queue *pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	if (pq->head->next == NULL)//只有一个节点
	{
		free(pq->head);//先释放
		pq->tail = pq->head = NULL;//后置空 :tail 和 head都得置空,不然下次就插不进了 ---为什么要置空,因为push需要NULL识别空队列插入
	}
	else
	{
		QNode *next = pq->head->next;//记住下一个
		free(pq->head);//释放头节点
		 pq->head = next;//下个节点成为新节点 
	}
}

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


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

int QueueSize(Queue *pq)
{
	assert(pq);
	QNode *cur = pq->head;
	int size = 0;
	while (cur)
	{
		size++;
		cur = cur->next;
	}
	return size;
}

bool QueueEmpty(Queue *pq)
{
	assert(pq);
	//return QueueSize(pq) == 0;
	return pq->head == NULL ;//只要有一个就可以了
	//head为空tail也为空
}

标签:assert,head,pq,--,NULL,next,Queue,C语言
From: https://www.cnblogs.com/DSCL-ing/p/18343986

相关文章

  • 计算机毕业设计django+vue宠物销售系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着宠物市场的持续繁荣,宠物销售行业迎来了前所未有的发展机遇。然而,传统的宠物销售方式往往受限于地域、信息不对称以及管理效率低下等问......
  • 计算机毕业设计django+vue德林超市连锁超市触屏收银系统设计与实现【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,零售业正经历着前所未有的变革。传统超市在面对电商冲击和消费者需求日益多样化的背景下,亟需通过技术创新提升服务......
  • Ubuntu防火墙相关命令
    在Ubuntu系统中,启用防火墙可以通过ufw(UncomplicatedFirewall)来完成。以下是如何启用和配置ufw的步骤:1.安装ufw(如果尚未安装)sudoaptupdatesudoaptinstallufw2Ubuntu启用防火墙ufw:sudoufwenable3.Ubuntu检查防火墙状态sudoufwstatus4.设置默认策略(可选,......
  • 计算机毕业设计django+vue校医院问诊预约系统没计与实现【开题+程序+论文】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的不断发展和医疗改革的深入,传统校医院的服务模式已经难以满足师生日益增长的健康需求。特别是在面对日常问诊、预约挂号、健......
  • 冒泡排序算法
    冒泡排序核心思想:两两相邻的元素进行比较。比如一组数据,{7,2,6,5,0}让其按升序排序。第一趟:(1)2,7,6,5,0     12元素比较,7比2大,交换(2)2,6,7,5,0     23元素比较,7比6大,交换(3)2,6,5,7,0     34元素比较,7比5大,交换(4)2,6,5,0,7     45元素比较,7比0大,交换-五个元......
  • 二进制及原码反码补码
    目录一.进制及转换1.二进制和进制转换1.12进制转10进制1.210进制转2进制1.32进制转换8进制1.42进制转换成16进制二、原码、反码、补码一.进制及转换2进制、8进制、10进制、16进制是数值的不同表现形式。比如:数值13的各种进制表现形式:13的2进制:1101   ......
  • 【MySQL的索引优化】
    一、索引的使用场景1、全值匹配通过主键索引查询代码解读mysql>explainselect*fromt_goodswhereid=1\G;***************************1.row***************************id:1select_type:SIMPLEtable:t_goodspartitions:N......
  • 【Rabbitmq的消息模型】
    消息队列的特性durable:队列持久化。如果设置持久化,那么无论RabbitMQ在关闭时,就会将队列存储到本地磁盘,无论宕机还是重启,队列也不会删除;如果设置不持久化,那么在RabbitMQ关闭时,就会将队列删除。exclusive:独占队列。如果设置独占,那么当前队列只允许预先设置的Connection访问;如......
  • Cpp DenseNet OpenVino CMake工程
    CppOpenVinoCMakePython版本导引PythonDenseNetOpenVino导出PythonDenseNetOpenVino推理PythonDenseNetOpenVino打包CMake工程示例测试性质的工程结构如下:Project:Network:存放网络推理相关DebugTools:打印网络结构DenseGradeWrapper:推理主结构Netwo......
  • C++学习笔记----Strings与String View(4)-- 字符串操作
        今天讲点简单易懂的,字符串操作,当然了,不是全部,列出几个典型的字符串操作,完整地可以参考相关资料,网上一搜一把哦。substr(pos,len):返回特定位置pos,特定长度的子字符串。find(str):返回字符串的位置,如未找到则返回string::npos。replace(pos,len,str):用新的字符串str......