队列
queue.h文件
#include"queue.h"
int main(void)
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
printf("%d\n", QueueSize(&q));
while (!QueueEmpty(&q))
{
printf("%d ", QueueFront(&q));
QueuePop(&q);
}
QueueDestroy(&q);
return 0;
}
queue.c文件
#include"queue.h" // 引入头文件"queue.h"
// 队列初始化
void QueueInit(Queue* q) // 参数为队列指针
{
assert(q); // 断言队列指针不为空
q->head = q->tail = NULL; // 首尾全部指向NULL,即队列为空
q->size = 0; // 元素个数为0
}
QNode* Buy_Node(QDataType x) // 定义一个函数,用来创建一个新节点
{
QNode* newnode = (QNode*)malloc(sizeof(QNode)); // 申请一个新节点
if (newnode == NULL) // 如果申请失败
{
perror("malloc fail:"); // 输出错误信息
return 0; // 返回0
}
newnode->x = x; // 新节点的数据为x
newnode->next = NULL; // 新节点的next指针指向NULL,即没有下一个节点
return newnode; // 返回新节点
}
// 队头入队列
void QueuePush(Queue* q, QDataType data) // 参数为队列指针和要插入的数据
{
assert(q); // 断言队列指针不为空
QNode* newnode = Buy_Node(data); // 创建一个新节点
if (q->head == NULL) // 如果队列为空
{
assert(q->tail == NULL); // 断言队列尾指针也为空
q->head = q->tail = newnode; // 头指针和尾指针都指向新节点
}
else // 如果队列不为空
{
q->tail->next = newnode; // 队列尾部的next指针指向新节点
q->tail = newnode; // 队列尾指针指向新节点
}
q->size++; // 元素个数加1
}
// 队头出队列
void QueuePop(Queue* q) // 参数为队列指针
{
assert(q); // 断言队列指针不为空
assert(q->head != NULL); // 断言队列头指针不为空
if (q->head->next == NULL) // 如果队列只有一个元素
{
free(q->head); // 释放头节点的内存
q->head = q->tail = NULL; // 头指针和尾指针都指向NULL,即队列为空
}
else // 如果队列不止一个元素
{
QNode* second = q->head->next; // 保存第二个节点的指针
free(q->head); // 释放头节点的内存
q->head = second; // 将原来的第二个节点设置为头节点
}
q->size--; // 元素个数减1
}
// 获取队列头部元素
QDataType QueueFront(Queue* q) // 参数为队列指针
{
return q->head->x; // 返回头节点的数据
}
// 获取队列队尾元素
QDataType QueueBack(Queue* q) // 参数为队列指针
{
return q->tail->x; // 返回尾节点的数据
}
// 获取队列中有效元素个数
int QueueSize(Queue* q) // 参数为队列指针
{
return q->size; // 返回元素个数
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q) // 参数为队列指针
{
return q->size == 0; // 如果元素个数为0,返回1,否则返回0
}
// 销毁队列
void QueueDestroy(Queue* q) // 参数为队列指针
{
assert(q); // 断言队列指针不为空
QNode* cur = q->head; // 定义一个指针cur指向队列头节点
while (cur) // 循环直到cur为NULL
{
QNode* second = cur->next; // 保存下一个节点的指针
free(cur); // 释放当前节点的内存
cur = second; // 将cur指向下一个节点
}
q->head = q->tail = NULL; // 头指针和尾指针都指向NULL,即队列为空
q->size = 0; // 元素个数为0
}
test.c文件
#include"queue.h"
int main(void)
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
printf("%d\n", QueueSize(&q));
while (!QueueEmpty(&q))
{
printf("%d ", QueueFront(&q));
QueuePop(&q);
}
QueueDestroy(&q);
return 0;
}
![](https://img2023.cnblogs.com/blog/3082337/202308/3082337-20230825012028052-1109311490.jpg)