当前位置:   article > 正文

C语言数据结构--队列 基本操作代码合集_队列的入队和出队遍历判空

队列的入队和出队遍历判空

概述

三段代码分别是队列的顺序存储,带头结点的链式存储队列,不带头结点的链式存储队列。

都包括着初始化、判空、入队 、创建、出队、遍历操作,三段代码都是键入9999即输入结束,方便大家调试。

队列的顺序存储

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. # define MaxSize 50
  4. typedef struct{
  5. int data[MaxSize];
  6. int front,rear;
  7. }SqQueue;
  8. void InitQueue(SqQueue &Q)
  9. {
  10. Q.front = Q.rear = 0;
  11. }
  12. bool QueueEmpty(SqQueue Q) //牺牲一个单元来判空
  13. {
  14. if(Q.front == Q.rear)
  15. return true;
  16. else
  17. return false;
  18. }
  19. bool EnQueue(SqQueue &Q,int x)
  20. {
  21. if((Q.rear+1)%MaxSize==Q.front) //牺牲一个单元格来区分队空和队满
  22. return false;
  23. Q.data[Q.rear] = x;
  24. Q.rear=(Q.rear + 1)%MaxSize;
  25. return true;
  26. }
  27. void CreateQueue(SqQueue &Q)
  28. {
  29. int x = 0;
  30. scanf("%d",&x);
  31. while(x!=9999)
  32. {
  33. EnQueue(Q,x);
  34. scanf("%d",&x);
  35. }
  36. }
  37. bool DeQueue(SqQueue &Q,int &x)
  38. {
  39. if(Q.front == Q.rear) //判断队空
  40. return false;
  41. x=Q.data[Q.front];
  42. printf("%d已出队\n",x);
  43. Q.front = (Q.front + 1)%MaxSize;
  44. return true;
  45. }
  46. bool GetTop(SqQueue Q,int &x) //读取队首元素
  47. {
  48. if(Q.front == Q.rear) //判断队空
  49. return false;
  50. x=Q.data[Q.front];
  51. printf("队首元素为%d\n");
  52. }
  53. void Print(SqQueue Q)
  54. {
  55. while(Q.front!=Q.rear)
  56. {
  57. printf("%d ",Q.data[Q.front]);
  58. Q.front = (Q.front + 1)%MaxSize;
  59. }
  60. }
  61. int main()
  62. {
  63. SqQueue Q;
  64. int x = 0;
  65. InitQueue(Q); //初始化
  66. CreateQueue(Q); //创建
  67. EnQueue(Q,666); //666入队
  68. DeQueue(Q,x); //出队
  69. Print(Q); //遍历
  70. return 0;
  71. }

带头结点的链式存储队列

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct LinkNode{ //链式队列结点
  4. int data;
  5. struct LinkNode *next;
  6. }LinkNode;
  7. typedef struct{ //链式队列
  8. LinkNode *front,*rear; //队列的队头和队尾指针
  9. }LinkQueue;
  10. void InitQueue(LinkQueue &Q)
  11. {
  12. Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
  13. Q.front->next = NULL;
  14. }
  15. bool QueueEmpty(LinkQueue Q) //判空
  16. {
  17. if(Q.front == Q.rear )
  18. return true;
  19. else
  20. return false;
  21. }
  22. void EnQueue(LinkQueue &Q,int x) //进队
  23. {
  24. LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
  25. s->data = x;
  26. s->next =NULL;
  27. Q.rear->next = s;
  28. Q.rear = s; //修改尾指针
  29. }
  30. void CreateQueue(LinkQueue &Q) //创建队
  31. {
  32. int x = 0;
  33. scanf("%d",&x);
  34. while(x!=9999)
  35. {
  36. EnQueue(Q,x);
  37. scanf("%d",&x);
  38. }
  39. }
  40. bool DeQueue(LinkQueue &Q,int &x) //出队
  41. {
  42. if(Q.front == Q.rear)
  43. return false;
  44. LinkNode *D=Q.front->next ;
  45. x=D->data;
  46. Q.front->next =D->next ;
  47. if(Q.rear == D)
  48. Q.rear=Q.front; //只剩一个元素,删除后变空
  49. free(D);
  50. return true;
  51. }
  52. bool GetTop(LinkQueue Q,int &x) //读取队首元素,并用x返回
  53. {
  54. if(Q.front->next == NULL)
  55. return false;
  56. x=Q.front->next->data ;
  57. printf("\n队首元素值为:%d\n",x);
  58. return true;
  59. }
  60. void Print(LinkQueue Q) //遍历 Q
  61. {
  62. LinkNode *p=Q.front->next ;
  63. while(p != Q.rear )
  64. {
  65. printf("%d ",p->data);
  66. p=p->next ;
  67. }
  68. printf("%d ",Q.rear->data);
  69. }
  70. int main()
  71. {
  72. int x = 0;
  73. int A = 0;
  74. LinkQueue Q; //声明
  75. InitQueue(Q); //初始化
  76. CreateQueue(Q); //创建
  77. EnQueue(Q,666); //666入队
  78. DeQueue(Q,x); //出队
  79. Print(Q); //遍历
  80. GetTop(Q,A); //读取队首元素
  81. return 0;
  82. }

