【算法与数据结构】 C语言实现单链表队列详解1:https://developer.aliyun.com/article/1474522
🌠测试
# define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "Queue.h" int main() { Queue queue; QueueInit(&queue); printf("Queue is empty: %s\n", QueueEmpty(&queue) ? "true" : "false"); printf("Pushing elements into the queue...\n"); for (int i = 1; i <= 5; ++i) { printf("Pushing %d\n", i); QueuePush(&queue, i); } printf("Queue size: %d\n", QueueSize(&queue)); printf("Queue front: %d\n", QueueFront(&queue)); printf("Queue back: %d\n", QueueBack(&queue)); printf("Popping elements from the queue...\n"); while (!QueueEmpty(&queue)) { printf("Front: %d\n", QueueFront(&queue)); QueuePop(&queue); } printf("Queue is empty: %s\n", QueueEmpty(&queue) ? "true" : "false"); QueueDestroy(&queue); return 0; }
代码效果图:
🌉 总源代码
Queue.c
#include "Queue.h" void QueueInit(Queue* pq) { assert(pq); // 断言队列指针是否为空 pq->phead = NULL; // 初始化头节点指针为空 pq->ptail = NULL; // 初始化尾节点指针为空 pq->size = 0; // 初始化队列大小为0 } void QueueDestroy(Queue* pq) { assert(pq); // 断言队列指针是否为空 QNode* cur = pq->phead; // cur指向队列头节点 while (cur) { QNode* next = pq->phead->next; // 保存cur下一个节点的指针 free(cur); // 释放cur节点内存 cur = next; // cur指针移到下一个节点 } pq->phead = pq->ptail = NULL; // 重置头尾节点指针为空 pq->size = 0; // 重置队列大小为0 } void QueuePush(Queue* pq, QDataType* x) { assert(pq); // 断言队列指针是否为空 QNode* newnode = (QNode*)malloc(sizeof(QNode)); // 申请新节点内存 if (newnode == NULL) { // 申请失败 perror("malloc fail"); return; } newnode->data = x; // 设置新节点数据 newnode->next = NULL; // 设置新节点next指针为空 if (pq->ptail) { // 如果队列不为空 pq->ptail->next = newnode; // 尾节点指向新节点 pq->ptail = newnode; // 更新尾节点指针 } else { // 队列为空 pq->phead = pq->ptail = newnode; // 头尾节点同时指向新节点 } pq->size++; // 队列大小增加1 } //出队列 void QueuePop(Queue* pq) { assert(pq); // 断言队列指针是否为空 if (pq->phead == NULL) return; // 队列为空直接返回 assert(pq->phead != NULL); // 断言头节点不为空 if (pq->phead->next == NULL) { // 队列只有一个节点 free(pq->phead); // 释放头节点 pq->phead = pq->ptail = NULL; // 头尾节点同时置空 } else { // 队列有多个节点 QNode* next = pq->phead->next; // 保存头节点的下一个节点 free(pq->phead); // 释放头节点 pq->phead = next; // 头节点指向下一个节点 } pq->size--; // 队列大小减1 } QDataType QueueFront(Queue* pq) { assert(pq); assert(pq->phead != NULL); return pq->phead->data; } QDataType QueueBack(Queue* pq) { assert(pq); //暴力检查 assert(pq->ptail != NULL); return pq->ptail->data; } bool QueueEmpty(Queue* pq) { assert(pq); return pq->size == 0; } int QueueSize(Queue* pq) { assert(pq); return pq->size; }