鱼C论坛

 找回密码
 立即注册
查看: 2449|回复: 0

[学习笔记] 抽象数据类型之队列ADT接口包

[复制链接]
发表于 2016-9-6 00:52:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个是队列ADT的接口包了,只是一些简单的功能。以后需要什么再向里面添加就行。
  1. //queue.h -- 队列接口头文件

  2. #ifndef _QUEUE_H_
  3. #define _QUEUE_H_

  4. #include <stdbool.h>

  5. /*在这里键入Item的类型定义*/
  6. //例如
  7. typedef int Item;

  8. #define MAXQUEUE 10                //队列的最大长度

  9. typedef        struct node
  10. {
  11.         Item item;
  12.         struct node * next;
  13. } Node;

  14. typedef struct queue
  15. {
  16.         Node * front;                //指向队列首的指针
  17.         Node * rear;                //指向队列尾的指针
  18.         int items;                        //队列中项目的个数
  19. } Queue;

  20. /*操作:初始化队列
  21. 操作前:pq指向一个队列
  22. 操作后:该队列被初始化为空队列*/
  23. void InitializeQueue(Queue * pq);


  24. /*操作:检查队列是否为空
  25. 操作前:pq指向一个已初始化的队列
  26. 操作后:如果队列为空,则返回true;
  27. 否则返回false*/
  28. bool QueueIsEmpty(const Queue * pq);


  29. /*操作:检查队列是否已满
  30. 操作前:pq指向一个已初始化的队列
  31. 操作后:如果队列已满,则返回true;
  32. 否则返回false*/
  33. bool QueueIsFull(const Queue * pq);


  34. /*操作:确定队列中项目的个数
  35. 操作前:pq指向一个已初始化的队列
  36. 操作后:返回一个队列中项目的个数*/
  37. int QueueItemCount(const Queue * pq);


  38. /*操作:向队列尾端添加项目
  39. 操作前:pq指向一个已初始化的队列
  40. item是要添加到队列尾的项目
  41. 操作后:如果队列未满,则将该项目
  42. 添加到队列尾,函数返回true;否则
  43. 返回false*/
  44. bool EnQueue(Item item, Queue * pq);


  45. /*操作:从队列首端删除项目
  46. 操作前:pq指向一个已初始化的队列
  47. 操作后:如果队列非空,队列首端的
  48. 项目被复制到*pitem,并从队列中删
  49. 除,函数返回true;如果这个操作使
  50. 队列为空,把队列重置为空队列
  51. 如果队列开始时为空,不改变队列,
  52. 函数返回false*/
  53. bool DeQueue(Item * pitem, Queue * pq);


  54. /*操作:清空队列
  55. 操作前:pq指向一个已经初始化的队列
  56. 操作后:队列被清空*/
  57. void EmptyTheQueue(Queue * pq);


  58. #endif // !_QUEUE_H_
复制代码
  1. //queue.c -- 队列类型的实现文件

  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "queue.h"


  5. /*局部函数*/
  6. static void CopyToNode(Item item, Node * pnode);
  7. static void CopyToItem(Node * pnode, Item * pitem);

  8. void InitializeQueue(Queue * pq)
  9. {
  10.         pq->front = pq->rear = NULL;
  11.         pq->items = 0;
  12. }

  13. bool QueueIsEmpty(const Queue * pq)
  14. {
  15.         return pq->items == 0;
  16. }

  17. bool QueueIsFull(const Queue * pq)
  18. {
  19.         return pq->items == MAXQUEUE;
  20. }

  21. int QueueItemCount(const Queue * pq)
  22. {
  23.         return pq->items;
  24. }

  25. bool EnQueue(Item item, Queue * pq)
  26. {
  27.         Node * pnew;

  28.         if (QueueIsFull(pq))
  29.         {
  30.                 return false;
  31.         }

  32.         pnew = (Node *)malloc(sizeof(Node));
  33.         if (pnew == NULL)
  34.         {
  35.                 fprintf(stderr, "Unable to allocate memory.\n");
  36.                 exit(EXIT_FAILURE);
  37.         }

  38.         CopyToNode(item, pnew);
  39.         pnew->next = NULL;
  40.         if (QueueIsEmpty(pq))
  41.         {
  42.                 pq->front = pnew;                        //项目位于队列首端
  43.         }
  44.         else
  45.         {
  46.                 pq->rear->next = pnew;                //项目链接到队列尾端
  47.         }
  48.         pq->rear = pnew;                                //尾指针指向尾节点
  49.         pq->items++;                                        //项目数 + 1

  50.         return true;
  51. }

  52. bool DeQueue(Item * pitem, Queue * pq)
  53. {
  54.         Node * pt;

  55.         if (QueueIsEmpty(pq))
  56.         {
  57.                 return false;
  58.         }

  59.         CopyToItem(pq->front, pitem);
  60.         pt = pq->front;
  61.         pq->front = pq->front->next;
  62.         free(pt);
  63.         pq->items--;
  64.         if (pq->items == 0)
  65.         {
  66.                 pq->rear = NULL;
  67.         }
  68.        
  69.         return true;
  70. }

  71. void EmptyTheQueue(Queue * pq)
  72. {
  73.         Item item;

  74.         while (!QueueIsEmpty(pq))
  75.         {
  76.                 DeQueue(&item, pq);
  77.         }
  78. }

  79. //局部函数定义
  80. static void CopyToNode(Item item, Node * pnode)
  81. {
  82.         pnode->item = item;
  83. }

  84. static void CopyToItem(Node * pnode, Item * pitem)
  85. {
  86.         *pitem = pnode->item;
  87. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-16 09:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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