当前位置:   article > 正文

C语言---队列(详解)---数据结构_c语言队列

c语言队列

队列所需要的头文件

先给类型重命名 意义前几篇有讲

队列要用到的两个结构体

第一个结构体里面有 1.存储数据的 a 2.指向下一个节点的指针

 重命名为Queue(这里的名字需要记一下,等会需要分辨两个结构体,结构体两个的功能是不一样的)

第二个结构体里面有 1.指向头的头指针 2.指向尾的尾指针

重命名尾Qnene

 队列实现的函数功能有: 1.初始化队列 2.队尾入数据 3.队头出数据 4.获取队列的有效元素个数 5.判断队列是否为空 6.获取队列头部数据 7.获取队列尾部数据 8.销毁队列

1.初始化队列

初始化我们直接把头和尾置尾空(第一个结构体是包含着第二个结构体的,所以初始化第二个结构体就可以了)

2.队尾入数据

因为是要入数据,所以我们要先申请一个空间(并且把数据放入到新空间中)

入数据是有两种情况

1.第一次入,队列是没有数据的,所以我们要先进行单独处理

直接在头和尾的位置入数据(因为第一次没数据,头和尾是重叠在一起的

2.已经入过了,队列中已经存在其他的数据,所以我们直接在队尾后面入数据

 3.队头出数据

1.若这个队列中只剩下一个数据了,那么我们可以直接删除数据后,并且释放掉整个队列

2.若队列中不止一个数据,那么先存储一个队头的下一个数据,再释放掉对头,再让对头的指针指向存储的数据

 4.获取队列中有效的数据个数

 这把我们使用遍历的方法

1.先定义一个size,用来计算队列中的个数

2.先从队头开始,每次都++size,直接空。

3.最后返回size的个数

 5.判断队列是否为空

用bool类型来返回

我们判断队头是否为空就可以了

 6.获取队头的数据

返回队头用来存储数据的a

7.获取队尾的数据 

返回队尾用来存储数据的a

 8.销毁队列

先创建一个存放队头的(命名为tist),再来一个存放对头的下一个数据(命名为cur)。

先释放tist,再把cur给tist。就此循环

最后把头和尾的指针置空

9.队列的打印

 这里不需要用到单独的函数实现,置需要把前几个实现的函数结合起来用

1.先判断队列是否为空

2.再打印返回的头元素

3.再掉头元素

 这样队列的全部功能就实现了!

接下来是源码,需要自取

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <assert.h>
  5. typedef int STDataType;
  6. typedef struct Quene
  7. {
  8. struct Quene* next;
  9. STDataType a;
  10. }Queue;
  11. typedef struct Qnene
  12. {
  13. Queue* head;
  14. Queue* tail;
  15. }Qnene;
  16. //初始化
  17. void QueueInit(Qnene* q)
  18. {
  19. assert(q);
  20. q->head = q->tail = NULL;
  21. }
  22. void QueuePush(Qnene* q, STDataType data)
  23. {
  24. assert(q);
  25. Queue* newnode = (Queue*)malloc(sizeof(Queue));
  26. newnode->a = data;
  27. newnode->next = NULL;
  28. //如果队列没有数据要做单独处理
  29. if (q->tail == NULL)
  30. {
  31. q->head = q->tail = newnode;
  32. }
  33. //如果队列已经有数据了
  34. else
  35. {
  36. q->tail->next = newnode;
  37. q->tail = newnode;
  38. }
  39. }
  40. void QueuePop(Qnene* q)
  41. {
  42. assert(q);
  43. //如果队列中只有一个数据,那么删除这个数据就是空了
  44. if (q->head->next == NULL)
  45. {
  46. free(q->head);
  47. q->head = q->tail = NULL;
  48. }
  49. else
  50. {
  51. Queue* tist = q->head->next;
  52. free(q->head);
  53. q->head = tist;
  54. }
  55. }
  56. STDataType QueueFront(Qnene* q)
  57. {
  58. assert(q);
  59. return q->head->a;
  60. }
  61. STDataType QueueBack(Qnene* q)
  62. {
  63. assert(q);
  64. return q->tail->a;
  65. }
  66. int QueueSize(Qnene* q)
  67. {
  68. assert(q);
  69. int size = 0;
  70. Queue* tist = q->head;
  71. while (tist)
  72. {
  73. ++size;
  74. tist = tist->next;
  75. }
  76. return size;
  77. }
  78. bool QueueEmpty(Qnene* q)
  79. {
  80. assert(q);
  81. return q->head == NULL;
  82. }
  83. void QueueDestroy(Qnene* q)
  84. {
  85. assert(q);
  86. Queue* tist = q->head;
  87. while (tist)
  88. {
  89. Queue* cur = tist->next;
  90. free(tist);
  91. tist = cur;
  92. }
  93. q->head = q->tail = NULL;
  94. }
  95. void Intenode()
  96. {
  97. Qnene st;
  98. 初始化队列
  99. QueueInit(&st);
  100. 队尾入队列
  101. QueuePush(&st, 1);
  102. QueuePush(&st, 2);
  103. QueuePush(&st, 3);
  104. QueuePush(&st, 4);
  105. 获取队列队尾元素
  106. int size= QueueSize(&st);
  107. printf("队列中有%d个数据\n", size);
  108. 检测队列是否为空
  109. while (!QueueEmpty(&st))
  110. {
  111. 获取队列头部元素
  112. printf("%d ", QueueFront(&st));
  113. 队头出队列
  114. QueuePop(&st);
  115. }
  116. //获取队列尾部元素
  117. //QueueBack(&st);
  118. 销毁队列
  119. QueueDestroy(&st);
  120. }

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

闽ICP备14008679号