队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - 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. Swift类型推测在可选调用中的小提示

    我们知道Swift中协议里也有对应于Objc中的可选方法或计算属性,当然协议必须以@objc伪指令修饰否则不可以哦. 如下示例: @objc protocol Transaction{ fun com ...

  2. android混淆那些坑

    ProGuard简介 在最新的Android Studio 2.2.2版本创建的Android工程中,module中的build.gradle有如下一段配置.这里的minifyEnabled即用来控制 ...

  3. Appium移动自动化测试(三)--安装Android模拟器(建议直接连手机,跳过此步)

    转自虫师,亲测有效,留备后用. 本文中如果直接安装时不出现错误,则可以忽略(一.二.三.四.五),我安装的是5.1.1,直接成功,就是有点慢,要有耐心. 如果到最后一步,启动不起来,报错: emula ...

  4. 全废话SQL Server统计信息(2)——统计信息基础

    接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...

  5. Python descriptor

    class A: def __init__(self, name): self.name = name def __get__(self, ins, cls): print('call get') i ...

  6. Python rich comparisons 自定义对象比较过程和返回值

    Classes wishing to support the rich comparison mechanisms must add one or more of the following new ...

  7. ORACLE异常(整理网上资料)

    一.oracle预定义异常 命名的系统异常 产生原因 Oracle Error SQLCODE Value ACCESS_INTO_NULL 未定义对象 ORA-06530  -6530 CASE_N ...

  8. activiti bpmnModel使用

    bpmnModel对象,是activiti动态部署钟很重要的一个对象,如果bpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,就显得力不从心,之前我们公司自己开发了一套acti ...

  9. CUDA5.5 的环境变量设置

    为了方便,我写了这个文件用于设置cuda5.5的环境变量. 其中有些环境变量可能用不到,大家根据需要修改就是了. export CUDA_HOME=/usr/local/cuda-5.5 export ...

  10. Github上怎么修改别人的项目并且提交给原作者!图文并茂!

    Github上怎么修改别人的项目并且提交给原作者!图文并茂! 写这篇博客的初衷,是因为我的项目Only需要一些朋友一起参与进来,但是很多的Git都不是很熟练,其实版本控制这种东西没有什么难度的,只要稍 ...