1. //复杂的队列二 --链表队列
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5.  
  6. #define datatype int
  7.  
  8. struct queuelink{
  9. datatype data;//数据
  10. int high;//优先级
  11. struct queuelink *pnext;//下一节点的指针
  12. };
  13.  
  14. typedef struct queuelink QueueLink;
  15. //链表队列,容量无限大
  16.  
  17. //清空队列
  18. QueueLink * chearQueueLink(QueueLink *pql);
  19. //入队
  20. QueueLink * enQueueLink(QueueLink *pql, datatype data1, int high1);
  21. //优先级入队(本质上还是链表排序--插入排序练习)
  22. QueueLink * enPriorityQueueLink(QueueLink *pql, datatype data1, int high1);
  23. //出队
  24. QueueLink * deQueueLink(QueueLink *pql, QueueLink *pout);
  25. //打印队列
  26. void printfQueueLink(QueueLink *pql);
  27. //同等优先级排序
  28. QueueLink * samePriority(QueueLink *pql);
  29.  
  30. void main(){
  31. QueueLink * pql = NULL;
  32. //入队
  33. pql = enPriorityQueueLink(pql, , );
  34. pql = enPriorityQueueLink(pql, , );
  35. pql = enPriorityQueueLink(pql, , );
  36. pql = enPriorityQueueLink(pql, , );
  37. pql = enPriorityQueueLink(pql, , );
  38. pql = enPriorityQueueLink(pql, , );
  39. //打印元素
  40. printfQueueLink(pql);
  41. //出队
  42. printf("\n-------------出队------------------\n");
  43. QueueLink * pout = (QueueLink *)malloc(sizeof(QueueLink));
  44. pql = deQueueLink(pql, pout);
  45. printf("出队的元素是data=%d;high=%d\n",pout->data,pout->high);
  46. pql=chearQueueLink(pql);
  47. //打印元素
  48. printfQueueLink(pql);
  49.  
  50. system("pause");
  51. }
  52.  
  53. //入队
  54. QueueLink * enQueueLink(QueueLink *pql, datatype data1, int high1){
  55. //创建一个链表元素
  56. QueueLink * p1 = (QueueLink *)malloc(sizeof(QueueLink));
  57. QueueLink * p2 = pql;
  58. p1->data = data1;
  59. p1->high = high1;
  60. p1->pnext = NULL;
  61. //先判断队列是否为空
  62. if (pql == NULL)
  63. {
  64. pql = p1;
  65. }
  66. else{
  67. //遍历链表
  68. while (p2->pnext != NULL){
  69. p2 = p2->pnext;
  70. }
  71. p2->pnext = p1;
  72. }
  73. return pql;
  74. }
  75.  
  76. //优先级入队(本质上还是链表排序)
  77. QueueLink * enPriorityQueueLink(QueueLink *pql, datatype data1, int high1){
  78. //创建一个链表元素
  79. QueueLink * p1 = (QueueLink *)malloc(sizeof(QueueLink));
  80. p1->data = data1;
  81. p1->high = high1;
  82. p1->pnext = NULL;
  83. QueueLink * p2 = pql;
  84. QueueLink * p3 = pql;
  85. //优先级队列,入队的时候必须进行排序
  86. //优先级队列,首先必须先按照high优先级来分
  87. //这里采用插入排序
  88. //判断队列是否为空
  89. int temp = ;
  90. if (pql==NULL)
  91. {
  92. pql = p1;
  93. return pql;
  94. }
  95. else{
  96. //队列不为空
  97. while (p2!=NULL){
  98. //此时的队列是一个有序队列,所以只要找到比p1大的元素p2,
  99. //在p2前面插入p1就可以了
  100. if (p1->high<p2->high)
  101. {
  102. //对于p1->high<p2->high的解释:对于链表一般而言,我们要找到比p1大的元素p2,将p1插在p2的前面,
  103. //其实必须要找到p2的前一个元素p3,那么通常写法是p1->high<p2->pnext->high,
  104. //p2->pnext就是比p1大的那个元素,但是这么写有个问题,无法将p1与头指针相比较
  105. //所以我用p2存储比p1大的元素,再通过循环找到p2的前一个元素
  106. break;
  107. }
  108. p2 = p2->pnext;
  109. }
  110. if (p2==pql)
  111. {
  112. //说明p1的优先级比头结点小
  113. //将p1插到最前面
  114. p1->pnext = pql;
  115. pql = p1;
  116.  
  117. }
  118. //在这里不用考虑p1的优先级比所有节点都大的情况,因为p1比所有节点都大,那p2==NULL
  119. //p3->pnext==NULL
  120. //此时的p3正好就是最后一个节点---p3->pnext = p1;
  121. else{
  122. //说明p1的优先级比头结点大
  123. while (p3!=NULL){
  124. if (p3->pnext==p2)
  125. {
  126. temp = ;
  127. //此时p3就是p2的前一个节点
  128. break;
  129. }
  130. p3 = p3->pnext;
  131. }
  132. }
  133. //当temp==1时,p3就是p2的前一个节点
  134. if (temp==)
  135. {
  136. p3->pnext = p1;
  137. p1->pnext = p2;
  138. }
  139. return pql;
  140. }
  141. }
  142.  
  143. //优先级出队
  144. QueueLink * deQueueLink(QueueLink *pql, QueueLink *pout){
  145. QueueLink * p = NULL;
  146. if (pql == NULL)
  147. {
  148. return NULL;
  149. }
  150. else{
  151. if (pql->pnext == NULL)
  152. {
  153. pout->data = pql->data;
  154. pout->high = pql->high;
  155. pout->pnext = NULL;
  156. //释放元素
  157. free(pql);
  158. return NULL;
  159. }
  160. else{
  161. //出队第一个元素
  162. p = pql->pnext;
  163. pout->data = pql->data;
  164. pout->high = pql->high;
  165. pout->pnext = NULL;
  166. //释放元素
  167. free(pql);
  168. pql = p;
  169. return pql;
  170. }
  171. }
  172. }
  173.  
  174. //递归打印队列
  175. void printfQueueLink(QueueLink *pql){
  176. if (pql==NULL)
  177. {
  178. return;
  179. }
  180. else{
  181. printf("data=%d;hogh=%d\n", pql->data, pql->high);
  182. printfQueueLink(pql->pnext);
  183. }
  184. }
  185.  
  186. //清空队列
  187. QueueLink * chearQueueLink(QueueLink *pql){
  188. QueueLink *p = pql;
  189. QueueLink *p1 = NULL;
  190. while (p->pnext!=NULL){
  191. p1 = p->pnext;
  192. p->pnext = p1->pnext;
  193. free(p1);
  194. printfQueueLink(pql);
  195. printf("\n--------------------\n");
  196. }
  197. //删除头结点指针
  198. free(p);
  199. return NULL;
  200. }

