当前位置:   article > 正文

3:3链队列_链队列中queueptr

链队列中queueptr

一、代码块

队列结点

  1. typedef struct LinkNode{
  2. int data;
  3. LinkNode* next;
  4. }*LinkNodePtr;

链队列

  1. typedef struct LinkQueue{
  2. LinkNodePtr front;
  3. LinkNodePtr rear;
  4. }*LinkQueuePtr;

初始化链队列和结点

  1. LinkQueuePtr initQueue(){
  2. LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue));
  3. //创建头结点
  4. LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNode));
  5. headerPtr->next = NULL;
  6. headerPtr->data = -1;
  7. resultPtr->front = headerPtr;
  8. resultPtr->rear = headerPtr;
  9. return resultPtr;
  10. }

打印队列

  1. void outputLinkQueue(LinkQueuePtr paraQueuePtr){
  2. LinkNodePtr tempPtr = paraQueuePtr->front->next;
  3. while(tempPtr != NULL){
  4. printf("%d ", tempPtr->data);
  5. tempPtr = tempPtr->next;
  6. }
  7. printf("\r\n");
  8. }

添加队列结点

  1. void enqueue(LinkQueuePtr paraQueuePtr, int paraElement){
  2. //创建新结点
  3. LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
  4. tempNodePtr->data = paraElement;
  5. tempNodePtr->next = NULL;
  6. //在队尾添加结点
  7. paraQueuePtr->rear->next = tempNodePtr;
  8. //更新队尾
  9. paraQueuePtr->rear = tempNodePtr;
  10. }

删除队列结点并返回对应元素

  1. int dequeue(LinkQueuePtr paraQueuePtr){
  2. //判断队列是否为空
  3. if(paraQueuePtr->front == paraQueuePtr->rear){
  4. printf("The queue is empty.\r\n");
  5. return -1;
  6. }
  7. int resultValue;
  8. LinkNodePtr tempNodePtr;
  9. //删除队头元素
  10. tempNodePtr = paraQueuePtr->front->next;
  11. resultValue = tempNodePtr->data;
  12. paraQueuePtr->front->next = paraQueuePtr->front->next->next;
  13. //判断队列是否只有一个元素
  14. if(paraQueuePtr->rear == tempNodePtr){
  15. paraQueuePtr->rear = paraQueuePtr->front;
  16. }
  17. //释放删除结点的空间
  18. free(tempNodePtr);
  19. tempNodePtr = NULL;
  20. //返回对应元素
  21. return resultValue;
  22. }

二、部分代码图示

  • LinkQueuePtr initQueue()
tempQueuePtr = initQueue();

void enqueue(LinkQueuePtr paraQueuePtr, int paraElement)

enqueue(tempQueuePtr, 10);

 

enqueue(tempQueuePtr, 30);

enqueue(tempQueuePtr, 50);

  • int dequeue(LinkQueuePtr paraQueuePtr)
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));

 

 

 


三、全部代码

  1. //
  2. // main.c
  3. //
  4. // Created on 2022/5/16.
  5. //
  6. #include <stdio.h>
  7. #include <malloc.h>
  8. //队列结点
  9. typedef struct LinkNode{
  10. int data;
  11. LinkNode* next;
  12. }*LinkNodePtr;
  13. //链队列
  14. typedef struct LinkQueue{
  15. LinkNodePtr front;
  16. LinkNodePtr rear;
  17. }*LinkQueuePtr;
  18. //初始化链队列和结点
  19. LinkQueuePtr initQueue(){
  20. LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue));
  21. //创建头结点
  22. LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNode));
  23. headerPtr->next = NULL;
  24. headerPtr->data = -1;
  25. resultPtr->front = headerPtr;
  26. resultPtr->rear = headerPtr;
  27. return resultPtr;
  28. }
  29. //打印队列
  30. void outputLinkQueue(LinkQueuePtr paraQueuePtr){
  31. LinkNodePtr tempPtr = paraQueuePtr->front->next;
  32. while(tempPtr != NULL){
  33. printf("%d ", tempPtr->data);
  34. tempPtr = tempPtr->next;
  35. }
  36. printf("\r\n");
  37. }
  38. //添加队列结点
  39. void enqueue(LinkQueuePtr paraQueuePtr, int paraElement){
  40. //创建新结点
  41. LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
  42. tempNodePtr->data = paraElement;
  43. tempNodePtr->next = NULL;
  44. //在队尾添加结点
  45. paraQueuePtr->rear->next = tempNodePtr;
  46. //更新队尾
  47. paraQueuePtr->rear = tempNodePtr;
  48. }
  49. //删除队列结点并返回对应元素
  50. int dequeue(LinkQueuePtr paraQueuePtr){
  51. //判断队列是否为空
  52. if(paraQueuePtr->front == paraQueuePtr->rear){
  53. printf("The queue is empty.\r\n");
  54. return -1;
  55. }
  56. int resultValue;
  57. LinkNodePtr tempNodePtr;
  58. //删除队头元素
  59. tempNodePtr = paraQueuePtr->front->next;
  60. resultValue = tempNodePtr->data;
  61. paraQueuePtr->front->next = paraQueuePtr->front->next->next;
  62. //判断队列是否只有一个元素
  63. if(paraQueuePtr->rear == tempNodePtr){
  64. paraQueuePtr->rear = paraQueuePtr->front;
  65. }
  66. //释放删除结点的空间
  67. free(tempNodePtr);
  68. tempNodePtr = NULL;
  69. //返回对应元素
  70. return resultValue;
  71. }
  72. //测试
  73. void testLinkQueue(){
  74. LinkQueuePtr tempQueuePtr;
  75. tempQueuePtr = initQueue();
  76. enqueue(tempQueuePtr, 10);
  77. enqueue(tempQueuePtr, 30);
  78. enqueue(tempQueuePtr, 50);
  79. outputLinkQueue(tempQueuePtr);
  80. printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
  81. printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
  82. printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
  83. printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
  84. enqueue(tempQueuePtr, 8);
  85. outputLinkQueue(tempQueuePtr);
  86. }
  87. //main
  88. int main(){
  89. testLinkQueue();
  90. return 0;
  91. }

四、小结

 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号