数据结构——队列的链式实现(C语言)

骑猪看日落 2022-08-25 05:25 272阅读 0赞

队列是一种先进先出的线性表,但队列顺序存储的时候,操作不方便,为了操作简单,队列采用链式存储结构。队列入队时只能在队尾操作,出队时在队首操作,头结点的指针域有头指针(front)和尾指针(rear),头结点只存放指针域,不存放数据项,但头指针和尾指针指向头指针时,队列为空。

以下是C语言源程序:

函数声明:

  1. #ifndef Queue_H
  2. #define Queue_H
  3. typedef int Item;
  4. typedef struct node *PNode;
  5. typedef struct node
  6. {
  7. Item data;
  8. PNode next;
  9. }Node;
  10. typedef struct queue *PQueue;
  11. typedef struct queue
  12. {
  13. PNode front;
  14. PNode rear;
  15. Item size;
  16. }Queue;
  17. /***创建空队列***/
  18. PQueue Creat_Queue();
  19. /***判断队列是否为空***/
  20. int Is_Empty(PQueue);
  21. PQueue CreateQueue(PQueue); //创建队列
  22. /***数据项入队,在队尾入队***/
  23. PQueue Add_Queue(PQueue,Item);
  24. /***计算队列大小***/
  25. int Size_Queue(PQueue);
  26. /***数据项出队,在队首出队***/
  27. Item Delete_Queue(PQueue);
  28. /***清空队列***/
  29. void Clear_Queue(PQueue);
  30. /***遍历队列***/
  31. void Traverse_Queue(PQueue);
  32. #endif

函数定义:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. #include"Queue.h"
  5. /***创建空队列***/
  6. PQueue Creat_Queue()
  7. {
  8. PQueue P=(PQueue)malloc(sizeof(Queue));
  9. P->rear=P->front=(PNode)malloc(sizeof(Node));
  10. if(NULL==P || NULL==P->front)
  11. {
  12. printf("The queue is failed.\n");
  13. exit(1);
  14. }
  15. //P->front=P->rear;
  16. P->front->next=NULL;
  17. P->size=0;
  18. return P;
  19. }
  20. /***判断队列是否为空***/
  21. int Is_Empty(PQueue P)
  22. {
  23. if(P->front==P->rear)
  24. return 1;
  25. else
  26. return 0;
  27. }
  28. PQueue CreateQueue(PQueue P) //创建队列
  29. {
  30. P=Creat_Queue();
  31. printf("Enter the data:");
  32. int k;
  33. while((scanf("%d",&k)) == 1)
  34. {
  35. Add_Queue(P,k);
  36. printf("Enter the next data:");
  37. }
  38. return P;
  39. }
  40. /***数据项入队,在队尾入队***/
  41. PQueue Add_Queue(PQueue P,Item data)
  42. {
  43. PNode temp=(PNode)malloc(sizeof(Node));
  44. if(NULL==temp)
  45. {
  46. printf("The temp is failed.\n");
  47. exit(1);
  48. }
  49. temp->data=data;
  50. temp->next=NULL;
  51. if(Is_Empty(P))
  52. P->front->next=temp;
  53. else
  54. P->rear->next=temp;
  55. P->rear=temp;
  56. P->size++;
  57. printf("Add the data of %d to queue is success: %d\n ",data,data);
  58. return P;
  59. }
  60. /***计算队列大小***/
  61. int Size_Queue(PQueue P)
  62. {
  63. return P->size;
  64. }
  65. /***数据项出队,在队首出队***/
  66. Item Delete_Queue(PQueue P)
  67. {
  68. Item data;
  69. if(Is_Empty(P))
  70. return NULL;
  71. PNode temp=P->front->next;
  72. data=temp->data;
  73. P->front->next=temp->next;
  74. if(0==P->size)
  75. P->rear=P->front;
  76. P->size--;
  77. free(temp);
  78. return data;
  79. }
  80. /***清空队列***/
  81. void Clear_Queue(PQueue P)
  82. {
  83. PNode temp = P->front->next;
  84. while(temp)
  85. {
  86. PNode tp = temp;
  87. temp = temp->next;
  88. free(tp);
  89. }
  90. temp = P->front;
  91. P->front = P->rear = NULL;
  92. free(temp);
  93. }
  94. /***遍历队列***/
  95. void Traverse_Queue(PQueue P)
  96. {
  97. if(Is_Empty(P))
  98. printf("there is no data in the queue!\n");
  99. else
  100. {
  101. PNode pCurrent = P->front->next;
  102. printf("Now datas int the queue are:\n");
  103. while(pCurrent)
  104. {
  105. printf("%d ",pCurrent->data);
  106. pCurrent = pCurrent->next;
  107. }
  108. printf("\n");
  109. }
  110. return;
  111. }

测试程序:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include "Queue.h"
  4. #define num 5
  5. int main()
  6. {
  7. /***创建空队列***/
  8. PQueue PQ;
  9. int size=0;
  10. int data;
  11. PQ=Creat_Queue();
  12. printf("The queue is created.\n");
  13. /***判断队列是否为空***/
  14. if(Is_Empty(PQ))
  15. printf("The queue is empty.\n");
  16. PQ=CreateQueue(PQ); //创建队列
  17. /***遍历队列***/
  18. Traverse_Queue(PQ);
  19. /***数据项入队,在队尾入队***/
  20. PQ=Add_Queue(PQ,num);
  21. /***遍历队列***/
  22. Traverse_Queue(PQ);
  23. /***计算队列大小***/
  24. size=Size_Queue(PQ);
  25. printf("The size of queue are: %d\n",size);
  26. /***数据项出队,在队首出队***/
  27. data=Delete_Queue(PQ);
  28. printf("The deleted data is: %d\n",data);
  29. /***遍历队列***/
  30. Traverse_Queue(PQ);
  31. /***清空队列***/
  32. Clear_Queue(PQ);
  33. if(Is_Empty(PQ))
  34. printf("The queue is empty.\n");
  35. /***遍历队列***/
  36. Traverse_Queue(PQ);
  37. return 0;
  38. }

发表评论

表情:
评论列表 (有 0 条评论,272人围观)

还没有评论,来说两句吧...

相关阅读