当前位置:   article > 正文

数据结构——队列(链表实现)

数据结构——队列(链表实现)

一、队列的特点

先进先出

二、队列的代码

  1. typedef int QDataType;
  2. // 链式结构:表示队列
  3. typedef struct QListNode
  4. {
  5. struct QListNode* next;
  6. QDataType data;
  7. }QNode;
  8. // 队列的结构
  9. typedef struct Queue
  10. {
  11. QNode* front; //指向队列的第一个结点
  12. QNode* rear;//指向队列的最后一个结点
  13. int size;//记录队列中一共有几个元素
  14. }Queue;
  15. // 初始化队列
  16. void QueueInit(Queue* q);
  17. // 队尾入队列
  18. void QueuePush(Queue* q, QDataType data);
  19. // 队头出队列
  20. void QueuePop(Queue* q);
  21. // 获取队列头部元素
  22. QDataType QueueFront(Queue* q);
  23. // 获取队列队尾元素
  24. QDataType QueueBack(Queue* q);
  25. // 获取队列中有效元素个数
  26. int QueueSize(Queue* q);
  27. // 检测队列是否为空,如果为空返回非零结果,如果非空返回0
  28. int QueueEmpty(Queue* q);
  29. // 销毁队列
  30. void QueueDestroy(Queue* q);
  31. // 初始化队列
  32. void QueueInit(Queue* q)
  33. {
  34. assert(q);
  35. q->front = NULL; //初始化为NULL
  36. q->rear = NULL;//初始化为NULL
  37. q->size = 0; //初始化个数为0
  38. }
  39. // 队尾入队列
  40. void QueuePush(Queue* q, QDataType data)
  41. {
  42. assert(q);
  43. QNode* newnode = (QNode*)malloc(sizeof(QNode));//申请新的结点
  44. if (newnode == NULL)
  45. {
  46. perror("malloc fail");
  47. return;
  48. }
  49. newnode->data = data;
  50. newnode->next = NULL;
  51. if (q->front == NULL) //如果front指针指向的是NULL,说明插入前队列是空队列
  52. {
  53. q->front = newnode;
  54. q->rear = newnode;
  55. }
  56. else //front指向的不是NULL,说明不是空队列
  57. {
  58. q->rear->next = newnode;
  59. q->rear = newnode;
  60. }
  61. q->size++; //插入完,个数加1
  62. }
  63. // 队头出队列
  64. void QueuePop(Queue* q)//出队就是头删
  65. {
  66. assert(q);
  67. assert(q->size != 0);//队列不为空
  68. QNode* head = q->front; //找到头结点
  69. if (head->next == NULL)//如果出队之前,前队列只有一个结点
  70. {
  71. free(head); //释放头结点,后front 和rear都要指向NULL,表示现在是空队列
  72. head = NULL;
  73. q->front = q->rear = NULL;
  74. q->size = 0; //个数置为0
  75. return;
  76. }
  77. else //出队前,队列有两个及其以上的结点数
  78. {
  79. QNode* del = head;
  80. head = head->next; //更新头结点
  81. free(del);
  82. del = NULL;
  83. q->front = head; //将front 指向更新后的头结点
  84. q->size--;//个数减1
  85. }
  86. }
  87. // 获取队列头部元素
  88. QDataType QueueFront(Queue* q)
  89. {
  90. assert(q);
  91. return q->front->data;
  92. }
  93. // 获取队列队尾元素
  94. QDataType QueueBack(Queue* q)
  95. {
  96. assert(q);
  97. return q->rear->data;
  98. }
  99. // 获取队列中有效元素个数
  100. int QueueSize(Queue* q)
  101. {
  102. assert(q);
  103. return q->size;
  104. }
  105. // 检测队列是否为空,如果为空返回非零结果,如果非空返回0
  106. int QueueEmpty(Queue* q)
  107. {
  108. assert(q);
  109. if (q->front == NULL)//队列为空,返回1
  110. return 1;
  111. else
  112. return 0;
  113. }
  114. // 销毁队列
  115. void QueueDestroy(Queue* q)
  116. {
  117. assert(q);
  118. QNode* del = q->front; //如果是空队列,就直接返回NULL,不要释放结点
  119. if (del == NULL)
  120. {
  121. ;
  122. }
  123. else
  124. {
  125. QNode* cur = del->next;
  126. while (del != NULL) //逐个释放结点
  127. {
  128. free(del);
  129. del = cur;
  130. if (cur != NULL)
  131. cur = cur->next;
  132. }
  133. }
  134. //队头指针和队尾指针都是要置NULL的,size都是要置为0
  135. q->front = q->rear = NULL;
  136. q->size = 0;
  137. }

