数据结构8:队列

文章目录

#头文件

Queue.h

c 复制代码
#pragma once

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

typedef int QListDataType;

typedef struct QListNode {
	QListDataType val;
	struct QListNode* next;
}QListNode;

typedef struct Queue {
	QListNode* head;
	QListNode* tail;
	int size;
}Queue;

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

//销毁
void QueueDestroy(Queue* pq);

//队尾入队列
void QueuePush(Queue* pq, QListDataType x);

//对头出队列
void QueuePop(Queue* pq);

//获取队列头部元素
QListDataType QueueFront(Queue* pq);

//获取队列队尾元素
QListDataType QueueBack(Queue* pq);

//获取队列中有效元素个数
int QueueSize(Queue* pq);

//检查队列是否为空,空返回真,非空返回假
bool QueueEmpty(Queue* pq);

实现文件

Queue.c

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include"Queue.h"

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

	pq->head = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

//销毁
void QueueDestroy(Queue* pq)
{
	assert(pq);

	QListNode* cur = pq->head;
	while (cur)
	{
		QListNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

//队尾入队列
void QueuePush(Queue* pq, QListDataType x)
{
	assert(pq);
	
	QListNode* newnode = (QListNode*)malloc(sizeof(QListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->val = x;
	newnode->next = NULL;

	if (pq->tail == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}

	pq->size++;
}

//队头出队列
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size);

	QListNode* tmp = pq->head->next;
	free(pq->head);
	pq->head = tmp;
	if (pq->head == NULL)
		pq->tail = NULL;

	pq->size--;
}

//获取队列头部元素
QListDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->size);

	return pq->head->val;
}

//获取队列队尾元素
QListDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->size);

	return pq->tail->val;
}

//获取队列中有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

//检查队列是否为空,空返回真,非空返回假
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

测试文件

test.c

c 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include"Queue.h"

void Test1()
{
	Queue q;
	Queue* pq = &q;

	//初始化
	QueueInit(pq);

	QueuePush(pq, 1);
	printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq),QueueSize(pq));

	QueuePush(pq, 2);
	printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq), QueueSize(pq));


	QueuePush(pq, 3);
	printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq), QueueSize(pq));


	QueuePush(pq, 4);
	printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq), QueueSize(pq));


	QueuePop(pq);
	printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq), QueueSize(pq));

	QueuePop(pq);
	printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq), QueueSize(pq));


	QueuePop(pq);
	printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq), QueueSize(pq));


	QueuePop(pq);
	//printf("头部元素:%d  尾部元素:%d  队列中元素个数:%d\n", QueueFront(pq), QueueBack(pq), QueueSize(pq));


	//销毁
	QueueDestroy(pq);

}


int main()
{
	Test1();
	return 0;
}
相关推荐
地平线开发者5 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮6 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者6 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考6 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx9 小时前
CART决策树基本原理
算法·机器学习
Wect10 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱11 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway17 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风17 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect17 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript