一个C语言链式结构实现的队列 mQueue (GCC编译)。

  1. /**
  2. * @brief C语言实现的链式队列
  3. * @author wid
  4. * @date 2013-10-31
  5. *
  6. * @note 若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢!
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11.  
  12. #define TRUE 1
  13. #define FALSE 0
  14.  
  15. typedef struct Point2D
  16. {
  17. int x;
  18. int y;
  19. }ElemType; //元素结构
  20.  
  21. typedef struct QNODE
  22. {
  23. ElemType *pe;
  24. struct QNODE *next;
  25. }QueueNode; //队列节点结构
  26.  
  27. typedef struct MQUEUE
  28. {
  29. QueueNode *rear; //队列尾节点
  30. QueueNode *front; //队列头节点
  31. int len; //队列长度
  32. }mQueue;
  33.  
  34. //队列方法声明
  35. mQueue *CreateQueue(); ///创建一个空队列
  36. void DestroyQueue( mQueue *pQueue ); ///销毁队列 pQueue
  37. void ClearQueue( mQueue *pQueue ); ///置空队列 pQueue
  38. int IsEmpty( mQueue *pQueue ); ///是否为空空队列
  39. int GetLength( mQueue *pQueue ); ///获取队列长度
  40. int EnQueue( mQueue *pQueue, ElemType *pe ); ///将元素pe插入到队尾
  41. int DeQueue( mQueue *pQueue, ElemType **pe ); ///将将队头元素出队
  42. int GetHead( mQueue *pQueue, ElemType **pe ); ///获取队头元素(不出队)
  43. void ForEachQueue( mQueue *pQueue, void (*func)(ElemType *pe) ); ///从队头到队尾依次执行func函数
  44.  
  45. //队列方法实现
  46. /**
  47. * @brief 创建一个空队列
  48. *
  49. * @return 返回指向新创建的队列的指针
  50. */
  51. mQueue *CreateQueue()
  52. {
  53. ///创建队列
  54. mQueue *pQueue = (mQueue *)malloc( sizeof(mQueue) );
  55.  
  56. ///令队头指向队尾
  57. pQueue->front = pQueue->rear = (QueueNode *)malloc( sizeof(QueueNode) );
  58.  
  59. ///队尾的next节点指向NULL
  60. pQueue->rear->next = NULL;
  61.  
  62. ///队头的next节点指向队尾
  63. pQueue->front->next = pQueue->rear;
  64.  
  65. ///初始化队长为 0
  66. pQueue->len = ;
  67.  
  68. return pQueue;
  69. }
  70.  
  71. /**
  72. * @brief 销毁队列 pQueue
  73. *
  74. * @param pQueue 指向待销毁的队列
  75. */
  76. void DestroyQueue( mQueue *pQueue )
  77. {
  78. QueueNode *tmp = NULL;
  79.  
  80. ///释放队列内元素
  81. while( pQueue->front != NULL )
  82. {
  83. tmp = pQueue->front->next;
  84. free( pQueue->front );
  85. pQueue->front = tmp;
  86. }
  87.  
  88. ///释放队列
  89. free( pQueue );
  90. }
  91.  
  92. /**
  93. * @brief 将队列中的元素全部清除
  94. *
  95. * @param pQueue 指向待置空的队列
  96. */
  97. void ClearQueue( mQueue *pQueue )
  98. {
  99. QueueNode *tmp = NULL;
  100.  
  101. ///释放队列内元素(保留一队尾节点)
  102. while( pQueue->front->next != NULL )
  103. {
  104. tmp = pQueue->front->next;
  105. free( pQueue->front );
  106. pQueue->front = tmp;
  107. }
  108.  
  109. pQueue->len = ;
  110. }
  111.  
  112. /**
  113. * @brief 是否为空队列
  114. *
  115. * @param pQueue 指向待检测的队列
  116. *
  117. * @return 若为空则返回 TRUE, 否则返回 FALSE
  118. */
  119. int IsEmpty( mQueue *pQueue )
  120. {
  121. return pQueue->len == ? TRUE : FALSE;
  122. }
  123.  
  124. /**
  125. * @brief 获取队列长度
  126. *
  127. * @param pQueue 指向待获取长度的队列
  128. *
  129. * @return 返回队列当前长度
  130. */
  131. int GetLength( mQueue *pQueue )
  132. {
  133. return pQueue->len;
  134. }
  135.  
  136. /**
  137. * @brief 将元素pe插入到队尾
  138. *
  139. * @param pQueue 指向待入队的队列
  140. * @param pe 指向待插入的元素
  141. *
  142. * @return 插入成功则返回入队后队列的长度, 否则返回 -1
  143. */
  144. int EnQueue( mQueue *pQueue, ElemType *pe )
  145. {
  146. ///请求一个新节点
  147. QueueNode *pNode = (QueueNode *)malloc( sizeof(QueueNode) );
  148.  
  149. ///新节点的数据元素指向传入的元素
  150. pNode->pe = pe;
  151.  
  152. ///新节点的next节点指向 NULL
  153. pNode->next = NULL;
  154.  
  155. ///队尾的next节点指向新节点
  156. pQueue->rear->next = pNode;
  157.  
  158. ///令队尾指向新节点
  159. pQueue->rear = pNode;
  160.  
  161. return ++pQueue->len;
  162. }
  163.  
  164. /**
  165. * @brief 将队头元素出队
  166. *
  167. * @param pQueue 指向待出队的队列
  168. * @param pe 指向接收元素的指针的指针
  169. *
  170. * @return 成功出队后返回出队后队列的长度, 否则返回 -1
  171. */
  172. int DeQueue( mQueue *pQueue, ElemType **pe )
  173. {
  174.  
  175. ///队列是否为空
  176. if( pQueue->front == pQueue->rear )
  177. return -;
  178.  
  179. ///得到队头元素
  180. *pe = pQueue->front->next->pe;
  181.  
  182. ///令队头指向上一节点
  183. QueueNode *tmp = pQueue->front;
  184. pQueue->front = pQueue->front->next;
  185. free( tmp );
  186.  
  187. return --pQueue->len;
  188. }
  189.  
  190. /**
  191. * @brief 获取队头元素, 不出栈
  192. *
  193. * @param 指向待获取队头元素的队列
  194. * @param 指向接收出栈元素的指针的指针
  195. *
  196. * @return 获取成功则返回元素在队列中的位置, 否则返回 -1, 且 *pe 指向 NULL
  197. *
  198. * @note 元素位置由 0 计起
  199. */
  200. int GetHead( mQueue *pQueue, ElemType **pe )
  201. {
  202. ///队列是否为空
  203. if( pQueue->front == pQueue->rear )
  204. {
  205. *pe = NULL;
  206. return -;
  207. }
  208.  
  209. ///得到队头元素
  210. *pe = pQueue->front->next->pe;
  211.  
  212. return pQueue->len - ;
  213. }
  214.  
  215. /**
  216. * @brief 从队头到队尾对每个元素依次执行 func 函数
  217. *
  218. * @param pQueue 指向待处理的队列
  219. * @param func 回调函数
  220. */
  221. void ForEachQueue( mQueue *pQueue, void (*func)(ElemType *pe) )
  222. {
  223. QueueNode *tmp = pQueue->front;
  224.  
  225. ///遍历执行 func
  226. while( tmp != pQueue->rear && (tmp = tmp->next) )
  227. {
  228. func( tmp->pe );
  229. }
  230. }
  231.  
  232. //测试
  233.  
  234. /**
  235. * @brief 输出元素 pe
  236. */
  237. void display( ElemType *pe )
  238. {
  239. printf( "(%d,%d )", pe->x, pe->y );
  240. }
  241.  
  242. int main()
  243. {
  244. ///准备数据元素
  245. ElemType pt1 = { , };
  246. ElemType pt2 = { , };
  247. ElemType pt3 = { , };
  248. ElemType pt4 = { , };
  249. ElemType pt5 = { , };
  250.  
  251. ///测试 CreateQueue
  252. mQueue *pque = CreateQueue();
  253.  
  254. ///测试 IsEmpty、GetLength
  255. if( IsEmpty(pque) == TRUE )
  256. printf( "队列当前长度:%d, 是否为空队列:%d\n", GetLength(pque), IsEmpty(pque) );
  257.  
  258. ///测试 EnQueue
  259. EnQueue( pque, &pt1 );
  260. if( IsEmpty(pque) != TRUE )
  261. printf( "入队1元素后队列当前长度:%d, 是否为空队列:%d\n", GetLength(pque), IsEmpty(pque) );
  262.  
  263. ///测试 ClearQueue
  264. ClearQueue( pque );
  265. printf( "清空队列, 当前长度:%d\n", GetLength(pque) );
  266.  
  267. ///入队5元素
  268. printf( "\n连续入队5元素..\n" );
  269. EnQueue( pque, &pt1 );
  270. EnQueue( pque, &pt2 );
  271. EnQueue( pque, &pt3 );
  272. EnQueue( pque, &pt4 );
  273. EnQueue( pque, &pt5 );
  274.  
  275. ///测试 ForEachQueue
  276. printf( "测试 ForEachQueue:" );
  277. ForEachQueue( pque, display );
  278.  
  279. ///测试 DeQueue
  280. ElemType *p = NULL;
  281. if( DeQueue(pque, &p) != - )
  282. printf( "\n\n测试DeQueue, 出队元素为:(%d,%d), 出队后队列长度:%d\n", p->x, p->y, GetLength(pque) );
  283.  
  284. ///测试 GetHead
  285. if( GetHead(pque, &p) != - )
  286. printf( "\n测试GetHead, Head元素为(%d,%d)\n", p->x, p->y );
  287.  
  288. ///全部出队
  289. printf( "\n执行全部出队...\n" );
  290. while( DeQueue(pque, &p) != - )
  291. {
  292. printf( "当前出队:(%d,%d), 队列剩余长度:%d, 是否为空队列%d\n", p->x, p->y, GetLength(pque), IsEmpty(pque) );
  293. }
  294.  
  295. ///销毁队列
  296. printf( "\n销毁队列...\n" );
  297. DestroyQueue( pque );
  298.  
  299. return ;
  300. }

运行测试:

若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢。                                                                                                                                                                                                                                                                                                                                                       

C语言 队列 链式结构 实现的更多相关文章

  1. C语言 栈 链式结构 实现

    一个C语言链式结构实现的栈 mStack (GCC编译). /** * @brief C语言实现的链式结构类型的栈 * @author wid * @date 2013-10-30 * * @note ...

  2. C语言实现链式队列

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

  3. C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享

    最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...

  4. C语言 线性表 双向链式结构 实现

    一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...

  5. 数据结构----线性表顺序和链式结构的使用(c)

    PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写 ...

  6. 队列链式存储 - 设计与实现 - API函数

    队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...

  7. 文件上传以及JS链式结构

    文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileNam ...

  8. Javascript、C#、php、asp、python 等语言的链式操作的实现

    一.什么是链式操作 把需要的下一步操作的对象通过上一步操作返回回来.使完成某些功能具有持续性. 二.链式操作优点 代码更精简优雅.链式操作能大大精简代码量,多项操作一行代码一气呵成,搞定: 链式操作应 ...

  9. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

随机推荐

  1. scala.collection.immutable.HashSet$.empty()Lscala/collection/immutable/HashSet

    最近重新搭了spark环境.在Master上使用了IDEA来写代码.确实很方便.我用的是hadoop2.6.spark1.5.1forhadoop2.6. scala之前用的是2.11.0老是报这个错 ...

  2. PL/SQL中SELECT总结

      一.SELECT 语句的各个关键词的顺序及作用简解(这个我简略点写~) 1.SELECT 2.FROM 3.WHERE 4.GROUP BY ---对结果集进行分组,通常与聚合函数一起使用 5.H ...

  3. js实现倒计时及时间对象

    JS实现倒计时效果代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> ...

  4. ueditor 发布到服务器提示“后端配置项没有正常加载,上传插件不能正常使用!”

    原来是发布后缺少文件,直接从本地的复制过去就好了.

  5. POJ 1873 - The Fortified Forest 凸包 + 搜索 模板

    通过这道题发现了原来写凸包的一些不注意之处和一些错误..有些错误很要命.. 这题 N = 15 1 << 15 = 32768 直接枚举完全可行 卡在异常情况判断上很久,只有 顶点数 &g ...

  6. 树莓派开发系列教程3——树莓派rasp-config配置(转)

    经过前面两步我们的树莓派已经正常的工作起来了,但是在真正用它开发之前还需要进行一些列的配置以及软件的安装,这样开发起来才会得心应手,下面我们介绍一下常用的软件和服务 1.配置选项: 树莓派第一次使用的 ...

  7. HTML5和CSS3基础教程(第8版)-读书笔记(2)

    第7章 CSS构造模块 7.1 构造样式规则 样式表中包含了定义网页外观的规则.样式表中的每条规则都有两个主要部分:选 择 器(selector) 和 声 明 块(declaration block) ...

  8. PHP 数组函数整理

    如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作. 经常,开发人员发现在PHP中使用这种数据结构 ...

  9. WCF学习记录

    一个demo: http://www.cnblogs.com/iamlilinfeng/p/4083827.html

  10. 按enter执行click或者搜索问题

    最近需要将按按钮搜索的功能,改为支持按enter回车键,搜索. 实现按enter,执行click事件还是比较简单的. //按回车搜索用户 $(window).keydown(function (eve ...