/***

*ElemType.h - ElemType的定义

*

****/

#ifndef ELEMTYPE_H

#define ELEMTYPE_H

typedef int ElemType;

int compare(ElemType x, ElemType y);

void visit(ElemType e);

#endif /* ELEMTYPE_H */

/***

*ElemType.cpp - ElemType的实现

*

****/

#include

#include "ElemType.h"

int compare(ElemType x, ElemType y)

{

return(x-y);

}

void visit(ElemType e)

{

printf("%d\n", e);

}

/***

*DynaLnkQueue.cpp - 动态链式队列,即队列的动态链式存储实现

*

****/

#include

#include

#include

#include

#include "DynaLnkQueue.h"

#define NULL 0

/*------------------------------------------------------------

操作目的: 初始化队列

初始条件: 无

操作结果: 构造一个空的队列

函数参数:

LinkQueue *Q 待初始化的队列

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool InitQueue(LinkQueue *Q)

{

Q ->front = Q ->rear = (QueuePtr)malloc(sizeof(QNode));

if(Q ->front == NULL)

return false;

Q ->front ->next = NULL;

return true;

}

/*------------------------------------------------------------

操作目的: 销毁队列

初始条件: 队列Q已存在

操作结果: 销毁队列Q

函数参数:

LinkQueue *Q 待销毁的队列

返回值:

------------------------------------------------------------*/

void DestroyQueue(LinkQueue *Q)

{

assert(Q != NULL);

while(Q ->front)

{

Q ->rear = Q ->front ->next;

free(Q ->front);

Q ->front = Q ->rear;

}

}

/*------------------------------------------------------------

操作目的: 判断队列是否为空

初始条件: 队列Q已存在

操作结果: 若Q为空队列,则返回true,否则返回false

函数参数:

LinkQueue Q 待判断的队列

返回值:

bool 是否为空

------------------------------------------------------------*/

bool QueueEmpty(LinkQueue Q)

{

assert(Q.front != NULL && Q.rear != NULL);

if(Q.front == Q.rear)

return true;

else

return false;

}

/*------------------------------------------------------------

操作目的: 得到队列的长度

初始条件: 队列Q已存在

操作结果: 返回Q中数据元素的个数

函数参数:

LinkQueue Q 队列Q

返回值:

int 数据元素的个数

------------------------------------------------------------*/

int QueueLength(LinkQueue Q)

{

assert(Q.front != NULL);

QueuePtr p = Q.front;

int Length = 0;

while (p != Q.rear)

{

Length++;

p = p->next;

}

return Length;

}

/*------------------------------------------------------------

操作目的: 得到队列首元素

初始条件: 队列Q已存在

操作结果: 用e返回队列首元素

函数参数:

LinkQueue Q 队列Q

ElemType *e 队列首元素的值

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool GetHead(LinkQueue Q, ElemType *e)

{

assert(Q.front != NULL);

if(QueueEmpty(Q))

return false;

else

{

*e = Q.front ->next ->data;

return true;

}

}

/*------------------------------------------------------------

操作目的: 遍历队列

初始条件: 队列Q已存在

操作结果: 依次对Q的每个元素调用函数fp

函数参数:

LinkQueue Q 队列Q

void (*fp)() 访问每个数据元素的函数指针

返回值:

------------------------------------------------------------*/

void QueueTraverse(LinkQueue Q, void (*fp)(ElemType))

{

assert(Q.front != NULL);

QueuePtr p = Q.front ->next;

while(p)

{

(*fp)(p ->data);

p = p ->next;

}

}

/*------------------------------------------------------------

操作目的: 清空队列

初始条件: 队列Q已存在

操作结果: 将队列清空

函数参数:

LinkQueue *Q 队列Q

返回值:

------------------------------------------------------------*/

void ClearQueue(LinkQueue *Q)

{

assert(Q ->front != NULL);

QueuePtr p = Q ->front ->next;

while(p)

{

Q ->front ->next = p ->next;

free(p);

p = Q ->front ->next;

}

}

/*------------------------------------------------------------

操作目的: 在队列末尾插入元素e

初始条件: 队列Q已存在

操作结果: 插入元素e作为队列新的尾结点

函数参数:

LinkQueue *Q 队列Q

ElemType e 待插入的数据元素

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool EnQueue(LinkQueue *Q, ElemType e)

{

QueuePtr temp = (QueuePtr )malloc(sizeof(QNode));

if(!temp)

return false;

temp ->data = e;

temp ->next = NULL;

Q->rear ->next = temp;

Q ->rear = temp;

return true;

}

/*------------------------------------------------------------

操作目的: 删除链式队列的头结点

初始条件: 队列Q已存在

操作结果: 删除链式队列的头结点

函数参数:

LinkQueue *Q 队列Q

ElemType *e 待插入的数据元素

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool DeQueue(LinkQueue *Q, ElemType *e)

{

if(Q ->front == Q->rear)

return false;

QueuePtr temp = Q->front ->next;

*e = temp ->data;

Q ->front ->next= temp ->next;

if(Q ->rear == temp)

Q ->rear = Q ->front;

free(temp);

return true;

}

/***

*DynaLnkQueue.h - 动态链式队列的定义

*

****/

#if !defined(DYNALNKQUEUE_H)

#define DYNALNKQUEUE_H

#include "ElemType.h"

