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

数据结构 Queue 队列 -- C语言实现

时间:2024-08-06 11:09:44浏览次数:14  
标签: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/18344045

相关文章

  • 对象序列化和反向序列化
    对象序列化和反向序列化目录对象序列化和反向序列化对象序列化:对象反向序列化:注意事项:在Java中,对象序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。序列化的对象可以被写入到文件、数据库或通过网络传输。反向序列化,也称为反序列化,是序列化过程的逆过程,即将序列......
  • 多模态融入推荐
    多模态特征如何融入到推荐最近刚好读了2篇文章,对于多模态特征处理的核心问题:多模态表征和推荐ID类特征的表征不在一个向量空间,如何有效融合;其次多模态特征预训练的,如何有效评估以及融入推荐系统之后如何进行更新的问题一、先解决怎么融合的问题:将多模态表征聚类,使用聚类的......
  • 流的分类
    流的分类目录流的分类字符流FileReader和FileWriter字节流FileInputStream和FileOutputStream字符流FileReader和FileWriterFileReader类构造方法摘要**FileReader**(Filefile)在给定从中读取数据的File的情况下创建一个新FileReader。**FileReader**(Fi......
  • Android 广播 Broadcast Receiver
    广播(Broadcast)是Android中的一种机制,允许应用程序之间传递消息。广播在Android中扮演着重要角色,能够在不同的组件间传递信息,无论是应用内部还是跨应用。下面我将详细解释广播的机制,并提供几个示例,按照难度逐步增加。广播机制详细解释1.广播的基本概念广播允许应用程序在系统中......
  • 数学基础-快速幂、快速乘、矩阵快速幂
    快速幂幂运算的本质是做乘法,对于\(a^b\),其核心思想是将指数\(b\)进行二进制分解,然后对\(b\)的每一位进行进行乘法,时间复杂度为\(O(\logb)\)。llquick_power(lla,llb,llp){llans=1%p;for(;b;b>>=1){if(b&1)ans=an......
  • 【笔记】矩阵
    1Template1.1轻量化灵活度较高,适合直接调用矩阵内值的情形。typedefvector<vector<int>>Matrix;voidresize(Matrix&a,intn,intm){ a.resize(n,vector<int>(m));}Matrixoperator*(constMatrix&a,constMatrix&b){ Matrixres;resize(re......
  • File类
    File类目录File类文件的创建文件的删除获取文件信息此类是Java.io中唯一代表磁盘文件本身的类可以通过此方法,实现创建,删除,重命名文件等操作。该类的对象主要用来获取文件本身的一些信息。数据流可以将数据写进文件里,文件也是数据流最常用的数据媒体文件的创建File(Stringpat......
  • Mybatis 记录
    1.根据列表批量修改voidsecretKeySequence(@Param("list")List<IndustrialShareDto>list);<updateid="secretKeySequence">updatecloud_industrial_setset`index`=case<foreachcollection="list"it......
  • 面试题 .NET Core 开发工程师
    在面试.NETCore高级开发工程师时,通常会涉及多个方面的问题,以评估候选人在不同领域的深度和广度。以下是一些常见的面试题目分类及示例问题:###基础知识1.**.NETCore与.NETFramework的区别?**-请解释.NETCore和.NETFramework的主要区别,以及在什么情况下选择使用......
  • 集合遍历
    集合遍历目录集合遍历传统的for循环遍历,基于计数器的:迭代器遍历,Iterator:foreach循环遍历:Stream流处理传统的for循环遍历,基于计数器的:​遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止。主要就是需要按元素的位置来读取元素......