当前位置:   article > 正文

线性表:链式队列算法实现_链队列打印队列中所有元素算法思想

链队列打印队列中所有元素算法思想

链式队列介绍

队列是一种受限制的线性表,有先进先出的特性。那么既然是线性表那肯定对应有2种不同的存储结构咯。链式队列呢,就是采用链式存储结构构成的队列。所以呢本次编写链队列呢 采用以前写的企业级单链表形式编写。不知道企业级单链表?请看数据结构与算法:企业级链表实现(超详细),感觉这种思想超赞,你值得拥有。

链队列相关算法接口

同样采用LinkQueue类型也就是void*类型返回给用户,对用户隐藏底层实现。

  1. #pragma once
  2. #ifndef __LINKQUEUE_H__
  3. #define __LINKQUEUE_H__
  4. typedef void* LinkQueue;
  5. typedef enum { FALSE ,TRUE } Boolean;
  6. //初始化
  7. LinkQueue Init_LinkQueue();
  8. //入队
  9. Boolean Push_LinkQueue(LinkQueue queue, void* data);
  10. //出队
  11. void* Pop_LinkQueue(LinkQueue queue);
  12. //返回队头元素
  13. void* Front_LinkQueue(LinkQueue queue);
  14. //返回队尾元素
  15. void* Rear_LinkQueue(LinkQueue queue);
  16. //返回队元素个数
  17. int Size_LinkQueue(LinkQueue queue);
  18. //返回队是否为空
  19. int IsEmpty_LinkQueue(LinkQueue queue);
  20. //销毁队列
  21. void Destroy_LinkQueue(LinkQueue queue);
  22. #endif

链队列相关算法实现

代码没有什么难的,但是有一点尤其要注意:我们初始化队列的时候,队尾rear指针指向头结点,这样是为了让入队列操作是能通用。那么当我们出队列时候,要判断当前队列是否为空,为空的话,我门的尾指针重新指向头结点

  1. #include "LinkQueue.h"
  2. #include <stdlib.h>
  3. typedef struct QueueNode
  4. {
  5. struct QueueNode * next;
  6. }QueueNode;
  7. typedef struct LQueue
  8. {
  9. QueueNode front;
  10. QueueNode* rear;
  11. int size;
  12. }LQueue;
  13. //初始化
  14. LinkQueue Init_LinkQueue()
  15. {
  16. LQueue* queue = malloc(sizeof(LQueue));
  17. queue->size = 0;
  18. queue->front.next = NULL;
  19. queue->rear = &queue->front;
  20. return queue;
  21. }
  22. //入队 从队尾入队
  23. Boolean Push_LinkQueue(LinkQueue queue, void* data)
  24. {
  25. if (queue == NULL || data == NULL)
  26. {
  27. return FALSE;
  28. }
  29. QueueNode* node = data;
  30. LQueue* myQueue = queue;
  31. myQueue->rear->next = node;
  32. node->next = NULL;
  33. myQueue->rear = node;
  34. myQueue->size++;
  35. return TRUE;
  36. }
  37. //出队 从队头出队
  38. void* Pop_LinkQueue(LinkQueue queue)
  39. {
  40. LQueue* myQueue = queue;
  41. if (queue == NULL || myQueue->size == 0)
  42. {
  43. return NULL;
  44. }
  45. QueueNode* del = myQueue->front.next;
  46. myQueue->front.next = del->next;
  47. if (del->next == NULL)
  48. {
  49. myQueue->rear = &myQueue->front;
  50. }
  51. myQueue->size--;
  52. return del;
  53. }
  54. //返回队头元素
  55. void* Front_LinkQueue(LinkQueue queue)
  56. {
  57. LQueue* myQueue = queue;
  58. if (queue == NULL || myQueue->size == 0)
  59. {
  60. return NULL;
  61. }
  62. QueueNode* front = myQueue->front.next;
  63. return front;
  64. }
  65. //返回队尾元素
  66. void* Rear_LinkQueue(LinkQueue queue)
  67. {
  68. LQueue* myQueue = queue;
  69. if (queue == NULL || myQueue->size == 0)
  70. {
  71. return NULL;
  72. }
  73. return myQueue->rear;
  74. }
  75. //返回队元素个数
  76. int Size_LinkQueue(LinkQueue queue)
  77. {
  78. LQueue* myQueue = queue;
  79. if (queue == NULL)
  80. {
  81. return 0;
  82. }
  83. return myQueue->size;
  84. }
  85. //返回队是否为空
  86. Boolean IsEmpty_LinkQueue(LinkQueue queue)
  87. {
  88. if (Size_LinkQueue(queue) == 0)
  89. {
  90. return TRUE;
  91. }
  92. return FALSE;
  93. }
  94. //销毁队列
  95. void Destroy_LinkQueue(LinkQueue queue)
  96. {
  97. LQueue* myQueue = queue;
  98. if (queue == NULL)
  99. {
  100. return;
  101. }
  102. free(queue);
  103. }

代码运行检测

Main.c测试代码

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "LinkQueue.h"
  5. //测试 数据
  6. typedef struct Person
  7. {
  8. void* node;
  9. char name[64];
  10. int age;
  11. }Person;
  12. int main(int argc, char *argv[])
  13. {
  14. Person p1 = {NULL,"Lily",11 };
  15. Person p2 = {NULL,"Laymond",21 };
  16. Person p3 = {NULL,"John",31 };
  17. Person p4 = {NULL,"Leo",41 };
  18. Person p5 = {NULL,"Zeo",51 };
  19. LinkQueue queue = Init_LinkQueue();
  20. Push_LinkQueue(queue, &p1);
  21. Push_LinkQueue(queue, &p2);
  22. Push_LinkQueue(queue, &p3);
  23. Push_LinkQueue(queue, &p4);
  24. Push_LinkQueue(queue, &p5);
  25. printf("队头元素:name=%s,age=%d\n", ((Person*)Front_LinkQueue(queue))->name, ((Person*)Front_LinkQueue(queue))->age);
  26. printf("队尾元素:name=%s,age=%d\n", ((Person*)Rear_LinkQueue(queue))->name, ((Person*)Rear_LinkQueue(queue))->age);
  27. printf("队列的元素个数:%d\n", Size_LinkQueue(queue));
  28. Person* p = NULL;
  29. printf("将队列的元素依次出队\n");
  30. while (!IsEmpty_LinkQueue(queue))
  31. {
  32. p = Pop_LinkQueue(queue);
  33. printf("name=%s,age=%d\n", p->name, p->age);
  34. }
  35. printf("队列的元素个数:%d\n", Size_LinkQueue(queue));
  36. Destroy_LinkQueue(queue);
  37. return 0;
  38. }

运行结果


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

闽ICP备14008679号