队列
序
队列是一种先进先出的数据结构,本文在链表的基础上实现队列。
代码
// queue.h
/*********************************************************************************************
* 版权所有 :
* 文件名称 : queue.h
* 文件标识 : 无
* 内容摘要 : 实现队列功能
* 其它说明 : 其它内容的说明
* 当前版本 : V1.00
* 作 者 :
* 完成日期 : 2021-12-16
*********************************************************************************************/
#ifndef __QUEUE_H__
#define __QUEUE_H__
/***************************************************************/
/* 类型定义 */
/***************************************************************/
typedef List Queue;
/***************************************************************/
/* 宏定义 */
/***************************************************************/
#define QUEUE_HEAD_INIT(name) { &(name), &(name) }
#define QUEUE_HEAD(name) Queue name = QUEUE_HEAD_INIT(name)
#define queue_for_each(pos, head) \
for(pos = (head)->next; pos != (head); pos = pos->next)
#define queue_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
/***************************************************************/
/* 函数声明 */
/***************************************************************/
extern void init_queue_head(Queue *q);
extern void queue_add(Queue *q, Queue *head);
extern Queue* queue_front(Queue *head);
extern void queue_rotate(Queue *head);
extern int queue_num(Queue *head);
extern int queue_empty(Queue *head);
#endif
// queue.c
/*********************************************************************************************
* 版权所有 :
* 文件名称 : queue.c
* 文件标识 : 无
* 内容摘要 : 实现队列功能
* 其它说明 : 其它内容的说明
* 当前版本 : V1.00
* 作 者 :
* 完成日期 : 2021-12-16
*********************************************************************************************/
#include "list.h"
#include "queue.h"
/******************************************************************************
* 函数名称: init_queue_head
* 功能描述: 初始化队列
* 其它说明: 无
* 修改记录: 修改日期 修改人 修改内容
* 2021-12-16 创建
******************************************************************************/
void init_queue_head(Queue *q)
{
init_list_head(q);
}
/******************************************************************************
* 函数名称: queue_add
* 功能描述: 向队尾添加元素
* 其它说明: 无
* 修改记录: 修改日期 修改人 修改内容
* 2021-12-16 创建
******************************************************************************/
void queue_add(Queue *q, Queue *head)
{
list_add_tail(q, head);
}
/******************************************************************************
* 函数名称: queue_front
* 功能描述: 获取队头元素
* 其它说明: 无
* 修改记录: 修改日期 修改人 修改内容
* 2021-12-16 创建
******************************************************************************/
Queue* queue_front(Queue *head)
{
return head->next;
}
/******************************************************************************
* 函数名称: queue_rotate
* 功能描述: 将队头元素移动到队尾
* 其它说明: 无
* 修改记录: 修改日期 修改人 修改内容
* 2021-12-16 创建
******************************************************************************/
void queue_rotate(Queue *head)
{
Queue *q = head->next;
list_del(q);
list_add_tail(q, head);
}
/******************************************************************************
* 函数名称: queue_num
* 功能描述: 获取的队列中元素的个数
* 其它说明: 无
* 修改记录: 修改日期 修改人 修改内容
* 2021-12-16 创建
******************************************************************************/
int queue_num(Queue *head)
{
return list_num(head);
}
/******************************************************************************
* 函数名称: queue_empty
* 功能描述: 查看队列是否为空
* 其它说明: 无
* 修改记录: 修改日期 修改人 修改内容
* 2021-12-16 创建
******************************************************************************/
int queue_empty(Queue *head)
{
return list_empty(head);
}
使用
#include <stdio.h>
#include "list.h"
#include "queue.h"
typedef struct node
{
int data;
Queue queue;
}Node;
Node* init_node(int data)
{
Node *pnode = malloc(sizeof(Node));
pnode->data = data;
init_queue_head(&pnode->queue);
return pnode;
}
int main()
{
QUEUE_HEAD(queueHead);
queue_add(&(init_node(5)->queue), &queueHead);
queue_add(&(init_node(6)->queue), &queueHead);
queue_add(&(init_node(7)->queue), &queueHead);
queue_add(&(init_node(8)->queue), &queueHead);
Queue *q = NULL;
Node *nodeA = NULL;
queue_for_each(q, &queueHead)
{
nodeA = list_entry(q, Node, queue);
printf("%d ", nodeA->data);
}
printf("num= %d\n\n", queue_num(&queueHead));
q = NULL;
nodeA = NULL;
q = queue_front(&queueHead);
nodeA = list_entry(q, Node, queue);
printf("%d\n", nodeA->data);
queue_rotate(&queueHead);
q = queue_front(&queueHead);
nodeA = list_entry(q, Node, queue);
printf("%d\n", nodeA->data);
if(queue_empty(&queueHead))
{
printf("queue is empty!\n");
}
return 0;
}