代码如下:
Queue.h:
#pragma once
// 链式结构:表示队列
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int QDataType;
typedef struct QListNode
{
struct QListNode* next;//指向下一个节点的指针
QDataType data;//储存的数据
}QNode;
// 队列的结构,这样做是为了方便对队列进行各种操作,降低时间复杂度
typedef struct Queue
{
QNode* front;//队头
QNode* rear;//队尾
int size;//队列元素个数
}Queue;
// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QDataType QueueFront(Queue* q);
// 获取队列队尾元素
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);
Queue.c:
#include "Queue.h"
// 初始化队列
void QueueInit(Queue* q)
{
assert(q);
q->front = q->rear = NULL;
q->size = 0;
}
// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{
assert(q);
//先生成一个节点
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (NULL == newnode)
{
perror("malloc fail!");
return;
}
newnode->next = NULL;
newnode->data = data;
if (q->rear == NULL)
{
q->front = q->rear = newnode;
}
else
{
q->rear->next = newnode;
q->rear = newnode;
}
q->size++;
}
// 队头出队列
void QueuePop(Queue* q)
{
assert(q);
assert(q->size > 0);
if (NULL == q->front->next)
{
free(q->front);
q->front = q->rear = NULL;
}
else
{
QNode* tmp = q->front->next;
free(q->front);
q->front = tmp;
}
q->size--;
}
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
assert(q);
assert(q->size > 0);
return q->front->data;
}
// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{
assert(q);
assert(q->size > 0);
return q->rear->data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
assert(q);
return q->size;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q)
{
assert(q);
return q->size == 0;
}
// 销毁队列
void QueueDestroy(Queue* q)
{
assert(q);
QNode* pcur = q->front;
while (pcur)
{
QNode* next = pcur->next;
free(pcur);
pcur = next;
}
q->front = q->rear = NULL;
q->size = 0;
}
test.c:
void QueueTest()
{
Queue Q;
QueueInit(&Q);
QueuePush(&Q, 1);
QueuePush(&Q, 2);
QueuePush(&Q, 3);
QueuePush(&Q, 4);
printf("队头元素是: %d \n",QueueFront(&Q));
printf("队尾元素是: %d \n",QueueBack(&Q));
printf("队列里元素个数是: %d 个\n", QueueSize(&Q));
QueuePop(&Q);
QueuePop(&Q);
QueuePop(&Q);
if (QueueEmpty(&Q))
printf("队列为空\n");
else
printf("队列不为空\n");
QueuePop(&Q);
if (QueueEmpty(&Q))
printf("队列为空\n");
else
printf("队列不为空\n");
QueueDestroy(&Q);
}
int main()
{
QueueTest();
return 0;
}
运行结果:
通过调试可见队列的销毁和删除等没有问题
如有错误,欢迎指正.