队列的实现(单链表)

目录

一、queue.h(头文件)

二、queue.c(调用函数)

三、test.c(主程序)

一、queue.h(头文件)

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef int QDataType;
typedef struct Queuenode
{
	QDataType a;
	struct Queuenode* next;
}Qnode;

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

//初始化队列
void QueueInit(Queue* ps);
//销毁队列
void QueueDestroy(Queue* ps);
//入队列
void Queuepush(Queue* ps, QDataType x);
//出队列
void Queuepop(Queue* ps);
//查看队列中的元素个数
int Queuesize(Queue* ps);
//判断队列是否为空
bool QueueEmpty(Queue* ps);
//查看队首
QDataType QueueFront(Queue* ps);
//查看队尾
QDataType QueueBack(Queue* ps);

二、queue.c(调用函数)

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"

//创建新节点
Qnode* Creatnode(QDataType x)
{
	Qnode* node = (Qnode*)malloc(sizeof(Qnode));
	if (node == NULL)
	{
		perror("malloc:");
		return NULL;
	}
	node->a = x;
	node->next = NULL;
	return node;
}

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

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

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

	return ps->size == 0;
}

//销毁队列
void QueueDestroy(Queue* ps)
{
	assert(ps);
	Qnode* cur = ps->head;
	while (cur)
	{
		Qnode* next = cur->next;
		free(cur);
		cur = next;
	}

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

//入队列
void Queuepush(Queue* ps, QDataType x)
{
	assert(ps);

	Qnode* newnode = Creatnode(x);
	if (ps->head == NULL)
	{
		ps->head = ps->tail = newnode;
	}
	else
	{
		ps->tail->next = newnode;
		ps->tail = newnode;
	}
	ps->size++;
}

//出队列
void Queuepop(Queue* ps)
{
	assert(ps);
	//断言看ps里面是否有数据,非空执行,空的话报错
	assert(!QueueEmpty(ps));

	if (ps->head == ps->tail)
	{
		free(ps->head);
		ps->head = ps->tail = NULL;
		ps->size--;
	}
	else
	{
		Qnode* cur = ps->head;
		ps->head = ps->head->next;
		free(cur);
		cur = NULL;
		ps->size--;
	}
}
//查看队列中的元素个数
int Queuesize(Queue* ps)
{
	assert(ps);

	return ps->size;
}

//查看队首
QDataType QueueFront(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));

	return ps->head->a;
}
//查看队尾
QDataType QueueBack(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));

	return ps->tail->a;
}

三、test.c(主程序)

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"

void Print(Queue* ps)
{
	printf("队头数据为->%d\n", QueueFront(ps));
	printf("队尾数据为->%d\n", QueueBack(ps));
}
int main()
{
	//创建队列
	Queue queue;

	//初始化
	QueueInit(&queue);

	//入队列
	Queuepush(&queue, 1);
	Queuepush(&queue, 2);
	Queuepush(&queue, 3);
	Queuepush(&queue, 4);
	Print(&queue);

	//出队列
	Queuepop(&queue);
	//查看队列中的元素个数
	int n = Queuesize(&queue);
	printf("%d\n", n);
	Print(&queue);

	Queuepush(&queue, 5);
	n = Queuesize(&queue);
	printf("%d\n", n);
	Print(&queue);

	//销毁队列
	QueueDestroy(&queue);
	return 0;
}
相关推荐
mit6.8241 小时前
前后缀分解
算法
你好,我叫C小白1 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
寂静山林4 小时前
UVa 10228 A Star not a Tree?
算法
Neverfadeaway4 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
Madison-No75 小时前
【C++】探秘vector的底层实现
java·c++·算法
Swift社区5 小时前
LeetCode 401 - 二进制手表
算法·leetcode·ssh
派大星爱吃猫5 小时前
顺序表算法题(LeetCode)
算法·leetcode·职场和发展
liu****5 小时前
8.list的模拟实现
linux·数据结构·c++·算法·list
地平线开发者6 小时前
征程 6 | 征程 6 工具链如何支持 Matmul/Conv 双 int16 输入量化?
算法·自动驾驶
程序员大雄学编程7 小时前
「深度学习笔记4」深度学习优化算法完全指南:从梯度下降到Adam的实战详解
笔记·深度学习·算法·机器学习