简介:
利用单链表实现一个队列,
基本操作:初始化,入队列,出队列,判断队列是否为空,返回队首数据,返回队列数据个数。
1.Queue.h
#pragma once
#include <assert.h>
#include <String.h>
#include <stdlib.h>
// 利用单链表实现队列
typedef int QDataType;
// 队列结点定义
typedef struct QNode {
QDataType data; // 结点数据
struct QNode *pNext; //下一结点地址
} QNode;
// 队列链表的定义
typedef struct Queue {
QNode *pFront; //队头 :进行删除
QNode *pRear; //队尾 :进行插入
int size; //结点个数,即队列大小
} Queue;
// 队列初始化
void QueueInit(Queue *pQ)
{
assert(pQ != NULL);
pQ->pFront = pQ->pRear = NULL;
pQ->size = 0;
}
// 入队 : 从队尾插入一个元素
void QueuePush(Queue *pQ, QDataType data)
{
assert(pQ != NULL);
pQ->size++;
QNode *pNewNode = (QNode *)malloc(sizeof(QNode));
assert(pNewNode);
pNewNode->data = data;
pNewNode->pNext = NULL;
// 若队列为空
if (pQ->pRear == NULL) {
pQ->pFront = pQ->pRear = pNewNode;
return;
}
// 通常情况,即队列不为空,至少有一个结点
pQ->pRear->pNext = pNewNode;
pQ->pRear = pNewNode;
}
// 出队 :从队头删除一个元素
void QueuePop(Queue *pQ)
{
assert(pQ != NULL);
assert(pQ->size > 0); // 必须判断队列是否为空
pQ->size--;
// 通常情况
QNode *pNode = pQ->pFront;
pQ->pFront = pNode->pNext;
free(pNode);
// 若队列里面只有一个结点,删除后,队列为空,此时要改变队尾结点的状态
if (pQ->pFront == NULL) {
pQ->pRear = NULL;
}
}
// 返回队首元素
QDataType QueueFront(Queue *pQ)
{
assert(pQ != NULL);
assert(pQ->size > 0);
return pQ->pFront->data;
}
// 判断队列是否为空
// 1 为空, 0 不空
int QueueIsEmpty(Queue *pQ)
{
return pQ->size == 0 ? 1 : 0;
}
// 返回队列数据个数
int QueueSize(Queue *pQ)
{
return pQ->size;
}
void TestQueue()
{
Queue queue;
QueueInit(&queue);
QueuePush(&queue, 1);
QueuePush(&queue, 2);
QueuePush(&queue, 3);
QueuePush(&queue, 4);
QueuePop(&queue);
QueuePop(&queue);
QueuePop(&queue);
QueuePop(&queue);
}
2.Main.c
#include "Queue.h"
int main()
{
TestQueue();
return 0;
}