Chinaunix首页 | 论坛 | 博客
  • 博客访问: 464087
  • 博文数量: 68
  • 博客积分: 2606
  • 博客等级: 上尉
  • 技术积分: 1308
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-13 23:01
文章分类
文章存档

2012年(6)

2011年(62)

分类: C/C++

2011-08-25 09:48:23

------------------------------------------
本文为本人原创,欢迎转载!
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
   以前一直以为队列在自己的编程中不会有应用的时候,这次再次复习这个知识点时,才发现队列在嵌入式编程中也很重要,在实习公司的一个sel日志模块就用了一个数组做循环队列做缓存,来保证日志来得及写入文件而不会丢失,下面将链队列的实现代码贴出,供大家交流。

  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. /*定义单链队列----队列的链式存储结构*/
  4. typedef struct node
  5. {
  6. int data;
  7. struct node *next;
  8. }qnode;


  9. /*定义队列类型,包括队头和队尾指针*/
  10. typedef struct linkqueue
  11. {
  12. qnode *frist;
  13. qnode *last;
  14. }queue;


  15. /*****************************************************************
  16.  *功能描述:插入元素val为队列新的队尾元素
  17.  *传入参数:hq:指向队列的指针,val:入队元素的值
  18.  *传出参数:无
  19.  *返回值: 更新后的队列指针
  20.  ****************************************************************/
  21. queue *in_queue(queue *hq, int val)
  22. {
  23. qnode *s = (qnode *)malloc(sizeof(qnode));
  24. if(!s)
  25. {
  26. printf("malloc error\n");/*存储分配失败*/
  27. return NULL;
  28. }
  29. s->data = val;
  30. s->next = NULL;
  31. /*判断队列是否为空,为空则将队头和队尾指针同时更新*/
  32. if(NULL == hq->last)
  33. {
  34. hq->frist = hq->last = s;
  35. }
  36. else
  37. {
  38. hq->last->next = s;/*将新元素插入到队尾并更新队尾指针*/
  39. hq->last = s;
  40. }


  41. return hq;
  42. }




  43. /*****************************************************************
  44.  *功能描述:删除队列的队头元素,用e返回其值
  45.  *传入参数:hq:需要更新的队列指针
  46.  *传出参数:e:出队元素的值
  47.  *返回值: 更新后的队列指针
  48.  ****************************************************************/
  49. queue *out_queue(queue *hq, int *e)
  50. {
  51. qnode *p = NULL;
  52. /*判空*/
  53. if(!hq->frist)
  54. {
  55. printf("over flow\n");
  56. exit(1);
  57. }
  58. else
  59. {
  60. *e = hq->frist->data;
  61. p = hq->frist;
  62. /*队中只有一个元素,直接把队列清空;否则队头元素出队后释放空间*/
  63. if(hq->frist == hq->last)
  64. {
  65. hq->frist = hq->last = NULL;
  66. }
  67. else
  68. {
  69. hq->frist = hq->frist->next;
  70. free(p);
  71. }
  72. }
  73. return hq;
  74. }




  75. /*****************************************************************
  76.  *功能描述:初始化队列,建立一个有六个元素的队列
  77.  *传入参数:队列指针
  78.  *传出参数:无
  79.  *返回值: 无
  80.  ****************************************************************/
  81. void init_queue(queue *hq)
  82. {
  83. int i, a;
  84. hq->frist = hq->last = (qnode *)malloc(sizeof(qnode));
  85. hq->frist = hq->last = NULL;


  86. for(i=0; i<6; i++)
  87. {
  88. printf("please input queue item:\n");
  89. scanf("%d", &a);
  90. in_queue(hq, a);
  91. }
  92. return;
  93. }


  94. /*****************************************************************
  95.  *功能描述:打印队列元素
  96.  *传入参数:队列指针
  97.  *传出参数:无
  98.  *返回值: 无
  99.  ****************************************************************/
  100. void print(queue *hq)
  101. {
  102. int val;
  103. qnode *p = hq->frist;
  104. while(p)
  105. {
  106. /*由于用出队操作,破坏了队列,使下面的操作无法执行,所以采用了更新指针 的方式;注意此处不能直接用hq->frist进行操作,否则会破坏队列唯一的队头 指针,采用临时指针将队头指针拷贝一份可以避免破坏队列*/
  107. //out_queue(hq, &val);
  108. printf("%d ", p->data);
  109. p = p->next;
  110. }
  111. printf("\n");
  112. }


  113. /*****************************************************************
  114.  *功能描述:销毁队列
  115.  *传入参数:队列指针
  116.  *传出参数:无
  117.  *返回值: 无
  118.  ****************************************************************/
  119. void destroy_queue(queue *hq)
  120. {
  121. while(hq->frist)
  122. {
  123. hq->last = hq->frist->next;
  124. free(hq->frist);


  125. hq->frist = hq->last;
  126. }
  127. }




  128. /*****************************************************************
  129.  *功能描述:求队列长度
  130.  *传入参数:队列指针
  131.  *传出参数:无
  132.  *返回值: 队列的长度
  133.  ****************************************************************/
  134. int queue_length(queue *hq)
  135. {
  136. int j = 0;
  137. qnode *p = NULL;
  138. /*队列为空,返回0*/
  139. if(!hq->frist)
  140. {
  141. printf("empty queue\n");
  142. return 0;
  143. }
  144. p = hq->frist;
  145. while(p)
  146. {
  147. p = p->next;
  148. ++j;
  149. }
  150. return j;
  151. }


  152. int main(void)
  153. {
  154. int d;
  155. queue *p = NULL;
  156. queue *hq = (queue *)malloc(sizeof(queue));


  157. init_queue(hq);


  158. print(hq);
  159. d = queue_length(hq);
  160. printf("the length of queue: %d\n", d);


  161. p = out_queue(hq, &d);
  162. printf("out data from queue: %d\n", d);
  163. print(p);
  164. destroy_queue(hq);


  165. return 0;
  166. }

阅读(1542) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~