队列的实现与讲解

队列的实现我们分工为三个文件

头文件,函数实现文件,操作文件

头文件Queue.h:

#pragma once
#include 
#include 
#include 
#include 
//重命名类型
typedef int DataType;
//创建队列结构体
typedef struct QueueNode
{
	struct QueueNode* next;
	DataType data;
}QNode;
//创建指针
typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;

//初始化
void QueueInit(Queue* pq);
//销毁
void QueueDestory(Queue* pq);
//队尾入队列
void QueuePush(Queue* pq,DataType x);
//队头出队列
void QueuePop(Queue* pq);
//取数据队头
DataType QueueFront(Queue* pq);
//取数据队尾
DataType QueueBack(Queue* pq);
//数据的有效值
int QueueSize(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);

函数实现文件Queue.c:

#include "Queue.h"

//初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
}
//销毁
void QueueDestory(Queue* pq)
{
	assert(pq);
	QNode* cur=pq->head;
	while (cur)
	{
		QNode* next = cur->next;//先保存下一个再释放自己,再让next赋值给cur
		free(cur);
		cur = next;
	}
	//结束后再把head和tail置空
	pq->head = pq->tail = NULL;
}
//队尾入队列
void QueuePush(Queue* pq, DataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	else
	{
		newnode->data = x;
		newnode->next = NULL;
	}
	if (pq->tail==NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
}
//队头出队列
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head);
	if (pq->head->next == NULL)//这里我们要判断一下head的next是否为空,如果为空说明只有一个节点了,我们直接释放,否则tail变成了野指针
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
}
//取数据队头
DataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->head);//先判断头是否已经为空
	return pq->head->data;
}
//取数据队尾
DataType QueueBack(Queue* pq)
{
	assert(pq);
	return pq->tail->data;
}
//数据的有效值
int QueueSize(Queue* pq)
{
	assert(pq);
	int size = 0;
	QNode* cur = pq->head;
	while (cur)//我们直接遍历一遍知道cur为空的时候停止
	{
		size++;
		cur = cur->next;
	}
	return size;
}
//判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;//判断如果为空则返回真,否则为假
}

 操作文件test.c:

这里具体想怎样的操作还要看自己想实现什么,博主只是随便执行了几个。

#include "Queue.h"
void TestQueue()
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	printf("%d", QueueFront(&q));
	QueuePop(&q);
	printf("%d", QueueFront(&q));
	QueuePop(&q);
	QueuePush(&q, 3);
	QueuePush(&q, 4);

	while (!QueueEmpty(&q))
	{
		printf("%d", QueueFront(&q));
		QueuePop(&q);
	}
	printf("\n");
	QueueDestory(&q);
}
int main()
{
	TestQueue();
	return 0;
}

 

你可能感兴趣的:(数据结构,c语言,c++,数据结构,学习方法,队列)