C实现消息队列Queue

/**
* @file GM_Queue.h
* @brief 采用链表实现,链表的头部为队首, 链表的尾部为队尾, Enqueue在队尾进行操作, Dequeue在队首进行操作
* @author 
* @date 
* @version 
*/
#ifndef _GM_QUEUE_H
#define _GM_QUEUE_H

#include <stdlib.h>

#ifdef __cplusplus
extern"C"
{
#endif /**< __cplusplus */

    /** 
    * @brief GM_Queue_Enqueue 
    * 
    * 入队.
    * @param[in] value 
    * @return int  
    */
    int GM_Queue_Enqueue(int value);

    /** 
    * @brief GM_Queue_Dequeue 
    * 
    * 出队.
    * @param[out] value 
    * @return int  
    */
    int GM_Queue_Dequeue(int* value);

    /** 
    * @brief GM_Queue_Clear 
    * 
    * 清队.
    */
    void GM_Queue_Clear();

    /** 
    * @brief GM_Queue_Length 
    * 
    * 队长.
    * @return int  
    */
    int GM_Queue_Length();
    
#ifdef __cplusplus
}
#endif /**< __cplusplus */

#endif /**< _GM_QUEUE_H */

 

 

/**
* @file GM_Queue.c
* @brief 
* @author 
* @date 
* @version 
*/
#include "GM_Queue.h"
#include <stdio.h>

typedef struct Queue
{
    int value;
    struct Queue* next;
}Queue_Struct;

static Queue_Struct* head = NULL;
static Queue_Struct* tail = NULL;
static int count = 0;

int GM_Queue_Enqueue( int value )
{
    Queue_Struct* tmp = (Queue_Struct*)malloc(sizeof(Queue_Struct));

    if (NULL == tmp)
    {
        return -1;
    }

    tmp->value = value;
    tmp->next = NULL;

    if (NULL == tail)
    {
        head = tmp;
    }
    else
    {
        tail->next = tmp;
    }

    tail = tmp;
    ++count;

    return 1;
}

int GM_Queue_Dequeue( int* value )
{
    Queue_Struct* tmp = NULL;

    if ((NULL == head) || (NULL == value))
    {
        return -1;
    }

    *value = head->value;
    tmp = head;

    if (head == tail)
    {
        head = NULL;
        tail = NULL;
    }
    else
    {
        head = head->next;
    }

    free(tmp);
    tmp = NULL;

    --count;

    return 1;
}

void GM_Queue_Clear()
{
    int i     = 0;
    int value = 0;

    while (count > 0)
    {
        GM_Queue_Dequeue(&value);
    }
}

int GM_Queue_Length()
{
    return count;
}

void main()
{   
    int i     = 0;
    int rt    = -1;
    int value = 0;

    for (i = 0; i < 10; ++i)
    {
        rt = GM_Queue_Enqueue(i);
        printf("ENQUEUE rt=%d: value=%d\n", rt, i);
    }

    printf("COUNT=%d\n", GM_Queue_Length());

    for (i = 0; i < 10; ++i)
    {
        rt = GM_Queue_Dequeue(&value);
        printf("DEQUEUE rt=%d: value=%d\n", rt, value);
    }

    rt = GM_Queue_Dequeue(&value);
    printf("DEQUEUE rt=%d: value=%d\n", rt, value);

    for (i = 0; i < 10; ++i)
    {
        rt = GM_Queue_Enqueue(i);
        printf("ENQUEUE rt=%d: value=%d\n", rt, i);
    }

    GM_Queue_Clear();

    printf("COUNT=%d\n", GM_Queue_Length());

}

转载于:https://my.oschina.net/kaixindewo/blog/30424

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值