c语言实现队列基本算法,【算法】队列的C语言实现
/***
*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语言实现相关推荐
- 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树
<数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...
- c语言循环队列入列算法,C语言——循环队列和链队列的基本运算
// 循环队列 #include #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20; typedef struc ...
- 【经典回放】多种语言系列数据结构算法:队列(C版)
一.队列ADT以及C语言实现 1 队列的原理以及ADT分析 队列是说:把一些数据按先进先出来组织,如同日常生活中的排队过程. 队列最主要的操作是 <1> 数据加入队列:<2> ...
- 【久远讲算法】队列——先进先出的数据结构
你好,我是久远,上次我们进行了关于栈的讲解,我们先来对知识进行回顾: 什么是栈 栈是有序集合,队列元素的增添和移除总是发生在同一端的,这一端我们称之为栈顶,另一端称之为栈底,栈中的元素离底端越近,代表 ...
- 数据结构与算法:队列——02
文章目录 三.队列 1.队列概述: 2.单向队列[数组表现形式]: 3.环形队列[数组表现形式]: 三.队列 1.队列概述: 定义: 队列定义 队列简称队,它也是一种操作受限的线性表.其限制为仅允许在 ...
- java数据结构 队列_Java数据结构与算法[原创]——队列
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...
- 【练习】2021下半年数据结构刷题笔记和总结 (三)栈 队列 链表 枚举算法
题目来自书或者网站. 解密QQ 号--队列 回文字符串---栈 火柴棍等式 输入数字n,要求输出从1~n的全排列 [力扣]给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...
- JAVA数据结构与算法【队列、数组模拟(环形)队列】
队列 使用场景:排队 队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 ...
- abcde依次进入一个队列_数据结构与算法(6):队列
(文中图片出自王争老师的课程:数据结构与算法之美,侵删) 先进者先出,这就是典型的队列. 根据上篇文章,我们知道栈只支持两个基本操作:入栈 push()和出栈 pop().队列跟栈非常相似,支持的操作 ...
最新文章
- python flask跨域_Ajax与Flask传值的跨域问题
- go 函数参数nil_深入理解 Go-Defer的机制
- SpringCloud eureka服务状态监听
- python renames_Python os.renames() 方法
- Android开发学习笔记(二)——编译和运行原理(2)
- conda create出现连接问题_使用conda安装命令时一直出现问题,因为从2019年4月添加的国内镜像都不能用了...
- 线接触和面接触的区别_接触器是啥?跟继电器有啥区别,6大常见故障怎么处理...
- 保定市清苑学计算机,保定市清苑县有线数字强制安装————你们那儿学的歪门邪道...
- ERROR: Invalid subnet : invalid CIDR address: 解决办法
- audacity使用_如何使用Audacity清理数字录音
- labview:一个采集数据的小程序
- Ubuntu22.04平台安装weston
- 六个防止SQL注入式攻击的建议
- Spinach和发牌姬
- order by 1含义
- echarts地图设置legend_echarts中关于自定义legend图例文字
- 高德地图实现多点标注marker和动态信息窗体
- unity3D射击游戏
- ORB SLAM3加载Vocabulary更快ORBvoc.bin
- 申请百度地图密钥Android SDK
热门文章
- 铁粉看进来,surprise|湾区人工智能
- 百度网盘Linux版放出deb包客户端:新增支持Ubuntu 18.04 LTS
- 别小看无人配送,长大了就是自动驾驶的最终实现。
- azure夜校培训第四场3月8日18:00---网络服务
- 马云给雅虎员工作的精彩演讲:爱迪生欺骗了世界!
- idea 注册码 实测可用
- 一加9RT外观和部分参数揭晓:搭载骁龙888+E4直屏
- 小米12系列或首发骁龙898旗舰芯:三星4nm工艺
- 在线教育雪崩:藏在家长群里的“水军”消失了
- 屏幕分析师确认两款iPhone 13将采用LTPO屏幕 支持120Hz刷新率