1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int ElementType ;
  4. typedef struct listnode
  5. {
  6. ElementType element ;
  7. struct listnode *next ;
  8. } NODE ;
  9. typedef struct listqueue
  10. {
  11. struct listnode *front ;
  12. struct listnode *rear ;
  13. } queuePtr ;
  14. typedef enum status
  15. {
  16. success = 0 ,
  17. fail = 1 ,
  18. TRUE = 3
  19. } status ;
  20. status InitQueue( queuePtr *pQHead);
  21. status enQueue( queuePtr *pQHead , ElementType element);
  22. status deQueue( queuePtr *pQHead , ElementType *pDeQueue_Val );
  23. int getQueueLen(queuePtr *pQHead) ;
  24. status Traversequeue(queuePtr *pQHead) ;
  25. status isEmptyQueue( queuePtr *pQHead );
  26. int main(int argc, char *argv[]) {
  27. queuePtr *pQHead = (queuePtr *)malloc(sizeof(queuePtr));
  28. int data = 0 ;
  29. int cmdtype = 0 ;
  30. int LenQueue = 0 ;
  31. int n_cmd = 0 ;
  32. InitQueue(pQHead) ;
  33. scanf("%d",&n_cmd);
  34. // while( scanf("%d",&cmdtype) != EOF )//这里可以控制输入多个命令
  35. while( n_cmd-- )
  36. {
  37. scanf("%d",&cmdtype);
  38. switch (cmdtype )
  39. {
  40. case 1 : scanf("%d",&data);
  41. enQueue( pQHead , data );
  42. break ;
  43. case 2 :
  44. if( deQueue( pQHead , &data) == success )
  45. {
  46. printf("%d\n",data);
  47. }
  48. else
  49. {
  50. printf("no\n") ;
  51. return 0 ;//注意审题,如果下溢,输出no,并且退出
  52. }
  53. break ;
  54. case 3 :
  55. LenQueue = getQueueLen( pQHead );
  56. printf("%d\n",LenQueue);
  57. break ;
  58. default :
  59. //printf("invalid cmd!\n"); //调试使用
  60. break ;
  61. }
  62. }
  63. return 0;
  64. }
  65. /*********************************************************************
  66. * 刚开始创建空队列时,队列的队头和队尾指针相等都指向头结点,头结点的数据域不存放数据
  67. * 第一次入队,创建新结点malloc,其数据域保存新插入元素,头结点的next指向新结点,(最后一句话很重要)
  68. * 队列的头指针是固定指向头节点(但是头结点是不存放任何数据的)
  69. * 第一次出队,则队列的队头指针指向头结点的next,依次类推
  70. *********************************************************************/
  71. status InitQueue( queuePtr *pQHead)
  72. {
  73. //创建了头结点,但是头结点不存放任何数据的,这点需要注意。
  74. NODE *headnode = (NODE *)malloc(sizeof(NODE));
  75. headnode->next = NULL ;
  76. headnode->element = 0 ;
  77. pQHead->front = headnode ;
  78. pQHead->rear = pQHead->front ;
  79. if( NULL == pQHead->rear)
  80. {
  81. printf("malloc in InitQueue fail!");
  82. return(fail);
  83. }
  84. return success ;
  85. }
  86. //特别注意:pQHead是一个指向指针的指针,front以及rear才是指向节点的指针
  87. //当队列是空的时候,头指针以及尾指针指向一个空的节点(这点特别重要)
  88. status enQueue( queuePtr *pQHead , ElementType element)
  89. {
  90. NODE *newnode = (NODE *)malloc(sizeof(NODE));
  91. if( NULL == newnode )
  92. {
  93. printf("EnQueue fail,malloc error!");
  94. return fail ;
  95. }
  96. else
  97. {
  98. newnode->element = element ;//将新数据录入新的节点
  99. newnode->next = NULL ;
  100. pQHead->rear->next = newnode ;//新节点接到尾部
  101. pQHead->rear = newnode ;//新节点变成了尾部
  102. return success ;
  103. }
  104. }
  105. status deQueue( queuePtr *pQHead , ElementType *pDeQueue_Val )
  106. {
  107. if( isEmptyQueue(pQHead) == TRUE )
  108. //if( pQHead->front->next == NULL )
  109. {
  110. // printf("deQueue-ing : empty queue!\n");
  111. return fail ;
  112. }
  113. NODE *prefront = pQHead->front->next ;
  114. *pDeQueue_Val = prefront->element ;
  115. if( pQHead->rear == prefront )//判断队列空的方法:如果尾指针指向front的下一个节点,那么说队列中仅有一个节点
  116. {
  117. pQHead->rear = pQHead->front;
  118. pQHead->front->next = NULL ;//这句话可以搭配使用 pQHead->front->next == NULL
  119. }
  120. else
  121. {
  122. pQHead->front->next = prefront->next ;
  123. }
  124. free(prefront);
  125. prefront = NULL ;
  126. return success ;
  127. }
  128. int getQueueLen(queuePtr *pQHead)
  129. {
  130. if( isEmptyQueue(pQHead) == TRUE )
  131. {
  132. //printf("Traverse-ing : empty queue!\n");
  133. return 0 ;
  134. }
  135. NODE *tempnode = pQHead->front ;
  136. int len = 1 ;
  137. while( tempnode->next != pQHead->rear)//尾指针是空的
  138. {
  139. tempnode = tempnode->next ;
  140. len ++ ;
  141. }
  142. tempnode = NULL ;
  143. return len ;
  144. }
  145. //调试使用,用于输出队列的所有值
  146. status Traversequeue(queuePtr *pQHead)
  147. {
  148. if( isEmptyQueue(pQHead) == TRUE )
  149. {
  150. //printf("Traverse-ing : empty queue!\n");
  151. printf("no\n");
  152. return fail ;
  153. }
  154. NODE *tempnode = pQHead->front->next ;
  155. NODE *pretempnode = tempnode ;
  156. while(tempnode != NULL )
  157. {
  158. printf("%d\n",tempnode->element);
  159. tempnode = tempnode->next ;
  160. }
  161. return success ;
  162. }
  163. status isEmptyQueue( queuePtr *pQHead )
  164. {
  165. if( pQHead->front == pQHead->rear)
  166. {
  167. return TRUE ;
  168. }
  169. else
  170. {
  171. return fail ;
  172. }
  173. }
点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论