一个能够自动扩容的顺序结构的队列 ArrQueue (GCC编译)。

 /**
* @brief C语言顺序结构队列的实现
* @author wid
* @date 2013-10-30
*
* @note 若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢!
*/ #include <stdio.h>
#include <stdlib.h> #define TRUE 1
#define FALSE 0 typedef struct Point2D
{
int x;
int y;
}ElemType; //元素结构 typedef struct
{
ElemType **rear; //队尾
ElemType *front; //队头
int len; //队列长度
int size; //队列总容量
}ArrQueue; //队列结构 //声明队列方法 ArrQueue *CreateQueue( int nLen ); //创建初始长度为 nLen 队列
void DestroyQueue( ArrQueue *pQueue ); //销毁队列pQueue
void ClearQueue( ArrQueue *pQueue ); //清空队列内元素
int GetLength( ArrQueue *pQueue ); //获取队列长度
int GetSize( ArrQueue *pQueue ); //获取队列总容量
int IsEmpty( ArrQueue *pQueue ); //检测队列是否为空
int GetHead( ArrQueue *pQueue, ElemType **pe ); //获取队头元素
int EnQueue( ArrQueue *pQueue, ElemType *pe ); //将元素插入到队尾
int DeQueue( ArrQueue *pQueue, ElemType **pe ); //将队头元素出队
void ForEachQueue( ArrQueue *pQueue, void (*func)(ElemType *pe) ); //从对尾到队头依次执行 func //队列方法实现 /**
* @brief 创建初始长度为 nLen 的队列
*
* @param nLen 队列的初始长度
*
* @return 返回指向新创建的队列的指针
*/
ArrQueue *CreateQueue( int nLen )
{
ArrQueue *pQueue = (ArrQueue *)malloc( sizeof(ArrQueue) );
pQueue->rear = (ElemType **)calloc( nLen, sizeof(ElemType **) );
pQueue->front = pQueue->rear[];
pQueue->len = ;
pQueue->size = nLen; return pQueue;
} /**
* @brief 销毁队列
*
* @param pQueue 指向待销毁的队列的指针
*/
void DestroyQueue( ArrQueue *pQueue )
{
free( pQueue->rear );
free( pQueue ); pQueue = NULL;
} /**
* @brief 清空队列内元素
*/
void ClearQueue( ArrQueue *pQueue )
{
pQueue->front = pQueue->rear[]; pQueue->len = ;
} /**
* @brief 获取队列长度
*
* @param 指向待获取长度的队列的指针
*
* @return 返回队列当前长度
*/
int GetLength( ArrQueue *pQueue )
{
return pQueue->len;
} /**
* @brief 获取队列总容量
*
* @param pQueue 指向待获取容量的队列
*
* @return 返回队列当前总容量
*/
int GetSize( ArrQueue *pQueue )
{
return pQueue->size;
} /**
* @brief 检测队列是否为空
*
* @param pQueue 指向待检测的队列
*
* @return 若为空, 则返回 TRUE, 否则返回 FALSE
*/
int IsEmpty( ArrQueue *pQueue )
{
return pQueue->len == ? TRUE : FALSE;
} /**
* @brief 获取队头元素
*
* @param pQueue 指向待获取队头元素的队列
*
* @param pe 指向接收元素的指针的指针
*
* @return 返回队头在队列中的位置(位置由 0 计起)
*/
int GetHead( ArrQueue *pQueue, ElemType **pe )
{
if( pQueue->len == )
{
*pe = NULL;
return -;
} *pe = pQueue->rear[pQueue->len-]; return pQueue->len-;
} /**
* @brief 将元素 pe 插入到队尾
*
* @param pQueue 指向待插入元素的队列
* @param pe 指向待插入的元素
*
* @return 返回成功插入后队列的长度
*/
int EnQueue( ArrQueue *pQueue, ElemType *pe )
{
///检测是否需要扩容
if( pQueue->len == pQueue->size )
{ //需要扩容
pQueue->rear = realloc( pQueue->rear, * pQueue->size * sizeof(ElemType *) );
pQueue->size = * pQueue->size;
} int i = ;
for( i = pQueue->len; i > ; --i )
{
pQueue->rear[i] = pQueue->rear[i-];
}
pQueue->rear[] = pe;
pQueue->front = pQueue->rear[pQueue->len]; return ++pQueue->len;
} /**
* @brief 将队头元素出队
*
* @param pQueue 指向待出队的队列
* @param pe 指向接收元素的指针的指针
*
* @return 成功出队则返回出队后队列的长度, 否则返回 -1
*/
int DeQueue( ArrQueue *pQueue, ElemType **pe )
{
if( pQueue->len == )
{
*pe = NULL;
return -;
}
*pe = pQueue->front;
--pQueue->len;
pQueue->front = pQueue->rear[pQueue->len-]; return pQueue->len;
} /**
* @brief 从队尾到队头每个元素一次执行 func
*
* @param pQueue 指向待处理的队列
* @param func 回调函数指针
*/
void ForEachQueue( ArrQueue *pQueue, void (*func)(ElemType *pe) )
{
int i = ;
for( i = ; i < pQueue->len; ++i )
{
func( pQueue->rear[i] );
}
} //测试
void display( ElemType *pe )
{
printf( "(%d,%d) ", pe->x, pe->y );
} int main()
{
ElemType t1 = {, };
ElemType t2 = {, };
ElemType t3 = {, };
ElemType t4 = {, };
ElemType t5 = {, }; ///测试 CreateQueue
ArrQueue *pque = CreateQueue( ); ///测试入队
EnQueue( pque, &t1 );
EnQueue( pque, &t2 );
EnQueue( pque, &t3 );
EnQueue( pque, &t4 );
EnQueue( pque, &t5 ); ///测试 ForEachQueue
ForEachQueue( pque, display ); ///测试 IsEmpty、GetSize、GetLength
if( IsEmpty( pque ) != TRUE )
printf( "\n队列总容量:%d, 当前长度:%d\n", GetSize(pque), GetLength(pque) ); ///测试全部出队
printf( "\n测试全部出队:\n" );
ElemType *p;
while( DeQueue( pque, &p ) != - )
{
printf( "当前出队:(%d,%d), 剩余队列长为:%d\n", p->x, p->y, GetLength(pque) );
} ///测试 ClearQueue
printf( "\n再次入队2元素..\n" );
EnQueue( pque, &t1 );
EnQueue( pque, &t2 );
ForEachQueue( pque, display );
printf( "\n清空队列..\n" );
ClearQueue( pque );
printf( "队列总容量:%d, 当前长度:%d\n", GetSize(pque), GetLength(pque) ); ///测试 GetHead
printf( "\n再次入队2元素..\n" );
EnQueue( pque, &t1 );
EnQueue( pque, &t2 );
ForEachQueue( pque, display );
GetHead( pque, &p );
printf( "\n获取队头元素:(%d,%d)\n", p->x, p->y );
printf( "队列总容量:%d, 当前长度:%d\n", GetSize(pque), GetLength(pque) ); ///销毁队列
DestroyQueue( pque ); return ;
}

