以下为用C语言实现的链式队列,包含队列的创建,销毁,入队,出队,队头,队尾,队空。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define TYPE int
//设计节点
typedef struct Node
{
TYPE data; // 数据域
struct Node* next;// 指针域
}Node;
//创建节点
Node* create_node(TYPE data)
{
Node* node = malloc(sizeof(Node)); // 为节点申请一块内存
node->data = data; // 将数据赋值给数据域
node->next = NULL; // 将指针域赋值为空
return node; // 返回结点
}
//设计队列
typedef struct Queue
{
Node* head; // 队头指针
Node* tail; // 队尾指针
size_t size; // 队中元素数量
}Queue;
// 创建
Queue* create_queue(void);
// 销毁
void destory_queue(Queue* queue);
// 入队
void push_queue(Queue* queue, TYPE data);
// 出队
bool pop_queue(Queue* queue);
// 队头
TYPE* head_queue(Queue* queue);
// 队尾
TYPE* tail_queue(Queue* queue);
// 队空
bool empty_queue(Queue* queue);
int main()
{
Queue* queue = create_queue(); // 创建队列
for(int i=0; i<10; i++)
{
push_queue(queue, i); // 将i入队
printf("%d\n", *tail_queue(queue)); // 显示队尾元素
}
for(int i=0; i<10; i++)
{
printf("%d\n", *head_queue(queue)); // 显示队头元素
pop_queue(queue); // 将i出队
}
destory_queue(queue); // 销毁队列
}
// 创建
Queue* create_queue(void)
{
Queue* queue = malloc(sizeof(Queue)); // 为队列申请一块内存
queue->head = NULL; // 将头指针指向空
queue->tail = NULL; // 将尾指针指向空
queue->size = 0; // 队中元素初始化为0
return queue; // 返回队列
}
// 销毁
void destory_queue(Queue* queue)
{
while(pop_queue(queue)); // 将队中元素全部出队
free(queue); // 释放存放队列的内存
}
// 入队
void push_queue(Queue* queue, TYPE data)
{
Node* node = create_node(data); // 创建一个结点
if(0 == queue->size) // 如果原先队列为空,则将头指针和尾指针都指向结点node
{
queue->head = node;
queue->tail = node;
}
else // 入队从队尾进,将队尾结点的next指针指向node,然后再将队尾指针指向node,node即为队尾结点
{
queue->tail->next = node;
queue->tail = node;
}
queue->size ++; //队中元素个数加1
}
// 出队
bool pop_queue(Queue* queue)
{
if(empty_queue(queue)) // 如果队列为空,出队失败
return false;
Node* node = queue->head; // 定义一个结构体指针指向队头
queue->head = node->next; // 将队头指针头结点的下一个结点
free(node); // 释放原先的队头
queue->size --; // 队中元素减1
return true;
}
// 队头
TYPE* head_queue(Queue* queue)
{
if(empty_queue(queue)) // 如果队列为空,则返回一个空指针
return NULL;
return &queue->head->data; // 返回头结点中的数据域
}
// 队尾
TYPE* tail_queue(Queue* queue)
{
if(empty_queue(queue)) // 如果队列为空,则返回一个空指针
return NULL;
return &queue->tail->data; // 返回尾结点中的数据域
}
// 队空
bool empty_queue(Queue* queue)
{
return !queue->size;
}