三、队列的函数测试

1.取队头函数 QueueFront

  1. int main()
  2. {
  3. Queue Q;
  4. QueueInit(&Q);// 初始化队列
  5. QueuePush(&Q, 1);// 队尾入队列
  6. QueuePush(&Q, 2);// 队尾入队列
  7. QueuePush(&Q, 3);// 队尾入队列
  8. QueuePush(&Q,4);// 队尾入队列
  9. QDataType x= QueueFront(&Q);// 获取队列头部元素
  10. printf("队头元素是%d \n", x);
  11. QueueDestroy(&Q);// 销毁队列
  12. return 0;
  13. }

结果:

 

2.取队尾函数QueueBack

  1. int main()
  2. {
  3. Queue Q;
  4. QueueInit(&Q);// 初始化队列
  5. QueuePush(&Q, 1);// 队尾入队列
  6. QueuePush(&Q, 2);// 队尾入队列
  7. QueuePush(&Q, 3);// 队尾入队列
  8. QueuePush(&Q,4);// 队尾入队列
  9. QDataType y= QueueBack(&Q); // 获取队列队尾元素
  10. printf("队尾元素是%d \n", y);
  11. QueueDestroy(&Q);// 销毁队列
  12. return 0;
  13. }

 结果:

3.求队列中元素个数 函数 QueueSize(&Q)

  1. int main()
  2. {
  3. Queue Q;
  4. QueueInit(&Q);// 初始化队列
  5. QueuePush(&Q, 1);// 队尾入队列
  6. QueuePush(&Q, 2);// 队尾入队列
  7. QueuePush(&Q, 3);// 队尾入队列
  8. QueuePush(&Q,4);// 队尾入队列
  9. int z= QueueSize(&Q); // 获取队列中有效元素个数
  10. printf("一共有%d个成员 \n", z);
  11. QueueDestroy(&Q);// 销毁队列
  12. return 0;
  13. }

 结果;

 4.出队函数QueuePop(头删)

  1. int main()
  2. {
  3. Queue Q;
  4. QueueInit(&Q);// 初始化队列
  5. QueuePush(&Q, 1);// 队尾入队列
  6. QueuePush(&Q, 2);// 队尾入队列
  7. QueuePush(&Q, 3);// 队尾入队列
  8. QueuePush(&Q,4);// 队尾入队列
  9. QueuePop(&Q);// 队头出队列
  10. QueuePop(&Q);// 队头出队列
  11. while (!QueueEmpty(&Q))
  12. {
  13. printf("%d ", QueueFront(&Q));
  14. QueuePop(&Q);
  15. }
  16. return 0;
  17. }

结果:

原来 1 2 3 4 入队  出队两次, 变成  3 4 .

 

5.判断队列是否为空的函数QueueEmpty(不为空就会依次出队)

  1. int main()
  2. {
  3. Queue Q;
  4. QueueInit(&Q);// 初始化队列
  5. QueuePush(&Q, 1);// 队尾入队列
  6. QueuePush(&Q, 2);// 队尾入队列
  7. QueuePush(&Q, 3);// 队尾入队列
  8. QueuePush(&Q,4);// 队尾入队列
  9. while (!QueueEmpty(&Q)) //队列不为空,就会依次出队
  10. {
  11. printf("%d ", QueueFront(&Q));
  12. QueuePop(&Q);//依次出队
  13. }
  14. printf("所有成员出完队后\n");
  15. int w= QueueEmpty(&Q);
  16. if (w != 0)
  17. printf("队列已经空了");
  18. return 0;
  19. }

结果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/572803
推荐阅读
相关标签
  

闽ICP备14008679号