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版权协议,转载请附上原文出处链接和本声明。