| 从书上抄下来的,觉得不错,发给大家看看 /*********************************************************************************File Name   : queue.c**MCU Chip    :**FOSC        :**CCLK        :**Description :**Author      :**Version     :*******************************************************************************/#include "queue.h"/*==============================================================================**                                                                            ****                          FUNCTION PROTOTYPES                               ****                                                                            **==============================================================================*/__STATIC_INLINE void CopyToNode(Node_Type *pq,ITEM item);__STATIC_INLINE void CopyToItem(ITEM *pitem,Node_Type *pq);void  QueueInit(Queue_Type *pq);BOOL  QueueIsFull(const Queue_Type *pq);BOOL  QueueIsEmpty(const Queue_Type *pq);UINT8 QueueItemCnt(const Queue_Type *pq);BOOL  EnQueue(Queue_Type *pq,ITEM item);BOOL  DeQueue(Queue_Type *pq,ITEM *pitem);void  EmptyTheQueue(Queue_Type *pq);/*==============================================================================**                                                                            ****                        GLOBAL VARIABLES                                    ****                                                                            **==============================================================================*//*==============================================================================**                                                                            ****                      LOCAL GLOBAL VARIABLES                                ****                                                                            **==============================================================================*//********************************************************************************Function Name     : QueueInit**Input Parameters  : none**Output Parameters : none**Returned Value    : none**Descrition        : initialize queue******************************************************************************/void QueueInit(Queue_Type *pq){    pq->pfront    = NULL;    pq->prear     = NULL;    pq->ucItemCnt = 0;}/********************************************************************************Function Name     : QueueIsFull**Input Parameters  : the queue base pointer**Output Parameters : none**Returned Value    : 1->full**                    0->not full**Descrition        : initialize queue******************************************************************************/BOOL QueueIsFull(const Queue_Type *pq){    return (QUEUE_SIZE == pq->ucItemCnt);}/********************************************************************************Function Name     : QueueIsEmpty**Input Parameters  : the queue base pointer**Output Parameters : none**Returned Value    : 1 -> empty**                    0 -> not empty**Descrition        : initialize queue******************************************************************************/BOOL QueueIsEmpty(const Queue_Type *pq){    return (0 == pq->ucItemCnt);}/********************************************************************************Function Name     : QueueGetItemCnt**Input Parameters  : the queue base pointer**Output Parameters : none**Returned Value    : 1 -> empty**                    0 -> not empty**Descrition        : initialize queue******************************************************************************/UINT8 QueueItemCnt(const Queue_Type *pq){    return (pq->ucItemCnt);}/********************************************************************************Function Name     : CopyToNode**Input Parameters  : Queue_Type *pq -> the queue base pointer**                    ITEM item      -> the value of item**Output Parameters : none**Returned Value    : none**Descrition        : initialize queue******************************************************************************/__STATIC_INLINE void CopyToNode(Node_Type *pq,ITEM item){    pq->item = item;}/********************************************************************************Function Name     : EnQueue**Input Parameters  : Queue_Type *pq -> the queue base pointer**                    ITEM item      -> the value of item**Output Parameters : none**Returned Value    : 1 -> enqueue successful**                    0 -> enqueue failure**Descrition        : initialize queue******************************************************************************/BOOL EnQueue(Queue_Type *pq,ITEM item){    Node_Type *pnew;    if(QueueIsFull(pq))    {        return FALSE;    }    pnew = (Node_Type *)malloc(sizeof(Node_Type));       //obtain a memory space    if(pnew == NULL)                  //obtain a memory space fail ?    {        return FALSE;    }    CopyToNode(pnew,item);           //copy to node    pnew->pnext = NULL;               //restore pointer    if(QueueIsEmpty(pq))    {        pq->pfront = pnew;            //the new node is the first one    }    else    {        pq->prear->pnext = pnew;      //add to the tail    }    pq->prear = pnew;                 //the new node is the last one    pq->ucItemCnt++;                  //increase the item counter    return TRUE;}/********************************************************************************Function Name     : CopyToNode**Input Parameters  : Queue_Type *pq -> the queue base pointer**                    ITEM item      -> the value of item**Output Parameters : none**Returned Value    : none**Descrition        : initialize queue******************************************************************************/__STATIC_INLINE void CopyToItem(ITEM *pitem,Node_Type *pq){    *pitem = pq->item;}/********************************************************************************Function Name     : DeQueue**Input Parameters  : Queue_Type *pq -> the queue base pointer**                    ITEM item      -> the value of item**Output Parameters : none**Returned Value    : 1 -> dequeue successful**                    0 -> dequeue failure**Descrition        : initialize queue******************************************************************************/BOOL DeQueue(Queue_Type *pq,ITEM *pitem){    Node_Type *pt;    if(QueueIsEmpty(pq))              //the queue is empty ?    {        return FALSE;    }    CopyToItem(pitem,pq->pfront);     //copy the node to item    pt = pq->pfront;                  //get the basic point of the first node    pq->pfront = pq->pfront->pnext;   //now the next node is the first node    free(pt);                         //free the space    pq->ucItemCnt--;    if(0 == pq->ucItemCnt)            //the queue is empty?    {        pq->prear = NULL;    }    return TRUE;}/********************************************************************************Function Name     : EmptyTheQueue**Input Parameters  : Queue_Type *pq -> the queue base pointer**                    ITEM item      -> the value of item**Output Parameters : none**Returned Value    : 1 -> dequeue successful**                    0 -> dequeue failure**Descrition        : initialize queue******************************************************************************/void EmptyTheQueue(Queue_Type *pq){    ITEM dummy;    while(!(QueueIsEmpty(pq)))    {        DeQueue(pq,&dummy);    }}#ifndef _queue_h#define _queue_h#include "type.h"#include "string.h"#include "stdlib.h"/*==============================================================================**                                                                            ****                          IO DEFINITION                                     ****                                                                            **==============================================================================*//*==============================================================================**                                                                            ****                          CONSTANT DEFINITION                               ****                                                                            **==============================================================================*/#define QUEUE_SIZE 10/*==============================================================================**                                                                            ****                          TYPEDEF DEFINITION                                ****                                                                            **==============================================================================*/typedef unsigned char ITEM ;typedef struct node{    ITEM        item;    struct node *pnext;}Node_Type;typedef struct queue{    Node_Type *pfront;     //指向队列首的指针    Node_Type *prear;      //指向队列尾的指针    UINT8     ucItemCnt;     //队列中项目的个数}Queue_Type;/*==============================================================================**                                                                            ****                          FUNCTION PROTOTYPES                               ****                                                                            **==============================================================================*/void  QueueInit(Queue_Type *pq);BOOL  QueueIsFull(const Queue_Type *pq);BOOL  QueueIsEmpty(const Queue_Type *pq);UINT8 QueueItemCnt(const Queue_Type *pq);BOOL  EnQueue(Queue_Type *pq,ITEM item);BOOL  DeQueue(Queue_Type *pq,ITEM *pitem);void  EmptyTheQueue(Queue_Type *pq);#endif
 
 
 
 |