数据结构严薇敏——循环队列的顺序存储(C语言)

落日映苍穹つ 2022-05-18 01:54 256阅读 0赞

循环队列和顺序栈类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放数据元素外,还需要定义两个指针分别指向队头和队尾。

它的数据结构定义为:

  1. typedef int ElemType;
  2. typedef struct SqCQueue
  3. {
  4. ElemType *base;
  5. int front;
  6. int rear;
  7. int size; //用来计数当前队列中元素的个数
  8. }SqCQueue;

在非空队列中,头指针始终指向队头元素,尾指针始终指向队尾元素的下一个位置。

20150909084659_0685.jpg

关于循环队列计算元素的个数:

  1. 队列头指针为front,队列尾指针为rear,队列容量为MAX_SIZE
  2. 队空:front == rear
  3. 队满:(rear+1) % MAX_SIZE == front
  4. 队中元素个数:(rear-front+maxsize ) % MAX_SIZE
  5. 入队:rear=(rear+1) % MAX_SIZE ;
  6. 出队:front=(front+1) % MAX_SIZE;

代码

头文件#include”SqCQueue.h”

  1. #ifndef SQCQUEUE_H_INCLUDED
  2. #define SQCQUEUE_H_INCLUDED
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #define MAX_SIZE 20
  6. #define TRUE 1
  7. #define FALSE 0
  8. typedef int ElemType;
  9. typedef struct SqCQueue
  10. {
  11. ElemType *base;
  12. int front;
  13. int rear;
  14. int size; //用来计数当前队列中元素的个数
  15. }SqCQueue;
  16. //初始化一个空队
  17. SqCQueue *Init_CQueue();
  18. //销毁
  19. void Destory_CQueue(SqCQueue *S);
  20. //清空队列
  21. void Clear_CQueue(SqCQueue *S);
  22. //是否为空
  23. int IsEmpty_CQueue(SqCQueue *S);
  24. //队列的长度
  25. int Length_CQueue(SqCQueue *S);
  26. //返回队头元素
  27. ElemType GetHead_CQueue(SqCQueue *S);
  28. //进队
  29. void Enter_CQueue(SqCQueue *S,ElemType e);
  30. //出队
  31. ElemType Delete_CQueue(SqCQueue *S);
  32. //遍历
  33. void Traverse_CQueue(SqCQueue *S);
  34. #endif // SQCQUEUE_H_INCLUDED

头文件函数实现SqCQueue.c:

  1. #include"SqCQueue.h"
  2. //初始化一个空队
  3. SqCQueue *Init_CQueue()
  4. {
  5. SqCQueue *S = (SqCQueue*)malloc(sizeof(SqCQueue));
  6. S->base = (ElemType *)malloc(MAX_SIZE * sizeof(ElemType));
  7. S->front = S->rear = 0;
  8. S->size = 0;
  9. printf("循环队列创建成功!\n");
  10. return S;
  11. }
  12. //销毁
  13. void Destory_CQueue(SqCQueue *S)
  14. {
  15. free(S);
  16. printf("循环队列销毁成功\n");
  17. }
  18. //清空队列
  19. void Clear_CQueue(SqCQueue *S)
  20. {
  21. if(IsEmpty_CQueue(S))
  22. {
  23. printf("队列为空,无需清空!\n");
  24. return;
  25. }
  26. S->front = S->rear = 0;
  27. S->size = 0;
  28. printf("循环队列清空成功\n");
  29. }
  30. //是否为空
  31. int IsEmpty_CQueue(SqCQueue *S)
  32. {
  33. if(S->size == 0)
  34. return TRUE;
  35. else return FALSE;
  36. }
  37. //队列的长度
  38. int Length_CQueue(SqCQueue *S)
  39. {
  40. return S->size;
  41. }
  42. //返回队头元素
  43. ElemType GetHead_CQueue(SqCQueue *S)
  44. {
  45. if(IsEmpty_CQueue(S))
  46. {
  47. printf("队列为空!\n");
  48. return -1;
  49. }
  50. return S->base[S->front];
  51. }
  52. //进队
  53. void Enter_CQueue(SqCQueue *S,ElemType e)
  54. {
  55. if((S->rear + 1) % MAX_SIZE == S->front)
  56. {
  57. printf("队列已满!");
  58. return;
  59. }
  60. S->base[S->rear] = e;
  61. S->rear = (S->rear + 1) % MAX_SIZE;
  62. S->size++;
  63. }
  64. //出队
  65. ElemType Delete_CQueue(SqCQueue *S)
  66. {
  67. ElemType e;
  68. if(IsEmpty_CQueue(S))
  69. {
  70. printf("队列为空!");
  71. return;
  72. }
  73. e = S->base[S->front];
  74. S->front = (S->front + 1) %MAX_SIZE;
  75. S->size--;
  76. return e;
  77. }
  78. //遍历
  79. void Traverse_CQueue(SqCQueue *S)
  80. {
  81. if(IsEmpty_CQueue(S))
  82. {
  83. printf("队列为空!\n");
  84. return;
  85. }
  86. int i;
  87. ElemType f = S->front;
  88. for(i = 0; i < S->size; i++)
  89. {
  90. printf("%d\t",S->base[f]);
  91. f++;
  92. }
  93. printf("\n队列遍历成功!\n");
  94. }

主函数main.c

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include"SqCQueue.h"
  4. void testC() //测试循环队列
  5. {
  6. SqCQueue *S = Init_CQueue();
  7. int i;
  8. for(i = 0;i < 5;i++)
  9. {
  10. Enter_CQueue(S,i);
  11. }
  12. Traverse_CQueue(S);
  13. printf("队列当前的长度为:%d\n",Length_CQueue(S));
  14. printf("删除当前的队头元素为:%d\n\n",Delete_CQueue(S));
  15. Traverse_CQueue(S);
  16. printf("队列当前的长度为:%d\n\n",Length_CQueue(S));
  17. printf("当前的队头元素是:%d\n",GetHead_CQueue(S));
  18. Clear_CQueue(S);
  19. printf("队列当前的长度为:%d\n\n",Length_CQueue(S));
  20. Destory_CQueue(S);
  21. }
  22. int main()
  23. {
  24. testC();
  25. system("pause");
  26. return 0;
  27. }

发表评论

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

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

相关阅读