• 数据结构:顺序队列,链式对列,循环队列的详细说明


    一、循环队列(queue)

    1.1 概念

    队列是一种先进先出的结构。 FIFO(first in first out)

    1.2 队列的逻辑结构

    线性结构

    1.3 队列的存储结构

    顺序队列是基于顺序标配个两个下标,一个是队列头 front,一个是队列尾 rear。

    顺序队列相当于对顺序表操作的一种约束:一端插入,另一端删除。

    一般这种顺序队列我们不使用,因为 入队列时 rear++ 出队列时 front++

    相当于每块空间指使用了一次,即使出队列了,空间也不会复用了,相当于一次性的。

    1.4d代码实现:

    1.4.1头文件:

    1. #ifndef _SEQ_QUEUE_H_
    2. #define _SEQ_QUEUE_H_
    3. #include
    4. #include
    5. #define N 5
    6. typedef struct _Queue{
    7. int s[N];
    8. int front;
    9. int rear;
    10. }queue_t;
    11. int print_queue(queue_t *my_queue);
    12. int push_queue(queue_t *my_queue, int in_data);
    13. int is_empty(queue_t *my_queue);
    14. int is_full(queue_t* my_queue);
    15. int create_queue(queue_t **p);
    16. int clean_queue(queue_t *my_queue);
    17. int pop_queue(queue_t *my_queue, int *out_data);
    18. #endif

    1.4.2函数文件:

    1. #include "seq_queue.h"
    2. int create_queue(queue_t **p)
    3. {
    4. if (NULL == p){
    5. printf("传参c错误\n");
    6. return -1;
    7. }
    8. *p = (queue_t*)malloc(sizeof(queue_t));
    9. if (*p == NULL){
    10. printf("内存分配失败\n");
    11. exit(-1);
    12. }
    13. (*p)->front = 0;
    14. (*p)->front = 0;
    15. return 0;
    16. }
    17. int is_full(queue_t* my_queue)
    18. {
    19. if (NULL ==my_queue){
    20. printf("传参c错误\n");
    21. return -1;
    22. }
    23. return (my_queue->rear+1)%N == my_queue->front?1:0;
    24. }
    25. int is_empty(queue_t *my_queue)
    26. {
    27. if (NULL ==my_queue){
    28. printf("传参c错误\n");
    29. return -1;
    30. }
    31. return my_queue->front == my_queue->rear?1:0;
    32. }
    33. int push_queue(queue_t *my_queue, int in_data)
    34. {
    35. if (NULL ==my_queue){
    36. printf("传参c错误\n");
    37. return -1;
    38. }
    39. if (is_full(my_queue)){
    40. printf("已经满了\n");
    41. return -1;
    42. }
    43. my_queue->s[my_queue->rear] = in_data;
    44. my_queue->rear = (my_queue->rear + 1)%N;
    45. return 0;
    46. }
    47. int print_queue(queue_t *my_queue)
    48. {
    49. if (NULL ==my_queue){
    50. printf("传参c错误\n");
    51. return -1;
    52. }
    53. for (int i = my_queue->front; (i%N)!=my_queue->rear; i++){
    54. printf("%d ",my_queue->s[i%N]);
    55. }
    56. puts("");
    57. }
    58. int clean_queue(queue_t *my_queue)
    59. {
    60. if (NULL ==my_queue){
    61. printf("传参c错误\n");
    62. return -1;
    63. }
    64. my_queue->front = 0;
    65. my_queue->rear = 0;
    66. }
    67. int pop_queue(queue_t *my_queue, int *out_data)
    68. {
    69. if (NULL ==my_queue){
    70. printf("传参c错误\n");
    71. return -1;
    72. }
    73. *out_data = my_queue->s[my_queue->front];
    74. my_queue->front = (my_queue->front + 1)%N;
    75. return 0;
    76. }
    77. int destroy_queue(queue_t **my_queue)
    78. {
    79. if (my_queue == NULL || *my_queue == NULL){
    80. printf("传参c错误\n");
    81. return -1;
    82. }
    83. free(*my_queue);
    84. *my_queue = NULL;
    85. return 0;
    86. }

    二队列:

    2.1概念:

    链式队列是基于链表实现的。

    链式队列相当于对链表操作的一种约束:一端插入,另一端删除。

    一般使用 尾插头删法。

    2.2循序队列的操作:

    链式队列的操作:

    创建队列

    清空队列

    销毁队列

    入队列

    出队列

    判断队列是否为空

    遍历队列--学习阶段看现象用的

    2.3代码实现:

    2.3.1头文件:

    1. #ifndef _LINK_QUEUE_H_
    2. #define _LINK_QUEUE_H_
    3. #include
    4. #include
    5. typedef struct _Node{
    6. int data;
    7. struct _Node* next;
    8. }node_t;
    9. typedef struct _Queue{
    10. node_t* front;
    11. node_t* rear;
    12. }queue_t;
    13. int print_queue(queue_t *my_queue);
    14. int push_queue(queue_t *my_queue, int in_data);
    15. int create_queue(queue_t **p);
    16. int pop_queue(queue_t *my_queue, int *out_data);
    17. int is_empty(queue_t *my_queue);
    18. int pop_queue(queue_t *my_queue, int *out_data);
    19. int clean_queue(queue_t *my_queue);
    20. #endif

    2.3.2函数文件:

    1. #include "link_queue.h"
    2. int create_queue(queue_t **p)
    3. {
    4. if (p == NULL){
    5. printf("入参为NULL,请检查\n");
    6. return -1;
    7. }
    8. *p = (queue_t*)malloc(sizeof(queue_t));
    9. if (*p == NULL){
    10. printf("内存分配失败\n");
    11. exit(-1);
    12. }
    13. (*p)->front = NULL;
    14. (*p)->rear = NULL;
    15. return 0;
    16. }
    17. int push_queue(queue_t *my_queue, int in_data)
    18. {
    19. if (my_queue == NULL){
    20. printf("入参为NULL,请检查\n");
    21. return -1;
    22. }
    23. node_t* pnew = (node_t*)malloc(sizeof(node_t));
    24. pnew->next = NULL;
    25. pnew->data = in_data;
    26. if (my_queue->front == NULL && my_queue->rear == NULL){
    27. my_queue->front = pnew;
    28. my_queue->rear = pnew;
    29. } else {
    30. my_queue->rear->next = pnew;
    31. my_queue->rear = pnew;
    32. }
    33. return 0;
    34. }
    35. int print_queue(queue_t *my_queue)
    36. {
    37. if (my_queue == NULL){
    38. printf("入参为NULL,请检查\n");
    39. return -1;
    40. }
    41. node_t* temp = my_queue->front;
    42. while (temp!=NULL){
    43. printf("%d ",temp->data);
    44. temp = temp->next;
    45. }
    46. puts("");
    47. return 0;
    48. }
    49. int is_empty(queue_t *my_queue)
    50. {
    51. if (my_queue == NULL){
    52. printf("入参为NULL,请检查\n");
    53. return -1;
    54. }
    55. return my_queue->front == NULL?1:0;
    56. }
    57. int pop_queue(queue_t *my_queue, int *out_data)
    58. {
    59. if (my_queue == NULL){
    60. printf("入参为NULL,请检查\n");
    61. return -1;
    62. }
    63. if (is_empty(my_queue)){
    64. printf("队列为空,不需要出队列\n");
    65. return -1;
    66. }
    67. node_t* temp;
    68. temp = my_queue->front;
    69. my_queue->front = temp->next;
    70. *out_data = temp->data;
    71. free(temp);
    72. temp = NULL;
    73. return 0;
    74. }
    75. int clean_queue(queue_t *my_queue){
    76. if(NULL == my_queue){
    77. printf("入参为NULL, 请检查\n");
    78. return -1;
    79. }
    80. node_t *pdel = NULL;
    81. while(NULL != my_queue->front){
    82. pdel = my_queue->front;
    83. my_queue->front = pdel->next;
    84. free(pdel);
    85. }
    86. pdel = NULL;
    87. my_queue->rear = NULL;
    88. return 0;
    89. }
    90. int destroy_queue(queue_t **my_queue){
    91. if(NULL == my_queue || NULL == *my_queue){
    92. printf("入参为NULL, 请检查\n");
    93. return -1;
    94. }
    95. clean_queue(*my_queue);
    96. free(*my_queue);
    97. *my_queue = NULL;
    98. return 0;
    99. }

  • 相关阅读:
    前端周刊第二十九期
    人力资源小程序
    CoreData + CloudKit 在初始化 Schema 时报错 A Core Data error occurred 的解决
    flutter---->阿里云oss的插件
    概率论与数据统计学习:随机变量(一)——知识总结与C语言案例实现
    使用mysql语句进行子查询
    重点用能单位能耗在线监测接入端系统
    【无标题】
    vue之浏览器存储方法封装实例
    计算机毕业设计Java即时高校信息发布系统(源码+系统+mysql数据库+lw文档)
  • 原文地址:https://blog.csdn.net/a2998658795/article/details/126393943