从书上抄下来的,觉得不错,发给大家看看- /*******************************************************************************
- **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
|