测试运行:

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

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

  1. C语言 串 顺序结构 实现

    一个能够自动扩容的顺序结构的串 ArrString (GCC编译). /** * @brief C语言 串 顺序结构 实现 * @author wid * @date 2013-11-01 * * @ ...

  2. C语言 栈 顺序结构 实现

    一个能够自动扩容的顺序结构的栈 ArrStack 实例 (GCC编译). /** * @brief C语言实现的顺序结构类型的栈 * @author wid * @date 2013-10-29 * ...

  3. C语言之顺序结构

    该章内容:这章我们学习三大结构之一:顺序结构,它是程序从上往下顺序执行,是程序运行最简单的方式.printf和scanf函数使用和特例是必考知识.本章是考试的重点章节. 学习方法:从简单的顺序结构题目 ...

  4. (七)C语言之顺序结构

  5. Java 流程控制语句 之 顺序结构

    在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说,程序的流程对运行结果 有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要通过控制语句的执行顺序来实 ...

  6. C语言 队列 链式结构 实现

    一个C语言链式结构实现的队列 mQueue (GCC编译). /** * @brief C语言实现的链式队列 * @author wid * @date 2013-10-31 * * @note 若代 ...

  7. C语言第二次作业-----顺序结构

    一:改错题 (1)输出指定信息: 将给定源代码输入编译器: 执行编译命令,发现编译器报错,错误信息如下: 经检查,发现源程序将"stdio.h"误拼为"stido.h&q ...

  8. C语言程序设计第二次作业--顺序结构

    C语言程序设计第二次作业--顺序结构 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido ...

  9. C语言第二次作业——顺序结构

    一.改错题 1.输出带框文字:在屏幕上输出以下3行信息. (1)源程序 对程序进行编译,发现错误信息1 错误原因:stdio拼写错误 改正方法:将stdio正确拼写 对程序进行编译,发现错误信息2 错 ...

随机推荐

  1. Bootstrap导航点击菜单跳转与点击缩放菜单折叠按钮缓冲效果插件jquery.singlePageNav.min.js

    引入步骤: <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></scrip ...

  2. (转载)IOS中UIScrollView的属性和委托方法

    http://www.jizhishusheng.com/?p=453   ---- 以下内容来自 UIScrollView 类负责所有基于 UIKit 的滚动操作一.创建 1. CGRect bou ...

  3. 亚马逊开放机器学习系统源代码:挑战谷歌TensorFlow

    北京时间5月17日上午消息,亚马逊在开源技术领域迈出了更大的步伐,宣布开放该公司的机器学习软件DSSTNE的源代码.这个最新项目将与谷歌的TensorFlow竞争,后者已于去年开源.亚马逊表示,在缺乏 ...

  4. JSP页面数据展示:分组数据展示

    一.描述: 页面上要展示的数据只要写好sql从数据库查出来即可,但是展示有时候不是太好处理.比如工作中遇到的这种情况:有一个问题处理的流程,其中需要选择下一处理人,这些处理人要以部门的形式分组展示,实 ...

  5. ZT 第一范式,第二范式,第三范式

    第一范式,第二范式,第三范式 Posted on 2012-05-09 16:30 GISerYang 阅读(6472) 评论(0) 编辑 收藏 第一范式 存在非主属性对码的部分依赖关系 R(A,B, ...

  6. 理解GC日志

    每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样.但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33. ...

  7. coreseek实战(四):php接口的使用,完善php脚本代码

    coreseek实战(四):php接口的使用,完善php脚本代码 在上一篇文章 coreseeek实战(三)中,已经能够正常搜索到结果,这篇文章主要是把 index.php 文件代码写得相对完整一点点 ...

  8. linux /usr/bin/ld: cannot find -lxxx

    在linux环境编译应用程式或lib的source code时出现如下错误:/usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的source code 而有不同的 ...

  9. PHP-redis中文文档-命令

    关于redis of php的安装,详见自己的为知笔记,其中包含: 1.php版本的redis的安装 2.redis的使用方法 3.redis带conf文件的启动 这里介绍redis的命令,php版本 ...

  10. 获取当前html标签自定义属性的值

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...