/*------------------------------------------------------------

// 链式队列结构的定义

------------------------------------------------------------*/

typedef struct Node

{

ElemType data; // 元素数据

struct Node *next; // 链式队列中结点元素的指针

} QNode, *QueuePtr;

typedef struct

{

QueuePtr front; // 队列头指针

QueuePtr rear; // 队列尾指针

} LinkQueue;

/*------------------------------------------------------------

// 链式队列的基本操作

------------------------------------------------------------*/

bool InitQueue(LinkQueue *Q);

void DestroyQueue(LinkQueue *Q);

bool QueueEmpty(LinkQueue Q);

int QueueLength(LinkQueue Q);

bool GetHead(LinkQueue Q, ElemType *e);

void QueueTraverse(LinkQueue Q, void (*fp)(ElemType));

void ClearQueue(LinkQueue *Q);

bool EnQueue(LinkQueue *Q, ElemType e);

bool DeQueue(LinkQueue *Q, ElemType *e);

#endif /* DYNALNKQUEUE_H */

#include

#include

#include "DynaLnkQueue.h"

int main()

{

// TODO: Place your test code here

/*LinkQueue W;

InitQueue(&W);

EnQueue(&W,1);

EnQueue(&W,2);

QueueTraverse(W,visit);*/

system("PAUSE");

return 0;

}

c语言实现队列基本算法,【算法】队列的C语言实现相关推荐

  1. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

  2. c语言循环队列入列算法,C语言——循环队列和链队列的基本运算

    // 循环队列 #include #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20; typedef struc ...

  3. 【经典回放】多种语言系列数据结构算法:队列(C版)

    一.队列ADT以及C语言实现 1 队列的原理以及ADT分析 队列是说:把一些数据按先进先出来组织,如同日常生活中的排队过程. 队列最主要的操作是 <1> 数据加入队列:<2> ...

  4. 【久远讲算法】队列——先进先出的数据结构

    你好,我是久远,上次我们进行了关于栈的讲解,我们先来对知识进行回顾: 什么是栈 栈是有序集合,队列元素的增添和移除总是发生在同一端的,这一端我们称之为栈顶,另一端称之为栈底,栈中的元素离底端越近,代表 ...

  5. 数据结构与算法:队列——02

    文章目录 三.队列 1.队列概述: 2.单向队列[数组表现形式]: 3.环形队列[数组表现形式]: 三.队列 1.队列概述: 定义: 队列定义 队列简称队,它也是一种操作受限的线性表.其限制为仅允许在 ...

  6. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  7. 【练习】2021下半年数据结构刷题笔记和总结 (三)栈 队列 链表 枚举算法

    题目来自书或者网站. 解密QQ 号--队列 回文字符串---栈 火柴棍等式 输入数字n,要求输出从1~n的全排列 [力扣]给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...

  8. JAVA数据结构与算法【队列、数组模拟(环形)队列】

    队列 使用场景:排队 队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 ...

  9. abcde依次进入一个队列_数据结构与算法(6):队列

    (文中图片出自王争老师的课程:数据结构与算法之美,侵删) 先进者先出,这就是典型的队列. 根据上篇文章,我们知道栈只支持两个基本操作:入栈 push()和出栈 pop().队列跟栈非常相似,支持的操作 ...

最新文章

  1. python flask跨域_Ajax与Flask传值的跨域问题
  2. go 函数参数nil_深入理解 Go-Defer的机制
  3. SpringCloud eureka服务状态监听
  4. python renames_Python os.renames() 方法
  5. Android开发学习笔记(二)——编译和运行原理(2)
  6. conda create出现连接问题_使用conda安装命令时一直出现问题,因为从2019年4月添加的国内镜像都不能用了...
  7. 线接触和面接触的区别_接触器是啥?跟继电器有啥区别,6大常见故障怎么处理...
  8. 保定市清苑学计算机,保定市清苑县有线数字强制安装————你们那儿学的歪门邪道...
  9. ERROR: Invalid subnet : invalid CIDR address: 解决办法
  10. audacity使用_如何使用Audacity清理数字录音
  11. labview:一个采集数据的小程序
  12. Ubuntu22.04平台安装weston
  13. 六个防止SQL注入式攻击的建议
  14. Spinach和发牌姬
  15. order by 1含义
  16. echarts地图设置legend_echarts中关于自定义legend图例文字
  17. 高德地图实现多点标注marker和动态信息窗体
  18. unity3D射击游戏
  19. ORB SLAM3加载Vocabulary更快ORBvoc.bin
  20. 申请百度地图密钥Android SDK

热门文章

  1. 铁粉看进来,surprise|湾区人工智能
  2. 百度网盘Linux版放出deb包客户端:新增支持Ubuntu 18.04 LTS
  3. 别小看无人配送,长大了就是自动驾驶的最终实现。
  4. azure夜校培训第四场3月8日18:00---网络服务
  5. 马云给雅虎员工作的精彩演讲:爱迪生欺骗了世界!
  6. idea 注册码 实测可用
  7. 一加9RT外观和部分参数揭晓:搭载骁龙888+E4直屏
  8. 小米12系列或首发骁龙898旗舰芯:三星4nm工艺
  9. 在线教育雪崩:藏在家长群里的“水军”消失了
  10. 屏幕分析师确认两款iPhone 13将采用LTPO屏幕 支持120Hz刷新率