当前位置:   article > 正文

数据结构:队列的链式存储实现_实现一个链式存储的队列

实现一个链式存储的队列

 

  1. /*
  2. * 程序名:linkqueue1.c,此程序演示队列的链表实现(带头结点)。
  3. *
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. typedef int ElemType; // 自定义队列的数据元素为整数。
  8. typedef struct LNode
  9. {
  10. ElemType data; // 存储队列中的元素。
  11. struct LNode *next; // next指针。
  12. }LNode;
  13. typedef struct
  14. {
  15. LNode *front,*rear; // 队列的头指针和尾指针。
  16. }LinkQueue,*PLinkQueue;
  17. // 队列QQ的初始化操作。
  18. int InitQueue(PLinkQueue QQ);
  19. // 销毁队列QQ。
  20. void DestroyQueue(PLinkQueue QQ);
  21. // 清空队列。
  22. void Clear(PLinkQueue QQ);
  23. // 元素入队,返回值:0-失败;1-成功。
  24. int InQueue(PLinkQueue QQ, ElemType *ee);
  25. // 打印队列中全部的元素。
  26. void PrintQueue(PLinkQueue QQ);
  27. // 求队列的长度,返回值:>=0-队列QQ元素的个数。
  28. int Length(PLinkQueue QQ);
  29. // 判断队列是否已满,链式队列不存在队满的说法。
  30. int IsFull(PLinkQueue QQ);
  31. // 判断队列是否为空,返回值:1-空,0-非空或失败。
  32. int IsEmpty(PLinkQueue QQ);
  33. // 元素出队,返回值:0-失败;1-成功。
  34. int OutQueue(PLinkQueue QQ, ElemType *ee);
  35. // 获取队头元素,返回值:0-失败;1-成功。
  36. // 只查看队头元素的值,元素不出队。
  37. int GetHead(PLinkQueue QQ, ElemType *ee);
  38. int main()
  39. {
  40. LinkQueue QQ; // 创建队列。
  41. memset(&QQ,0,sizeof(LinkQueue));
  42. InitQueue(&QQ); // 初始化队列。
  43. ElemType ee; // 创建一个数据元素。
  44. printf("元素(1、2、3、4、5、6、7、8、9、10)入队。\n");
  45. ee=1; InQueue(&QQ, &ee);
  46. ee=2; InQueue(&QQ, &ee);
  47. ee=3; InQueue(&QQ, &ee);
  48. ee=4; InQueue(&QQ, &ee);
  49. ee=5; InQueue(&QQ, &ee);
  50. ee=6; InQueue(&QQ, &ee);
  51. ee=7; InQueue(&QQ, &ee);
  52. ee=8; InQueue(&QQ, &ee);
  53. ee=9; InQueue(&QQ, &ee);
  54. ee=10; InQueue(&QQ, &ee);
  55. printf("队列的长度是%d\n",Length(&QQ));
  56. PrintQueue(&QQ);
  57. if (OutQueue(&QQ,&ee)==1) printf("出队的元素值为%d\n",ee);
  58. if (OutQueue(&QQ,&ee)==1) printf("出队的元素值为%d\n",ee);
  59. if (OutQueue(&QQ,&ee)==1) printf("出队的元素值为%d\n",ee);
  60. if (OutQueue(&QQ,&ee)==1) printf("出队的元素值为%d\n",ee);
  61. if (OutQueue(&QQ,&ee)==1) printf("出队的元素值为%d\n",ee);
  62. if (OutQueue(&QQ,&ee)==1) printf("出队的元素值为%d\n",ee);
  63. if (OutQueue(&QQ,&ee)==1) printf("出队的元素值为%d\n",ee);
  64. printf("队列的长度是%d\n",Length(&QQ));
  65. PrintQueue(&QQ);
  66. printf("元素(11、12、13、14、15)入队。\n");
  67. ee=11; InQueue(&QQ, &ee);
  68. ee=12; InQueue(&QQ, &ee);
  69. ee=13; InQueue(&QQ, &ee);
  70. ee=14; InQueue(&QQ, &ee);
  71. ee=15; InQueue(&QQ, &ee);
  72. printf("队列的长度是%d\n",Length(&QQ));
  73. PrintQueue(&QQ);
  74. // 只查看队头元素的值,元素不出队。
  75. if (GetHead(&QQ,&ee)==1) printf("队头的元素值为%d\n",ee);
  76. DestroyQueue(&QQ); // 销毁队列QQ。
  77. return 0;
  78. }
  79. // 初始化队列,返回值:0-失败;1-成功。
  80. int InitQueue(PLinkQueue QQ)
  81. {
  82. LNode *head = (LNode *)malloc(sizeof(LNode)); // 分配头结点。
  83. if (head == NULL) return 0; // 内存不足,返回失败。
  84. head->next=NULL; // 头结点的下一结点暂时不存在,置空。
  85. QQ->front=QQ->rear=head;
  86. return 1;
  87. }
  88. // 清空队列。
  89. void Clear(PLinkQueue QQ)
  90. {
  91. if (QQ == NULL) return; // 判断队列是否存在。
  92. if (QQ->front == NULL) { printf("队列QQ未初始化。\n"); return; } // 队列未初始化。
  93. // 清空队列QQ是指释放链表全部的数据结点,但保留头结点。
  94. LNode *tmp=QQ->front->next,*tmpnext;
  95. while(tmp!=NULL)
  96. {
  97. tmpnext=tmp->next; // tmpnext保存下一结点的地址。
  98. free(tmp); // 释放当前结点。
  99. tmp=tmpnext; // tmp指针移动到下一结点。
  100. }
  101. QQ->rear=QQ->front; // 尾指针指向头结点。
  102. QQ->front->next=NULL;
  103. }
  104. // 求队列的长度,返回值:>=0-队列QQ元素的个数。
  105. int Length(PLinkQueue QQ)
  106. {
  107. if (QQ == NULL) return 0; // 检查空指针。
  108. if (QQ->front == NULL) { printf("队列QQ未初始化。\n"); return 0; } // 队列未初始化。
  109. LNode *pp=QQ->front->next; // 头结点不算,从第1个结点开始。
  110. int length=0;
  111. while (pp != NULL) { pp=pp->next; length++; }
  112. return length;
  113. }
  114. // 销毁队列QQ。
  115. void DestroyQueue(PLinkQueue QQ)
  116. {
  117. if (QQ == NULL) return; // 检查空指针。
  118. // 销毁队列QQ是指释放链表全部的结点,包括头结点。
  119. LNode *tmp=QQ->front,*tmpnext;
  120. while(tmp!=NULL)
  121. {
  122. tmpnext=tmp->next; // tmpnext保存下一结点的地址。
  123. free(tmp); // 释放当前结点。
  124. tmp=tmpnext; // tmp指针移动到下一结点。
  125. }
  126. QQ->front=QQ->rear=NULL; // 防止野指针。
  127. return;
  128. }
  129. // 判断队列是否为空,返回值:1-空,0-非空或失败。
  130. int IsEmpty(PLinkQueue QQ)
  131. {
  132. if (QQ == NULL) return 0; // 检查空指针。
  133. if (QQ->front == NULL) { printf("队列QQ未初始化。\n"); return 0; } // 队列未初始化。
  134. if (QQ->front->next == NULL) return 1;
  135. return 0;
  136. }
  137. // 判断队列是否已满,链式队列不存在队满的说法。
  138. int IsFull(PLinkQueue QQ)
  139. {
  140. if (QQ == NULL) return 0; // 检查空指针。
  141. return 1;
  142. }
  143. // 元素入队,返回值:0-失败;1-成功。
  144. int InQueue(PLinkQueue QQ, ElemType *ee)
  145. {
  146. if ( (QQ == NULL) || (ee == NULL) ) return 0; // 检查空指针。
  147. if (QQ->front == NULL) { printf("队列QQ未初始化。\n"); return 0; } // 队列未初始化。
  148. LNode *tmp = (LNode *)malloc(sizeof(LNode)); // 分配一个结点。
  149. if (tmp == NULL) return 0; // 内存不足,返回失败。
  150. // 考虑数据元素为结构体的情况,这里采用了memcpy的方法而不是直接赋值。
  151. memcpy(&tmp->data,ee,sizeof(ElemType));
  152. tmp->next=NULL;
  153. // 把tmp追加到QQ->rear之后。
  154. QQ->rear->next=tmp;
  155. QQ->rear=tmp;
  156. return 1;
  157. }
  158. // 打印队列中全部的元素。
  159. void PrintQueue(PLinkQueue QQ)
  160. {
  161. if (QQ == NULL) return; // 检查空指针。
  162. if (QQ->front == NULL) { printf("队列QQ未初始化。\n"); return; } // 队列未初始化。
  163. LNode *pp=QQ->front->next; // 从第1个数据结点开始。
  164. while (pp != NULL)
  165. {
  166. printf("%-3d", pp->data); // 如果元素ee为结构体,这行代码要修改。
  167. pp=pp->next;
  168. }
  169. printf("\n");
  170. }
  171. // 元素出队,返回值:0-失败;1-成功。
  172. int OutQueue(PLinkQueue QQ, ElemType *ee)
  173. {
  174. if ( (QQ == NULL) || (ee == NULL) ) return 0; // 检查空指针。
  175. if (QQ->front == NULL) { printf("队列QQ未初始化。\n"); return 0; } // 队列未初始化。
  176. if (IsEmpty(QQ) == 1) { printf("队列为空。\n"); return 0; }
  177. LNode *tmp=QQ->front->next;
  178. memcpy(ee,&tmp->data,sizeof(ElemType));
  179. QQ->front->next=tmp->next;
  180. // 如果出队的是最后一个结点。
  181. if (QQ->rear==tmp) QQ->rear=QQ->front;
  182. free(tmp);
  183. return 1;
  184. }
  185. // 获取队头元素,返回值:0-失败;1-成功。
  186. // 只查看队头元素的值,元素不出队。
  187. int GetHead(PLinkQueue QQ, ElemType *ee)
  188. {
  189. if ( (QQ == NULL) || (ee == NULL) ) return 0; // 检查空指针。
  190. if (QQ->front == NULL) { printf("队列QQ未初始化。\n"); return 0; } // 队列未初始化。
  191. if (IsEmpty(QQ) == 1) { printf("队列为空。\n"); return 0; }
  192. memcpy(ee,&QQ->front->next->data,sizeof(ElemType));
  193. return 1;
  194. }

 

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

闽ICP备14008679号