搜索
bottom↓
回复: 39

一个不错的队列代码,发给大家看看

  [复制链接]

出0入0汤圆

发表于 2013-5-15 21:50:21 | 显示全部楼层 |阅读模式
本帖最后由 cyj_0220 于 2013-5-16 09:15 编辑

从书上抄下来的,觉得不错,发给大家看看

  1. /*******************************************************************************
  2. **File Name   : queue.c
  3. **MCU Chip    :
  4. **FOSC        :
  5. **CCLK        :
  6. **Description :
  7. **Author      :
  8. **Version     :
  9. *******************************************************************************/
  10. #include "queue.h"




  11. /*==============================================================================
  12. **                                                                            **
  13. **                          FUNCTION PROTOTYPES                               **
  14. **                                                                            **
  15. ==============================================================================*/
  16. __STATIC_INLINE void CopyToNode(Node_Type *pq,ITEM item);
  17. __STATIC_INLINE void CopyToItem(ITEM *pitem,Node_Type *pq);
  18. void  QueueInit(Queue_Type *pq);
  19. BOOL  QueueIsFull(const Queue_Type *pq);
  20. BOOL  QueueIsEmpty(const Queue_Type *pq);
  21. UINT8 QueueItemCnt(const Queue_Type *pq);
  22. BOOL  EnQueue(Queue_Type *pq,ITEM item);
  23. BOOL  DeQueue(Queue_Type *pq,ITEM *pitem);
  24. void  EmptyTheQueue(Queue_Type *pq);



  25. /*==============================================================================
  26. **                                                                            **
  27. **                        GLOBAL VARIABLES                                    **
  28. **                                                                            **
  29. ==============================================================================*/




  30. /*==============================================================================
  31. **                                                                            **
  32. **                      LOCAL GLOBAL VARIABLES                                **
  33. **                                                                            **
  34. ==============================================================================*/








  35. /******************************************************************************
  36. **Function Name     : QueueInit
  37. **Input Parameters  : none
  38. **Output Parameters : none
  39. **Returned Value    : none
  40. **Descrition        : initialize queue
  41. ******************************************************************************/
  42. void QueueInit(Queue_Type *pq)
  43. {
  44.     pq->pfront    = NULL;
  45.     pq->prear     = NULL;
  46.     pq->ucItemCnt = 0;
  47. }
  48. /******************************************************************************
  49. **Function Name     : QueueIsFull
  50. **Input Parameters  : the queue base pointer
  51. **Output Parameters : none
  52. **Returned Value    : 1->full
  53. **                    0->not full
  54. **Descrition        : initialize queue
  55. ******************************************************************************/
  56. BOOL QueueIsFull(const Queue_Type *pq)
  57. {
  58.     return (QUEUE_SIZE == pq->ucItemCnt);
  59. }
  60. /******************************************************************************
  61. **Function Name     : QueueIsEmpty
  62. **Input Parameters  : the queue base pointer
  63. **Output Parameters : none
  64. **Returned Value    : 1 -> empty
  65. **                    0 -> not empty
  66. **Descrition        : initialize queue
  67. ******************************************************************************/
  68. BOOL QueueIsEmpty(const Queue_Type *pq)
  69. {
  70.     return (0 == pq->ucItemCnt);
  71. }
  72. /******************************************************************************
  73. **Function Name     : QueueGetItemCnt
  74. **Input Parameters  : the queue base pointer
  75. **Output Parameters : none
  76. **Returned Value    : 1 -> empty
  77. **                    0 -> not empty
  78. **Descrition        : initialize queue
  79. ******************************************************************************/
  80. UINT8 QueueItemCnt(const Queue_Type *pq)
  81. {
  82.     return (pq->ucItemCnt);
  83. }
  84. /******************************************************************************
  85. **Function Name     : CopyToNode
  86. **Input Parameters  : Queue_Type *pq -> the queue base pointer
  87. **                    ITEM item      -> the value of item
  88. **Output Parameters : none
  89. **Returned Value    : none
  90. **Descrition        : initialize queue
  91. ******************************************************************************/
  92. __STATIC_INLINE void CopyToNode(Node_Type *pq,ITEM item)
  93. {
  94.     pq->item = item;
  95. }
  96. /******************************************************************************
  97. **Function Name     : EnQueue
  98. **Input Parameters  : Queue_Type *pq -> the queue base pointer
  99. **                    ITEM item      -> the value of item
  100. **Output Parameters : none
  101. **Returned Value    : 1 -> enqueue successful
  102. **                    0 -> enqueue failure
  103. **Descrition        : initialize queue
  104. ******************************************************************************/
  105. BOOL EnQueue(Queue_Type *pq,ITEM item)
  106. {
  107.     Node_Type *pnew;
  108.    
  109.     if(QueueIsFull(pq))
  110.     {
  111.         return FALSE;
  112.     }
  113.     pnew = (Node_Type *)malloc(sizeof(Node_Type));       //obtain a memory space
  114.     if(pnew == NULL)                  //obtain a memory space fail ?                                                                  
  115.     {
  116.         return FALSE;
  117.     }
  118.     CopyToNode(pnew,item);           //copy to node
  119.     pnew->pnext = NULL;               //restore pointer
  120.     if(QueueIsEmpty(pq))
  121.     {
  122.         pq->pfront = pnew;            //the new node is the first one
  123.     }
  124.     else
  125.     {
  126.         pq->prear->pnext = pnew;      //add to the tail
  127.     }
  128.     pq->prear = pnew;                 //the new node is the last one
  129.     pq->ucItemCnt++;                  //increase the item counter
  130.     return TRUE;
  131. }
  132. /******************************************************************************
  133. **Function Name     : CopyToNode
  134. **Input Parameters  : Queue_Type *pq -> the queue base pointer
  135. **                    ITEM item      -> the value of item
  136. **Output Parameters : none
  137. **Returned Value    : none
  138. **Descrition        : initialize queue
  139. ******************************************************************************/
  140. __STATIC_INLINE void CopyToItem(ITEM *pitem,Node_Type *pq)
  141. {
  142.     *pitem = pq->item;
  143. }
  144. /******************************************************************************
  145. **Function Name     : DeQueue
  146. **Input Parameters  : Queue_Type *pq -> the queue base pointer
  147. **                    ITEM item      -> the value of item
  148. **Output Parameters : none
  149. **Returned Value    : 1 -> dequeue successful
  150. **                    0 -> dequeue failure
  151. **Descrition        : initialize queue
  152. ******************************************************************************/
  153. BOOL DeQueue(Queue_Type *pq,ITEM *pitem)
  154. {
  155.     Node_Type *pt;
  156.    
  157.     if(QueueIsEmpty(pq))              //the queue is empty ?
  158.     {
  159.         return FALSE;                 
  160.     }
  161.     CopyToItem(pitem,pq->pfront);     //copy the node to item
  162.     pt = pq->pfront;                  //get the basic point of the first node
  163.     pq->pfront = pq->pfront->pnext;   //now the next node is the first node
  164.     free(pt);                         //free the space
  165.     pq->ucItemCnt--;            
  166.     if(0 == pq->ucItemCnt)            //the queue is empty?
  167.     {
  168.         pq->prear = NULL;
  169.     }
  170.     return TRUE;
  171. }
  172. /******************************************************************************
  173. **Function Name     : EmptyTheQueue
  174. **Input Parameters  : Queue_Type *pq -> the queue base pointer
  175. **                    ITEM item      -> the value of item
  176. **Output Parameters : none
  177. **Returned Value    : 1 -> dequeue successful
  178. **                    0 -> dequeue failure
  179. **Descrition        : initialize queue
  180. ******************************************************************************/
  181. void EmptyTheQueue(Queue_Type *pq)
  182. {
  183.     ITEM dummy;
  184.     while(!(QueueIsEmpty(pq)))
  185.     {
  186.         DeQueue(pq,&dummy);
  187.     }
  188. }

  189. #ifndef _queue_h
  190. #define _queue_h

  191. #include "type.h"
  192. #include "string.h"
  193. #include "stdlib.h"
  194. /*==============================================================================
  195. **                                                                            **
  196. **                          IO DEFINITION                                     **
  197. **                                                                            **
  198. ==============================================================================*/





  199. /*==============================================================================
  200. **                                                                            **
  201. **                          CONSTANT DEFINITION                               **
  202. **                                                                            **
  203. ==============================================================================*/
  204. #define QUEUE_SIZE 10


  205. /*==============================================================================
  206. **                                                                            **
  207. **                          TYPEDEF DEFINITION                                **
  208. **                                                                            **
  209. ==============================================================================*/
  210. typedef unsigned char ITEM ;
  211. typedef struct node{
  212.     ITEM        item;
  213.     struct node *pnext;
  214. }Node_Type;

  215. typedef struct queue{
  216.     Node_Type *pfront;     //指向队列首的指针
  217.     Node_Type *prear;      //指向队列尾的指针
  218.     UINT8     ucItemCnt;     //队列中项目的个数
  219. }Queue_Type;

  220.    






  221. /*==============================================================================
  222. **                                                                            **
  223. **                          FUNCTION PROTOTYPES                               **
  224. **                                                                            **
  225. ==============================================================================*/
  226. void  QueueInit(Queue_Type *pq);
  227. BOOL  QueueIsFull(const Queue_Type *pq);
  228. BOOL  QueueIsEmpty(const Queue_Type *pq);
  229. UINT8 QueueItemCnt(const Queue_Type *pq);
  230. BOOL  EnQueue(Queue_Type *pq,ITEM item);
  231. BOOL  DeQueue(Queue_Type *pq,ITEM *pitem);
  232. void  EmptyTheQueue(Queue_Type *pq);
  233.             
  234. #endif
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 04:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表