zoukankan      html  css  js  c++  java
  • 队列

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

    代码

    // 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;
    }
  • 相关阅读:
    知识的本质
    福克斯保养注意事项及驾驶技巧
    转 网络编程
    Linux系统下安装 apache2.4的过程
    代码静态检查工具PCLint运用实践
    gcc编译系统
    量子计算机:决胜21世纪的利器
    关于ETL工具、方案的认识
    《HTTP: The Definitive Guide》读书笔记
    ArrayList(转用法)
  • 原文地址:https://www.cnblogs.com/chusiyong/p/15702587.html
Copyright © 2011-2022 走看看