队列的C语言实现

Queue.h
#pragma once
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>
typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;
typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;
//队列初始化
void QueueInit(Queue* pq);
//销毁队列
void QueueDestory(Queue* pq);
//队尾入
void QueuePush(Queue* pq, QDataType x);
//队头出
void QueuePop(Queue* pq);
//队头数据查询
QDataType QueueFront(Queue* pq);
//队尾数据查询
QDataType QueueBack(Queue* pq);
//队列是否为空
bool QueueEmpty(Queue* pq);
//队列目前的数据个数
int QueueSize(Queue* pq);
Queue.c
#include "Queue.h"

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
}
//队尾入
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->next = NULL;
	newnode->data = x;
	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);
	//1.1个
	//2.多个
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head=pq->tail= NULL;
	}
		QNode* next= pq->head->next;
	free(pq->head);
	pq->head = next;

}
//判顶队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

//取队头数据
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->head);//为空不能调用,访问空指针了
	return pq->head->data;
}
//取队尾数据
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->head);
	return pq->tail->data;
}
//获取队列大小
int QueueSize(Queue* pq)
{
	assert(pq);
	int size = 0;
	//遍历来计算大小
	QNode* cur = pq->head;
	while (cur)
	{
		cur = cur->next;
		size++;
	}
	return size; 

}
//销毁队列
void QueueDestory(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{   
		QNode* next= cur->next;
		free(cur);
		cur = next;
	}
	pq->tail = pq->head = NULL;
}
test.c
#include "Queue.h"


//测试时,想遍历存入的所有数据,必须边队出,边遍历,否则将一直读取队头那一个数据


void TestQueue()
{
	Queue q;//专门申请一个结构体用来存放队头指针head,队尾指针tail,这两个指针是脱离单链表之外的,专门用来对单链表进行操作
	QueueInit(&q);
	QueuePush(&q, 1);
    QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	while (!QueueEmpty(&q))
	{
		printf("%d", QueueFront(&q));
		QueuePop(&q);
	}
}
                          




int main()
{

	TestQueue();

}


版权声明:本文为qq_30677815原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。