C语言 队列 链式结构 实现
一个C语言链式结构实现的队列 mQueue (GCC编译)。
- /**
- * @brief C语言实现的链式队列
- * @author wid
- * @date 2013-10-31
- *
- * @note 若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢!
- */
- #include <stdio.h>
- #include <stdlib.h>
- #define TRUE 1
- #define FALSE 0
- typedef struct Point2D
- {
- int x;
- int y;
- }ElemType; //元素结构
- typedef struct QNODE
- {
- ElemType *pe;
- struct QNODE *next;
- }QueueNode; //队列节点结构
- typedef struct MQUEUE
- {
- QueueNode *rear; //队列尾节点
- QueueNode *front; //队列头节点
- int len; //队列长度
- }mQueue;
- //队列方法声明
- mQueue *CreateQueue(); ///创建一个空队列
- void DestroyQueue( mQueue *pQueue ); ///销毁队列 pQueue
- void ClearQueue( mQueue *pQueue ); ///置空队列 pQueue
- int IsEmpty( mQueue *pQueue ); ///是否为空空队列
- int GetLength( mQueue *pQueue ); ///获取队列长度
- int EnQueue( mQueue *pQueue, ElemType *pe ); ///将元素pe插入到队尾
- int DeQueue( mQueue *pQueue, ElemType **pe ); ///将将队头元素出队
- int GetHead( mQueue *pQueue, ElemType **pe ); ///获取队头元素(不出队)
- void ForEachQueue( mQueue *pQueue, void (*func)(ElemType *pe) ); ///从队头到队尾依次执行func函数
- //队列方法实现
- /**
- * @brief 创建一个空队列
- *
- * @return 返回指向新创建的队列的指针
- */
- mQueue *CreateQueue()
- {
- ///创建队列
- mQueue *pQueue = (mQueue *)malloc( sizeof(mQueue) );
- ///令队头指向队尾
- pQueue->front = pQueue->rear = (QueueNode *)malloc( sizeof(QueueNode) );
- ///队尾的next节点指向NULL
- pQueue->rear->next = NULL;
- ///队头的next节点指向队尾
- pQueue->front->next = pQueue->rear;
- ///初始化队长为 0
- pQueue->len = ;
- return pQueue;
- }
- /**
- * @brief 销毁队列 pQueue
- *
- * @param pQueue 指向待销毁的队列
- */
- void DestroyQueue( mQueue *pQueue )
- {
- QueueNode *tmp = NULL;
- ///释放队列内元素
- while( pQueue->front != NULL )
- {
- tmp = pQueue->front->next;
- free( pQueue->front );
- pQueue->front = tmp;
- }
- ///释放队列
- free( pQueue );
- }
- /**
- * @brief 将队列中的元素全部清除
- *
- * @param pQueue 指向待置空的队列
- */
- void ClearQueue( mQueue *pQueue )
- {
- QueueNode *tmp = NULL;
- ///释放队列内元素(保留一队尾节点)
- while( pQueue->front->next != NULL )
- {
- tmp = pQueue->front->next;
- free( pQueue->front );
- pQueue->front = tmp;
- }
- pQueue->len = ;
- }
- /**
- * @brief 是否为空队列
- *
- * @param pQueue 指向待检测的队列
- *
- * @return 若为空则返回 TRUE, 否则返回 FALSE
- */
- int IsEmpty( mQueue *pQueue )
- {
- return pQueue->len == ? TRUE : FALSE;
- }
- /**
- * @brief 获取队列长度
- *
- * @param pQueue 指向待获取长度的队列
- *
- * @return 返回队列当前长度
- */
- int GetLength( mQueue *pQueue )
- {
- return pQueue->len;
- }
- /**
- * @brief 将元素pe插入到队尾
- *
- * @param pQueue 指向待入队的队列
- * @param pe 指向待插入的元素
- *
- * @return 插入成功则返回入队后队列的长度, 否则返回 -1
- */
- int EnQueue( mQueue *pQueue, ElemType *pe )
- {
- ///请求一个新节点
- QueueNode *pNode = (QueueNode *)malloc( sizeof(QueueNode) );
- ///新节点的数据元素指向传入的元素
- pNode->pe = pe;
- ///新节点的next节点指向 NULL
- pNode->next = NULL;
- ///队尾的next节点指向新节点
- pQueue->rear->next = pNode;
- ///令队尾指向新节点
- pQueue->rear = pNode;
- return ++pQueue->len;
- }
- /**
- * @brief 将队头元素出队
- *
- * @param pQueue 指向待出队的队列
- * @param pe 指向接收元素的指针的指针
- *
- * @return 成功出队后返回出队后队列的长度, 否则返回 -1
- */
- int DeQueue( mQueue *pQueue, ElemType **pe )
- {
- ///队列是否为空
- if( pQueue->front == pQueue->rear )
- return -;
- ///得到队头元素
- *pe = pQueue->front->next->pe;
- ///令队头指向上一节点
- QueueNode *tmp = pQueue->front;
- pQueue->front = pQueue->front->next;
- free( tmp );
- return --pQueue->len;
- }
- /**
- * @brief 获取队头元素, 不出栈
- *
- * @param 指向待获取队头元素的队列
- * @param 指向接收出栈元素的指针的指针
- *
- * @return 获取成功则返回元素在队列中的位置, 否则返回 -1, 且 *pe 指向 NULL
- *
- * @note 元素位置由 0 计起
- */
- int GetHead( mQueue *pQueue, ElemType **pe )
- {
- ///队列是否为空
- if( pQueue->front == pQueue->rear )
- {
- *pe = NULL;
- return -;
- }
- ///得到队头元素
- *pe = pQueue->front->next->pe;
- return pQueue->len - ;
- }
- /**
- * @brief 从队头到队尾对每个元素依次执行 func 函数
- *
- * @param pQueue 指向待处理的队列
- * @param func 回调函数
- */
- void ForEachQueue( mQueue *pQueue, void (*func)(ElemType *pe) )
- {
- QueueNode *tmp = pQueue->front;
- ///遍历执行 func
- while( tmp != pQueue->rear && (tmp = tmp->next) )
- {
- func( tmp->pe );
- }
- }
- //测试
- /**
- * @brief 输出元素 pe
- */
- void display( ElemType *pe )
- {
- printf( "(%d,%d )", pe->x, pe->y );
- }
- int main()
- {
- ///准备数据元素
- ElemType pt1 = { , };
- ElemType pt2 = { , };
- ElemType pt3 = { , };
- ElemType pt4 = { , };
- ElemType pt5 = { , };
- ///测试 CreateQueue
- mQueue *pque = CreateQueue();
- ///测试 IsEmpty、GetLength
- if( IsEmpty(pque) == TRUE )
- printf( "队列当前长度:%d, 是否为空队列:%d\n", GetLength(pque), IsEmpty(pque) );
- ///测试 EnQueue
- EnQueue( pque, &pt1 );
- if( IsEmpty(pque) != TRUE )
- printf( "入队1元素后队列当前长度:%d, 是否为空队列:%d\n", GetLength(pque), IsEmpty(pque) );
- ///测试 ClearQueue
- ClearQueue( pque );
- printf( "清空队列, 当前长度:%d\n", GetLength(pque) );
- ///入队5元素
- printf( "\n连续入队5元素..\n" );
- EnQueue( pque, &pt1 );
- EnQueue( pque, &pt2 );
- EnQueue( pque, &pt3 );
- EnQueue( pque, &pt4 );
- EnQueue( pque, &pt5 );
- ///测试 ForEachQueue
- printf( "测试 ForEachQueue:" );
- ForEachQueue( pque, display );
- ///测试 DeQueue
- ElemType *p = NULL;
- if( DeQueue(pque, &p) != - )
- printf( "\n\n测试DeQueue, 出队元素为:(%d,%d), 出队后队列长度:%d\n", p->x, p->y, GetLength(pque) );
- ///测试 GetHead
- if( GetHead(pque, &p) != - )
- printf( "\n测试GetHead, Head元素为(%d,%d)\n", p->x, p->y );
- ///全部出队
- printf( "\n执行全部出队...\n" );
- while( DeQueue(pque, &p) != - )
- {
- printf( "当前出队:(%d,%d), 队列剩余长度:%d, 是否为空队列%d\n", p->x, p->y, GetLength(pque), IsEmpty(pque) );
- }
- ///销毁队列
- printf( "\n销毁队列...\n" );
- DestroyQueue( pque );
- return ;
- }
运行测试:
若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢。
C语言 队列 链式结构 实现的更多相关文章
- C语言 栈 链式结构 实现
一个C语言链式结构实现的栈 mStack (GCC编译). /** * @brief C语言实现的链式结构类型的栈 * @author wid * @date 2013-10-30 * * @note ...
- C语言实现链式队列
链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...
- C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享
最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...
- C语言 线性表 双向链式结构 实现
一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...
- 数据结构----线性表顺序和链式结构的使用(c)
PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写 ...
- 队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...
- 文件上传以及JS链式结构
文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileNam ...
- Javascript、C#、php、asp、python 等语言的链式操作的实现
一.什么是链式操作 把需要的下一步操作的对象通过上一步操作返回回来.使完成某些功能具有持续性. 二.链式操作优点 代码更精简优雅.链式操作能大大精简代码量,多项操作一行代码一气呵成,搞定: 链式操作应 ...
- C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...
随机推荐
- scala.collection.immutable.HashSet$.empty()Lscala/collection/immutable/HashSet
最近重新搭了spark环境.在Master上使用了IDEA来写代码.确实很方便.我用的是hadoop2.6.spark1.5.1forhadoop2.6. scala之前用的是2.11.0老是报这个错 ...
- PL/SQL中SELECT总结
一.SELECT 语句的各个关键词的顺序及作用简解(这个我简略点写~) 1.SELECT 2.FROM 3.WHERE 4.GROUP BY ---对结果集进行分组,通常与聚合函数一起使用 5.H ...
- js实现倒计时及时间对象
JS实现倒计时效果代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> ...
- ueditor 发布到服务器提示“后端配置项没有正常加载,上传插件不能正常使用!”
原来是发布后缺少文件,直接从本地的复制过去就好了.
- POJ 1873 - The Fortified Forest 凸包 + 搜索 模板
通过这道题发现了原来写凸包的一些不注意之处和一些错误..有些错误很要命.. 这题 N = 15 1 << 15 = 32768 直接枚举完全可行 卡在异常情况判断上很久,只有 顶点数 &g ...
- 树莓派开发系列教程3——树莓派rasp-config配置(转)
经过前面两步我们的树莓派已经正常的工作起来了,但是在真正用它开发之前还需要进行一些列的配置以及软件的安装,这样开发起来才会得心应手,下面我们介绍一下常用的软件和服务 1.配置选项: 树莓派第一次使用的 ...
- HTML5和CSS3基础教程(第8版)-读书笔记(2)
第7章 CSS构造模块 7.1 构造样式规则 样式表中包含了定义网页外观的规则.样式表中的每条规则都有两个主要部分:选 择 器(selector) 和 声 明 块(declaration block) ...
- PHP 数组函数整理
如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作. 经常,开发人员发现在PHP中使用这种数据结构 ...
- WCF学习记录
一个demo: http://www.cnblogs.com/iamlilinfeng/p/4083827.html
- 按enter执行click或者搜索问题
最近需要将按按钮搜索的功能,改为支持按enter回车键,搜索. 实现按enter,执行click事件还是比较简单的. //按回车搜索用户 $(window).keydown(function (eve ...