基于链表结构实现的队列,特点是先进先出,由于是链表结构实现了,所以理论上队列不会为满。
#include <stdio.h>
#include <stdlib.h>
//定义节点的数据类型
typedef struct _node
{
int data;
struct _node* p_next;
}Node;
typedef struct _queue
{
//队首指针,指向队列中第一个元素
Node *p_head;
//队尾指针,指向队列最后一个元素,目的是为了添加元素的时候不用遍历,典型的空间换时间
Node *p_cur;
//记录队列中元素的个数
int size;
}Queue;
//创建一个节点
Node* create_node(int data);
//创建一个队列
Queue* create_queue(void);
//判空
int is_empty(Queue* p_queue);
//判满
int is_full(Queue* p_queue);
//入队操作
void push_queue(Queue* p_queue, int data);
//出列操作
int pop_queue(Queue* p_queue);
//遍历元素
void travel_queue(Queue* p_queue);
//测试代码
int main(void)
{
Queue* p_queue = create_queue();
int arr[] = {1, 22, 333, 4444, 55555};
int i = 0;
for (i = 0; i < 5; i++)
{
push_queue(p_queue, arr[i]);
}
printf("----\n");
while (1 != is_empty(p_queue))
{
travel_queue(p_queue);
printf("出列 %d\n", pop_queue(p_queue));
}
return 0;
}
//遍历元素
void travel_queue(Queue* p_queue)
{
if (1 == is_empty(p_queue))
{
printf("queue is empty.\n");
return;
}
Node *p_temp = p_queue->p_head;
while(NULL != p_temp)
{
printf("%d ", p_temp->data);
p_temp = p_temp->p_next;
}
printf("\n");
}
//出列操作
int pop_queue(Queue* p_queue)
{
if (1 == is_empty(p_queue))
{
return -1;
}
int temp = p_queue->p_head->data;
//判断是不是只有一个元素,如果只有一个元素,队尾指针必须回复成空指针
if (p_queue->p_head == p_queue->p_cur)
{
p_queue->p_cur = NULL;
}
Node *p_temp = p_queue->p_head;
p_queue->p_head = p_queue->p_head->p_next;
//释放弹出的元素空间
free(p_temp);
p_queue->size--;
return temp;
}
//判空
int is_empty(Queue* p_queue)
{
return 0 == p_queue->size;
}
//判满
int is_full(Queue* p_queue)
{
return 0;
}
//入队操作
void push_queue(Queue* p_queue, int data)
{
Node* p_node = create_node(data);
//对列为空,头指针和末尾指针同时指向刚添加的元素
if (1 == is_empty(p_queue))
{
p_queue->p_head = p_node;
p_queue->p_cur = p_node;
p_queue->size++;
return;
}
//队列不为空,直接添加到队列末尾
p_queue->p_cur->p_next = p_node;
//把队列中记录首尾元素的指针指向新的首尾元素
p_queue->p_cur = p_node;
p_queue->size++;
}
//创建一个队列
Queue* create_queue(void)
{
Queue* p_queue = (Queue*)malloc(sizeof(Queue));
p_queue->size = 0;
p_queue->p_head = NULL;
p_queue->p_cur = NULL;
return p_queue;
}
//创建一个节点
Node* create_node(int data)
{
Node* p_node = (Node*)malloc(sizeof(Node));
p_node->p_next = NULL;
p_node->data = data;
return p_node;
}