队列先进先出,只能从队尾进入,从队首出去。出队列即删除头结点;进队列即在链表尾部添加新节点。
Queue.h文件
#pragma once
#include"stdio.h"
#include"stdlib.h"
#include"assert.h"
#include"stdbool.h"
typedef int QDataType;
typedef struct QueueNode {
QDataType data;
struct QNode* next;
}QNode;
typedef struct Queue {
QNode* head;
QNode* tail;
}Queue;
void QueueInit(Queue* q); //初始化
void QueueDestroy(Queue* q); //销毁
void QueuePrint(Queue* q); //以出队列形式打印
QNode* QueueBuynewcode(QDataType x); //创建新节点
void QueuePush(Queue* q, QDataType x); //插入x
void QueuePop(Queue* q); //出栈删除
QDataType QueueFront(Queue* q); //返回队首元素
QDataType QueueBack(Queue* q); //返回队尾元素
bool QueueEmpty(Queue* q); //判断队列是否为空
int QueueSize(Queue* q); //返回队列元素个数
Queue.c文件
#include"Queue.h"
//初始化
void QueueInit(Queue* q)
{
q->head = NULL;
q->tail = NULL;
}
//按从队首出打印
void QueuePrint(Queue* q)
{
QNode* cur = q->head;
while (cur)
{
printf("%d ",cur->data);
cur = cur->next;
}
printf("\n");
}
//创建新节点
QNode* QueueBuynewcode(QDataType x)
{
QNode* newcode = (QDataType*)malloc(sizeof(QDataType));
newcode->data = x;
newcode->next = NULL;
return newcode;
}
//插入x
void QueuePush(Queue* q, QDataType x)
{
QNode* Newcode = QueueBuynewcode(x);
if (q->head == NULL) //当队列为空时
q->head = q->tail = Newcode;
else
{
q->tail->next = Newcode;
q->tail = Newcode;
}
}
//出栈删除
void QueuePop(Queue* q)
{
assert(q);
assert(q->head); //确保队列不为空
QNode* next = q->head->next;
free(q->head);
q->head = next;
}
//销毁
void QueueDestroy(Queue* q)
{
assert(q);
QNode* cur = q->head;
while (cur != NULL)
{
QNode* next = cur->next;
free(cur);
cur = next;
}
q->head = q->tail = NULL;
}
//返回队首元素
QDataType QueueFront(Queue* q)
{
return q->head->data;
}
//返回队尾元素
QDataType QueueBack(Queue* q)
{
return q->tail->data;
}
//判断队列是否为空,为空返回1,不为空返回0
bool QueueEmpty(Queue* q)
{
return q->head == NULL;
}
//返回队列元素个数
int QueueSize(Queue* q)
{
int size = 0;
QNode* cur = q->head;
while (cur)
{
cur = cur->next;
size++;
}
return size;
}
test.c文件
#include"Queue.h"
test()
{
Queue qu;
QueueInit(&qu);
QueuePush(&qu,1);
QueuePush(&qu, 2);
QueuePrint(&qu);
QueueDestroy(&qu);
}
int main()
{
test();
return 0;
}