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 ...
随机推荐
- hive 中窗口函数row_number,rank,dense_ran,ntile分析函数的用法
hive中一般取top n时,row_number(),rank,dense_ran()这三个函数就派上用场了, 先简单说下这三函数都是排名的,不过呢还有点细微的区别. 通过代码运行结果一看就明白了. ...
- arpg网页游戏之地图(四)
这一节主要是针对上一节的补充,关于地图的优化策略上一节中已经涉及了一些,这一节具体说下. 地图块加载队列:就拿1280*800的屏幕分辨率来讲,大约需要加载的地图块为30~35块之间,如果这个时候一下 ...
- JSONCPP安装
我刚刚开始从windows MFC下的开发转的LINUX下的C++开发.在写这篇文章之前我三次安装jsoncpp,每一次安装都犯不同的错误.为了我能够在下一次安装时不再犯错误.特写此文!JSONCPP ...
- sql基础知识(新手必备)
一.简单查询 1.查询所有数据,查询部分列数据,列别名 SELECT * FROM 表名 SELECT 列1 AS 'BIAOTI1','BIAOTI2'=列2 FROM 表名 2.查询不重复的数据 ...
- delete drop truncate 区别
truncate 删除内容,并释放空间,并不删除表结构,删除标识列,标识列重新从1开始delete 删除内容,不释放空间,不删除表结构,不删除标识列,标识列继续增加drop 直接删除表
- usb host驱动
参考 http://blog.csdn.net/star530/article/details/8019604
- 了解 XSS 攻击原理
在了解 XSS 之前必须知道『网站登入(Session)』的原理 简单的说当会员成功登入后 网站会给浏览器一个『令牌』 之后只要拿着这个『令牌』到网站上 就会被视为已经登入 再来下面是 XSS 最简单 ...
- 【译】RabbitMQ:"Hello World"
简介 RabbitMQ是一个消息代理.从本质上讲,它从消息生产者处接收消息,然后传递给消息的消费者.它在消息的生产者和消费者之间根据你指定的规则对消息进行路由.缓存和持久化. RabbitMQ通常使用 ...
- 使用 xlrd 模块实现对excel 的读取、excel转json 、excel 转 mysql insert 语句
#-*- coding:utf-8 -*- # 处理 excel 中的 area 为 Mysql insert 语句 import xlrd, json, codecs, os # data = xl ...
- nodeJS分层
一.nodeJS分层 分为三层: - 表现层:接受用户数据,并封装 - 服务层:与公司业务有关的东西,处理判断呀什么的 - 持久层:与数据库有关的 表现层:page与表现层的数据传递,route ...