当前位置:   article > 正文

队列——C语言(链表)_c 队列 链表

c 队列 链表

用链表来写队列真的比数组简单得多,本人已经发了用数组实现队列的文章,欢迎大家阅览

1.先写一个队列的接口(queue.h)

  1. /*
  2. 一个队列模块的接口
  3. */
  4. #include <stdlib.h>
  5. #define QUEUE_TYPE int /*队列元素的类型*/
  6. /*
  7. ** create_queue
  8. ** 创建一个队列,参数为队列可以存储元素的最大数量
  9. ** 这个函数只适用于动态分配数组的队列版本
  10. */
  11. void create_queue(size_t size);
  12. /*
  13. ** destroy_queue
  14. ** 销毁一个队列,只适用于链式和动态分配数组的版本
  15. */
  16. void destroy_queue(void);
  17. /*
  18. ** insert
  19. ** 向队列添加一个新元素,参数为要添加的元素
  20. */
  21. void insert(QUEUE_TYPE value);
  22. /*
  23. ** delete
  24. ** 从队列中移除一个元素
  25. */
  26. void delete(void);
  27. /*
  28. ** first
  29. ** 返回队列中第一个元素的值,队列不动
  30. */
  31. QUEUE_TYPE first(void);
  32. /*
  33. ** last
  34. ** 返回队列最后一个元素的值,队列不动
  35. */
  36. QUEUE_TYPE last(void);
  37. /*
  38. ** is_empty
  39. ** 如果队列为空,返回1,否则返回0
  40. */
  41. int is_empty(void);
  42. /*
  43. ** is_full
  44. ** 如果队列为满,返回1,否则返回0
  45. */
  46. int is_full(void);
  47. /*
  48. ** aqueue_print
  49. ** 遍历打印队列(数组版本),并返回队列存储元素个数
  50. */
  51. int aqueue_print(void);
  52. /*
  53. ** lqueue_print
  54. ** 遍历打印队列(链表版本),并返回队列存储元素个数
  55. */
  56. int lqueue_print(void);

2.再写一个文件具体实现链式队列函数操作(l_queue.c)

  1. /*
  2. ** 用链表实现队列
  3. ** 该链表有一个头指针,一个尾指针
  4. ** 当队列只有一个元素时,头尾指针指向同一结点
  5. */
  6. #include "queue.h"
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <assert.h>
  10. #include <malloc.h>
  11. /*定义链表结点*/
  12. typedef struct NODE{
  13. QUEUE_TYPE value;
  14. struct NODE *next;
  15. }Node;
  16. /*定义头尾指针*/
  17. static Node *front = NULL;
  18. static Node *rear = NULL;
  19. /*
  20. ** destroy_queue
  21. */
  22. void destroy_queue(void){
  23. front = NULL;
  24. rear = NULL;
  25. }
  26. /*
  27. ** insert
  28. */
  29. void insert(QUEUE_TYPE value){
  30. Node *new = malloc(sizeof(QUEUE_TYPE));
  31. assert(new != NULL);
  32. new->value = value;
  33. new->next = NULL;
  34. //如果队列为空
  35. if(front == NULL && rear == NULL){
  36. front = new;
  37. rear = new;
  38. }else{
  39. rear->next = new;
  40. rear = rear->next;
  41. }
  42. }
  43. /*
  44. ** delete
  45. */
  46. void delete(void){
  47. if(front == rear){
  48. front = NULL;
  49. rear = NULL;
  50. }else
  51. front = front->next;
  52. }
  53. /*
  54. ** first
  55. */
  56. QUEUE_TYPE first(void){
  57. return front->value;
  58. }
  59. /*
  60. ** last
  61. */
  62. QUEUE_TYPE last(void){
  63. return rear->value;
  64. }
  65. /*
  66. ** is_empty
  67. */
  68. int is_empty(void){
  69. return front == NULL && rear == NULL;
  70. }
  71. /*
  72. ** is_full
  73. */
  74. int is_full(void){
  75. return 0;
  76. }
  77. /*
  78. ** lqueue_print
  79. ** 遍历打印队列(链表版本),并返回队列存储元素个数
  80. */
  81. int lqueue_print(void){
  82. Node *find = front;
  83. int count = 0;
  84. while(find != NULL){
  85. printf("%d", find->value);
  86. ++count;
  87. if((find = find->next)!=NULL)
  88. printf(", ");
  89. }
  90. return count;
  91. }

3.最后写一个测试主函数(l_main.c)

  1. #include "l_queue.c"
  2. int main(){
  3. insert(33);
  4. insert(22);
  5. insert(44);
  6. insert(55);
  7. insert(66);
  8. printf("\n该队列存储了%d个元素",lqueue_print());
  9. printf("\n队列头元素为%d,尾元素为%d\n\n", first(), last());
  10. delete();
  11. delete();
  12. printf("\n该队列存储了%d个元素",lqueue_print());
  13. printf("\n队列头元素为%d,尾元素为%d\n\n", first(), last());
  14. return 0;
  15. }

控制台输出:

  1. 33, 22, 44, 55, 66
  2. 该队列存储了5个元素
  3. 队列头元素为33,尾元素为66
  4. 44, 55, 66
  5. 该队列存储了3个元素
  6. 队列头元素为44,尾元素为66

总结:到此,我已经用数组,链表实现了队列,发现队列用链表真的比用数组方便简洁的多,我之前还写了堆栈的实现,也是分别用数组和链表来实现,大家有兴趣可以去看看我之前的文章,谢谢大家!C语言yyds!!

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

闽ICP备14008679号