队列

队列是一种先进先出的数据结构,本文在链表的基础上实现队列。

代码

// 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;
}
原文地址:https://www.cnblogs.com/chusiyong/p/15702587.html