当前位置:   article > 正文

队列的实现(c语言数据结构)_c队列实现

c队列实现

目录

一、需要实现的功能

二、具体功能的实现

1.初始化队列

2.摧毁我们的队列

3.入队操作

4.出队操作

5.判断队列是否为空

6.查看我们队列元素的个数

7.输出队首和队尾元素

8.汇总


一、需要实现的功能

以下是我们队列需要实现的功能

  1. #pragma once
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5. #include <assert.h>
  6. typedef int QDataType;
  7. //定义我们队列的结点
  8. typedef struct QueueNode
  9. {
  10. QDataType data;
  11. struct QueueNode* next;
  12. }QNode;
  13. //定义一个队列类型,并且给我们的队列定义头指针和尾指针
  14. typedef struct Queue
  15. {
  16. QNode* head;
  17. QNode* tail;
  18. }Queue;
  19. //队列初始化
  20. void QueueInit(Queue* pq);
  21. //摧毁队列
  22. void QueueDestory(Queue* pq);
  23. //元素入队
  24. void QueuePush(Queue* pq, QDataType x);
  25. //元素出队
  26. void QueuePop(Queue* pq);
  27. //判断当前队列是否为空
  28. bool QueueEmpty(Queue* pq);
  29. //判断队列的大小
  30. size_t QueueSize(Queue* pq);
  31. //获取队首元素
  32. QDataType QueueFront(Queue* pq);
  33. //获取队尾元素
  34. QDataType QueueBack(Queue* pq);

二、具体功能的实现

1.初始化队列

将我们的队首指针和队尾指针全部都置空

  1. void QueueInit(Queue* pq)
  2. {
  3. assert(pq);
  4. pq->head = pq->tail = NULL;
  5. }

2.摧毁我们的队列

  1. void QueueDestory(Queue* pq)
  2. {
  3. assert(pq);
  4. //创建一个临时指针指向我们队伍的头
  5. QNode* cur = pq->head;
  6. while (cur)
  7. {
  8. //用next指针记录下我们临时指针的下一个结点
  9. QNode* next = cur->next;
  10. //将我们的临时指针置空
  11. free(cur);
  12. //将我们的cur指针指向下一个需要释放空间的位置,实现迭代。
  13. cur = next;
  14. }
  15. pq->head = pq->tail = NULL;
  16. }

3.入队操作

  1. void QueuePush(Queue* pq, QDataType x)
  2. {
  3. assert(pq);
  4. //开辟一片的新的空间作为新的结点
  5. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  6. assert(newnode);
  7. //将我们的新的结点的数据传入
  8. newnode->data = x;
  9. //将我们新的结点的next指针置空
  10. newnode->next = NULL;
  11. //队列都是从队尾入队的,我们需要从队尾尾插我们的结点。
  12. if (pq->tail == NULL)
  13. {
  14. assert(pq->head == NULL);
  15. pq->head = pq->tail = newnode;
  16. }
  17. else
  18. {
  19. pq->tail->next = newnode;
  20. pq->tail = newnode;
  21. }
  22. }

4.出队操作

  1. void QueuePop(Queue* pq)
  2. {
  3. assert(pq);
  4. assert(pq->head && pq->tail);
  5. //队列的出队操作是在队首,同时将我们的队首的结点空间释放
  6. if (pq->head->next == NULL)
  7. {
  8. free(pq->head);
  9. pq->head = pq->tail = NULL;
  10. }
  11. else
  12. {
  13. QNode* next = pq->head->next;
  14. free(pq->head);
  15. pq->head = next;
  16. }
  17. }

5.判断队列是否为空

  1. bool QueueEmpty(Queue* pq)
  2. {
  3. assert(pq);
  4. //判断时否为空,只需要判断我们的头指针是否为NULL就可以了
  5. return pq->head == NULL;
  6. }

6.查看我们队列元素的个数

  1. size_t QueueSize(Queue* pq)
  2. {
  3. assert(pq);
  4. //创建一个临时结点指向我们的头结点,然后遍历完整张队列,就能够得到我们队列的长度
  5. QNode* cur = pq->head;
  6. size_t size = 0;
  7. while (cur)
  8. {
  9. size++;
  10. cur = cur->next;
  11. }
  12. return size;
  13. }

7.输出队首和队尾元素

  1. //因为我们有队首指针和队尾指针,所以直接返回队首指针和队尾指针指向的结点的数据
  2. QDataType QueueFront(Queue* pq)
  3. {
  4. assert(pq);
  5. assert(pq->head);
  6. return pq->head->data;
  7. }
  8. QDataType QueueBack(Queue* pq)
  9. {
  10. assert(pq);
  11. assert(pq->tail);
  12. return pq->tail->data;
  13. }

8.汇总

以下是写在queue.c中的内容。

  1. #include "queue.h"
  2. void QueueInit(Queue* pq)
  3. {
  4. assert(pq);
  5. pq->head = pq->tail = NULL;
  6. }
  7. void QueueDestory(Queue* pq)
  8. {
  9. assert(pq);
  10. QNode* cur = pq->head;
  11. while (cur)
  12. {
  13. QNode* next = cur->next;
  14. free(cur);
  15. cur = next;
  16. }
  17. pq->head = pq->tail = NULL;
  18. }
  19. void QueuePush(Queue* pq, QDataType x)
  20. {
  21. assert(pq);
  22. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  23. assert(newnode);
  24. newnode->data = x;
  25. newnode->next = NULL;
  26. if (pq->tail == NULL)
  27. {
  28. assert(pq->head == NULL);
  29. pq->head = pq->tail = newnode;
  30. }
  31. else
  32. {
  33. pq->tail->next = newnode;
  34. pq->tail = newnode;
  35. }
  36. }
  37. void QueuePop(Queue* pq)
  38. {
  39. assert(pq);
  40. assert(pq->head && pq->tail);
  41. if (pq->head->next == NULL)
  42. {
  43. free(pq->head);
  44. pq->head = pq->tail = NULL;
  45. }
  46. else
  47. {
  48. QNode* next = pq->head->next;
  49. free(pq->head);
  50. pq->head = next;
  51. }
  52. }
  53. bool QueueEmpty(Queue* pq)
  54. {
  55. assert(pq);
  56. //return pq->head == NULL && pq->tail == NULL;
  57. return pq->head == NULL;
  58. }
  59. size_t QueueSize(Queue* pq)
  60. {
  61. assert(pq);
  62. QNode* cur = pq->head;
  63. size_t size = 0;
  64. while (cur)
  65. {
  66. size++;
  67. cur = cur->next;
  68. }
  69. return size;
  70. }
  71. QDataType QueueFront(Queue* pq)
  72. {
  73. assert(pq);
  74. assert(pq->head);
  75. return pq->head->data;
  76. }
  77. QDataType QueueBack(Queue* pq)
  78. {
  79. assert(pq);
  80. assert(pq->tail);
  81. return pq->tail->data;
  82. }

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

闽ICP备14008679号