数据结构——链式队列(C语言)

队列

队列和栈一样是一种线性表变异体。现实中很多情况下都要排队,先来后到,队列就是类似这种情况的一种数据结构,数据只允许从同一端插入,删除只允许从另一端删除,插入操作叫 入队 ,删除操作叫出队;插入的一端叫队尾,删除的一端叫队头。队列可以用顺序存储链式存储实现。顺序储存方式一般是用数组实现,一般的实现方式也就是所说的环形缓冲区就是顺序存储方式实现的FIFO
在这里插入图片描述

链式存储实现代码

  • 数据结构
typedef struct _data_node
{
    int data;
    struct _data_node *next;
}data_node_t;

typedef struct _link_queue
{
    data_node_t *front;           //队头
    data_node_t *rear;            //队尾
    int queue_size;               //队列大小
    int queue_count;              //队列数据计数
}link_queue_t;
  • 队列是否为空
static int is_queue_empty(link_queue_t *q)
{
    return (q->queue_count == 0);
}
  • 队列是否满
static int is_queue_full(link_queue_t *q)
{
    return ( q->queue_count >= q->queue_size );
}
  • 队列初始化
int link_queue_init(link_queue_t *q, int queue_size)
{
    if(!q || queue_size <= 0)
        return -1;
   	
    q->front       = NULL;
    q->rear        = NULL;
    q->queue_count = 0;
    q->queue_size  = queue_size;
}
  • 队列解初始化
int link_queue_deinit(link_queue_t *q)
{
    if(!q)
        return -1;
    
    if(is_queue_empty(q))
    {
        q->front       = NULL;
        q->rear        = NULL;
        q->queue_count = 0;
        q->queue_size  = 0;
    }
    else
    {
        data_node_t *node = q->front;
        for(int i = 0; ( (i < q->queue_count) && !node); i++, node = node->next)
        {
            data_node_deinit(node);
        }
    }
    return 0;
}
  • 入队
/************************************************************************
  * @brief:         enter queue
  * @param[in]:     None
  * @retval[out]:   None
  * @note:            
  * @author:        guangjieMVP
**************************************************************************/
int link_queue_en(link_queue_t *q, int val)
{
    if(!q)
        return -1;

    data_node_t *d = data_node_init(val);
    if(!d)
        return -1;

    if(is_queue_full(q))
        return -1;

    if(is_queue_empty(q))
    {
        q->rear  = d;
        q->front = d;
        q->queue_count++;
    }
    else
    {
        q->rear->next = d;
        q->rear       = d;
        q->queue_count++;
    }
    return 0;
}
  • 出队
/************************************************************************
  * @brief:         out queue
  * @param[in]:     None
  * @retval[out]:   None
  * @note:            
  * @author:        guangjieMVP
**************************************************************************/
int link_queue_out(link_queue_t *q, int *val)
{
    data_node_t *node;

    if(!q)
        return -1;

    if(is_queue_empty(q))
        return -1;

    node     = q->front;
    q->front = node->next;
    *val     = node->data;
    q->queue_count--;
    data_node_deinit(node);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36413982/article/details/104818875