不带头结点的链式存储队列

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct LinkNode{
  4. int data;
  5. struct LinkNode *next;
  6. }LinkNode;
  7. typedef struct{
  8. LinkNode *front,*rear;
  9. }LinkQueue;
  10. void InitQueue(LinkQueue &Q) //不带头结点的初始化
  11. {
  12. Q.front = Q.rear = NULL;
  13. }
  14. bool QueueEmpty(LinkQueue Q) //判空
  15. {
  16. if(Q.front == Q.rear && Q.front==NULL)
  17. return true;
  18. else
  19. return false;
  20. }
  21. void EnQueue(LinkQueue &Q,int x) //入队,注意两种情况
  22. {
  23. if(Q.front == Q.rear && Q.front ==NULL)
  24. {
  25. LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
  26. s->data = x;
  27. Q.front = Q.rear = s;
  28. }
  29. else
  30. {
  31. LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
  32. s->data = x;
  33. Q.rear->next = s;
  34. Q.rear = s;
  35. Q.rear->next=NULL;
  36. }
  37. }
  38. void CreateQueue(LinkQueue &Q)
  39. {
  40. int x = 0;
  41. scanf("%d",&x);
  42. while(x!=9999)
  43. {
  44. EnQueue(Q,x);
  45. scanf("%d",&x);
  46. }
  47. }
  48. bool DeQueue(LinkQueue &Q,int &x)
  49. {
  50. if(Q.front == Q.rear && Q.front == NULL)
  51. return false;
  52. x=Q.front->data ;
  53. printf("\n%d已出队\n",x);
  54. if(Q.front==Q.rear)
  55. {
  56. Q.front = Q.rear = NULL;
  57. return true;
  58. }
  59. else
  60. {
  61. Q.front=Q.front->next ;
  62. return true;
  63. }
  64. }
  65. bool GetTop(LinkQueue Q,int &x)
  66. {
  67. if(Q.front == Q.rear && Q.front == NULL)
  68. return false;
  69. x=Q.front->data ;
  70. printf("队首元素为%d\n",x);
  71. return true;
  72. }
  73. void Print(LinkQueue Q)
  74. {
  75. LinkNode *h=Q.front ;
  76. while(h!= Q.rear )
  77. {
  78. printf("%d ",h->data);
  79. h = h->next ;
  80. }
  81. printf("%d ",Q.rear->data);
  82. }
  83. int main()
  84. {
  85. int x = 0;
  86. int A = 0;
  87. LinkQueue Q; //声明
  88. InitQueue(Q); //初始化
  89. CreateQueue(Q); //创建
  90. EnQueue(Q,666); //666入队
  91. DeQueue(Q,x); //出队
  92. GetTop(Q,A); //获取队首元素
  93. Print(Q); //遍历
  94. return 0;
  95. }

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

闽ICP备14008679号