C语言 复杂队列(链表队列)的更多相关文章

  1. 数据结构:C_链表队列的实现

    数据结构链表形式队列的实现(C语言版) 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: ...

  2. C语言实现链式队列

    链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...

  3. 基于Python语言使用RabbitMQ消息队列(一)

    介绍 RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, ...

  4. java:数据结构复习(三)链表队列

    @TOC 和栈一样,队列也是表,但是使用队列的特点是先进先出. 队列模型 队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素 graph LR A[<kbd&g ...

  5. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  6. Java并发编程原理与实战三十六:阻塞队列&消息队列

    一.阻塞队列 1.阻塞队列BlockingQueue ---->可以理解成生产者消费者的模式---->消费者要等待到生产者生产出来产品.---->而非阻塞队列ConcurrentLi ...

  7. 《数据结构与算法之美》 <07>队列:队列在线程池等有限资源池中的应用?

    我们知道,CPU 资源是有限的,任务的处理速度与线程个数并不是线性正相关.相反,过多的线程反而会导致 CPU 频繁切换,处理性能下降.所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事 ...

  8. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  9. IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...

随机推荐

  1. C安全编码--数组

    建议和规则 建议: 理解数组的工作方式 获取数组的长度时不要对指针应用sizeof操作符 显示地指定数组的边界,即使它已经由初始化值列表隐式地指定 规则: 保证数组索引位于合法的范围内 在所有源文件中 ...

  2. C语言动态存储分配

    动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串.数组 ...

  3. 《慕客网:IOS动画案例之会跳动的登入界面(下)》学习笔记 -Sketch的使用

    导出选中的一个图片,比如这里我们选中background,然后点击软件的右下角,可以设置导出的尺寸: 然后添加1倍,2倍,3倍的尺寸,因为在ihpne6之后就需要这三个尺寸倍数的UI,以适应不同设备的 ...

  4. Erlang 虚拟机 BEAM 指令集之内存管理相关的指令

    翻看 BEAM 虚拟机指令集的时候(在编译器源码目录下:lib/compiler/src/genop.tab),会发现有一些和内存分配/解除分配相关的指令,如下所示: allocate StackNe ...

  5. 怎么录制Android或IOS动画教程

    前一篇文章介绍了用DemoCreator制作Android视频教程,今天再介绍一种方法. 那就是用GifCam软件录制,此软件录制导出成Gif动画图片,可直接放在你的文章里面,效果比flash要好. ...

  6. RESTful API的设计与开发

    自己做过关于RESTful API的培训,下载

  7. 问题解决——使用GP-3120TN打印条形码标签

    终于大致的尝试出了参数和编程手册里指令的使用. 在这里,感谢佳博中一个叫做"Gprinter 陶玮"的工程师所提供的技术支持.非常感谢,如果没有你,在写这篇文章之前我可能换别的打印 ...

  8. 枚举Enumerations

    枚举,类似于数据库中的表. 难点:实例值和原始值. import Foundation enum Sex{ case Male(Int,Int) case Female(String) } var b ...

  9. Climbing Stairs

    Climbing Stairs https://leetcode.com/problems/climbing-stairs/ You are climbing a stair case. It tak ...

  10. zookeeper中Watcher和Notifications

    问题导读:1.zookeeper观察者什么时候调用?2.传统远程轮询服务存在什么问题?3.zk中回调服务的机制是什么?4.zk中watcher为什么不永久注册?5.什么是znode? 在阅读之前首先明 ...