数据结构-链式队列的实现

青旅半醒 2022-08-24 11:46 262阅读 0赞

头文件Queue.h

  1. #ifndef Queue_H
  2. #define Queue_H
  3. typedef int Item;
  4. typedef struct node * PNode;
  5. typedef struct node
  6. {
  7. Item data;
  8. PNode next;
  9. }Node;
  10. typedef struct
  11. {
  12. PNode front;
  13. PNode rear;
  14. int size;
  15. }Queue;
  16. /*构造一个空队列*/
  17. Queue *InitQueue();
  18. /*销毁一个队列*/
  19. void DestroyQueue(Queue *pqueue);
  20. /*清空一个队列*/
  21. void ClearQueue(Queue *pqueue);
  22. /*判断队列是否为空*/
  23. int IsEmpty(Queue *pqueue);
  24. /*返回队列大小*/
  25. int GetSize(Queue *pqueue);
  26. /*返回队头元素*/
  27. PNode GetFront(Queue *pqueue,Item *pitem);
  28. /*返回队尾元素*/
  29. PNode GetRear(Queue *pqueue,Item *pitem);
  30. /*将新元素入队*/
  31. PNode EnQueue(Queue *pqueue,Item item);
  32. /*队头元素出队*/
  33. PNode DeQueue(Queue *pqueue,Item *pitem);
  34. /*遍历队列并对各数据项调用visit函数*/
  35. void QueueTraverse(Queue *pqueue,void (*visit)());
  36. #endif

实现代码Queue.c如下:

  1. #include"Queue.h"
  2. #include<malloc.h>
  3. #include<stdio.h>
  4. /*构造一个空队列*/
  5. Queue *InitQueue()
  6. {
  7. Queue *pqueue = (Queue *)malloc(sizeof(Queue));
  8. if(pqueue!=NULL)
  9. {
  10. pqueue->front = NULL;
  11. pqueue->rear = NULL;
  12. pqueue->size = 0;
  13. }
  14. return pqueue;
  15. }
  16. /*销毁一个队列*/
  17. void DestroyQueue(Queue *pqueue)
  18. {
  19. if(IsEmpty(pqueue)!=1)
  20. ClearQueue(pqueue);
  21. free(pqueue);
  22. }
  23. /*清空一个队列*/
  24. void ClearQueue(Queue *pqueue)
  25. {
  26. while(IsEmpty(pqueue)!=1)
  27. {
  28. DeQueue(pqueue,NULL);
  29. }
  30. }
  31. /*判断队列是否为空*/
  32. int IsEmpty(Queue *pqueue)
  33. {
  34. if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)
  35. return 1;
  36. else
  37. return 0;
  38. }
  39. /*返回队列大小*/
  40. int GetSize(Queue *pqueue)
  41. {
  42. return pqueue->size;
  43. }
  44. /*返回队头元素*/
  45. PNode GetFront(Queue *pqueue,Item *pitem)
  46. {
  47. if(IsEmpty(pqueue)!=1&&pitem!=NULL)
  48. {
  49. *pitem = pqueue->front->data;
  50. }
  51. return pqueue->front;
  52. }
  53. /*返回队尾元素*/
  54. PNode GetRear(Queue *pqueue,Item *pitem)
  55. {
  56. if(IsEmpty(pqueue)!=1&&pitem!=NULL)
  57. {
  58. *pitem = pqueue->rear->data;
  59. }
  60. return pqueue->rear;
  61. }
  62. /*将新元素入队*/
  63. PNode EnQueue(Queue *pqueue,Item item)
  64. {
  65. PNode pnode = (PNode)malloc(sizeof(Node));
  66. if(pnode != NULL)
  67. {
  68. pnode->data = item;
  69. pnode->next = NULL;
  70. if(IsEmpty(pqueue))
  71. {
  72. pqueue->front = pnode;
  73. }
  74. else
  75. {
  76. pqueue->rear->next = pnode;
  77. }
  78. pqueue->rear = pnode;
  79. pqueue->size++;
  80. }
  81. return pnode;
  82. }
  83. /*队头元素出队*/
  84. PNode DeQueue(Queue *pqueue,Item *pitem)
  85. {
  86. PNode pnode = pqueue->front;
  87. if(IsEmpty(pqueue)!=1&&pnode!=NULL)
  88. {
  89. if(pitem!=NULL)
  90. *pitem = pnode->data;
  91. pqueue->size--;
  92. pqueue->front = pnode->next;
  93. free(pnode);
  94. if(pqueue->size==0)
  95. pqueue->rear = NULL;
  96. }
  97. return pqueue->front;
  98. }
  99. /*遍历队列并对各数据项调用visit函数*/
  100. void QueueTraverse(Queue *pqueue,void (*visit)())
  101. {
  102. PNode pnode = pqueue->front;
  103. int i = pqueue->size;
  104. while(i--)
  105. {
  106. visit(pnode->data);
  107. pnode = pnode->next;
  108. }
  109. }

简单测试程序Test.c

  1. #include"Queue.h"
  2. #include<stdio.h>
  3. void print(Item i)
  4. {
  5. printf("该节点元素为%d\n",i);
  6. }
  7. main()
  8. {
  9. Queue *pq = InitQueue();
  10. int i,item;
  11. printf("0-9依次入队并输出如下:\n");
  12. for(i=0;i<10;i++)
  13. {
  14. EnQueue(pq,i);
  15. GetRear(pq,&item);
  16. printf("%d ",item);
  17. }
  18. printf("\n从队头到队尾遍历并对每个元素执行print函数:\n");
  19. QueueTraverse(pq,print);
  20. printf("队列中元素依次出队列并输出如下:\n");
  21. for(i=0;i<10;i++)
  22. {
  23. DeQueue(pq,&item);
  24. printf("%d ",item);
  25. }
  26. ClearQueue(pq);
  27. if(IsEmpty(pq))
  28. printf("\n将队列置空成功\n");
  29. DestroyQueue(pq);
  30. printf("队列已被销毁\n");
  31. }

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读