队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数

队列也是一种特殊的线性表;可以用线性表链式存储来模拟队列的链式存储。

主要代码:

// linkqueue.h
// 队列链式存储API声明

#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_

typedef void LinkQueue;

// 创建队列
LinkQueue* LinkQueue_Create();

// 销毁队列
void LinkQueue_Destroy(LinkQueue* queue);

// 清空队列
void LinkQueue_Clear(LinkQueue* queue);

// 入队列
int LinkQueue_Append(LinkQueue* queue, void* item);

// 出队列
void* LinkQueue_Retrieve(LinkQueue* queue);

// 获取对头元素
void* LinkQueue_Header(LinkQueue* queue);

// 获取队列长度
int LinkQueue_Length(LinkQueue* queue);

#endif //_MY_LINKQUEUE_H_
// linkqueue.cpp
// 队列链式存储API实现
// 调用了链式存储线性表

#include <stdio.h>
#include "linkqueue.h"
#include "linklist.h"
#include <malloc.h>

typedef struct _tag_LinkQueue
{
	LinkListNode node;
	void* item;
}TLinkQueue;

// 创建队列相当于创建链表
LinkQueue* LinkQueue_Create()
{
	return LinkList_Create();
}

// 销毁队列相当于创建链表
void LinkQueue_Destroy(LinkQueue* queue)
{
	LinkQueue_Clear(queue);
	LinkList_Destroy(queue);
}

// 清空队列相当于清空链表
void LinkQueue_Clear(LinkQueue* queue)
{
	while (LinkQueue_Length(queue)) {
		LinkQueue_Retrieve(queue);
	}
}

// 入队列相当于在链表尾部插入元素
int LinkQueue_Append(LinkQueue* queue, void* item)
{
	TLinkQueue *tmp = NULL;
	int ret = 0;

	tmp = (TLinkQueue *)malloc(sizeof(TLinkQueue));
	if (tmp == NULL) { // 分配失败
		return -1;
	}

	tmp->item = item;

	ret = LinkList_Insert(queue, (LinkListNode *)tmp, LinkList_Length(queue));
	if (ret) {
		printf("function LinkQueue_Append err: %d\n", ret);
		free(tmp);
		return ret;
	}

	return ret;
}

// 出队列相当于删除链表0号位置的元素
void* LinkQueue_Retrieve(LinkQueue* queue)
{
	TLinkQueue *tmp = NULL;
	void* item = NULL;
	tmp = (TLinkQueue *)LinkList_Delete(queue, 0);
	if (tmp == NULL) {
		return NULL;
	}

	item = tmp->item;
	free(tmp); // 不要忘记出队列的时候释放结点

	return item;
}

// 获取队头元素相当于获取链表0号位置元素
void* LinkQueue_Header(LinkQueue* queue)
{
	TLinkQueue *tmp = NULL;
	tmp = (TLinkQueue *)LinkList_Get(queue, 0);
	if (tmp == NULL) {
		return NULL;
	}
	return tmp->item;
}

// 获取队列长度
int LinkQueue_Length(LinkQueue* queue)
{
	return LinkList_Length(queue);
}
// main.cpp
// 队列链式存储API测试程序

#include <stdio.h>
#include "linkqueue.h"

const int maxn = 10;

void play()
{
	int i = 0, a[maxn];
	LinkQueue *lq = NULL;

	for (i = 0; i < maxn; ++i) {
		a[i] = i + 1;
	}

	lq = LinkQueue_Create(); // 创建队列

	// 入队列
	for (i = 0; i < maxn; ++i) {
		LinkQueue_Append(lq, &a[i]);
	}

	// 队列属性
	printf("header: %d\n", *((int *)LinkQueue_Header(lq)));
	printf("length: %d\n", LinkQueue_Length(lq));

	// 出队列
	while (LinkQueue_Length(lq)) {
		int tmp = *((int *)LinkQueue_Retrieve(lq));
		printf("%d\n", tmp);
	}

	// 销毁队列
	LinkQueue_Destroy(lq);
}

int main()
{
	play();

	return 0;
}

有关顺序存储表的相关内容,请参看我的另一篇博文线性表的顺序存储设计和实现 - API函数实现

相关工程代码:Github

队列链式存储 - 设计与实现 - API函数的更多相关文章

  1. 线性表链式存储设计与实现 - API实现

    基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以 ...

  2. 栈的链式存储 - API实现

    基本概念 其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - API实现 这里也是运用了链表的链式存储API高速实现了栈的API. 代码: // linkstack.h // 链式存储栈的A ...

  3. C++编程练习(6)----“实现简单的队列的链式存储结构“

    队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #defi ...

  4. 队列(FIFO)—循环队列、队列的链式存储

    1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表 ...

  5. 队列的顺序存储与链式存储c语言实现

    一. 队列 1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表. 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环. 循环队列状态: 初始时:Q.front=Q.rear=0 ...

  6. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  7. Java实现链式存储的二叉查找树(递归方法)

    二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字: 2. 若右子树非空,则右子树上所有节点关键字值 ...

  8. Java实现链式存储的二叉树

    二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...

  9. C#数据结构-二叉树-链式存储结构

    对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...

随机推荐

  1. Unity插件 - MeshEditor(八)模型镜像特效

    将静态模型(带MeshFilter)按指定轴向.指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之前模型的顶点, ...

  2. ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS下使用传感器和执行器

    ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS使用传感器和执行器 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 第四 ...

  3. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...

  4. cenos安装jdk

    安装方式:手动安装 软件:jdk-7u79-linux-x64.tar.gz 官网下载地址:进行下载. 下载完成之后上传到我们的服务器,我使用的是cenos6.5阿里云系统.securecrt工具上传 ...

  5. 剑指Offer--图的操作

    剑指Offer–图的操作 前言   企业笔试过程中会涉及到数据结构的方方面面,现将有关图的深度优先搜索与广度优先搜索进行整理归纳,方便日后查阅.   在已做过的笔试题目中,可用DFS解决的题目有: & ...

  6. Java中读取Excel功能实现_POI

    这里使用apache的poi进行读取excel 1,新建javaproject 项目:TestExcel 2,导入包 包下载地址:http://poi.apache.org/download.html ...

  7. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  8. 1. React介绍 React开发环境搭建 React第一个程序

    什么是 React         React 是 Facebook 发布的 JavaScript 库,以其高性能和独特的设计理念受到了广泛关注. React的开发背景         Faceboo ...

  9. UNIX网络编程——客户/服务器程序设计示范(总结)

    (1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了.这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收.我们的其他意见是就重负荷运 ...

  10. matlab函数interp2及其c++代码

    最近将一个matlab程序转为c++,途中遇到interp2这个家伙,我是左查右查,发现网上没有人总结这个玩意,于是我来初探一下,还是别有洞天的,嘿嘿. 1.关于interp2 Vq = interp ...