队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - 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函数的更多相关文章
- 线性表链式存储设计与实现 - API实现
基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以 ...
- 栈的链式存储 - API实现
基本概念 其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - API实现 这里也是运用了链表的链式存储API高速实现了栈的API. 代码: // linkstack.h // 链式存储栈的A ...
- C++编程练习(6)----“实现简单的队列的链式存储结构“
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #defi ...
- 队列(FIFO)—循环队列、队列的链式存储
1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表 ...
- 队列的顺序存储与链式存储c语言实现
一. 队列 1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表. 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环. 循环队列状态: 初始时:Q.front=Q.rear=0 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- Java实现链式存储的二叉查找树(递归方法)
二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字: 2. 若右子树非空,则右子树上所有节点关键字值 ...
- Java实现链式存储的二叉树
二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...
- C#数据结构-二叉树-链式存储结构
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...
随机推荐
- Swift运行时简介
因为Swift的操作在高层并且也得与Objc联合起来干活,用Swift写的程序一般会被Objc和Swift运行时处理.因为Swift的本性--换句话说,它是一门静态语言--Swift运行时在一些关键地 ...
- Lua判断OS并添加cpath
Lua判断OS并添加cpath(金庆的专栏)Lua初始化时需要根据OS来设置package.cpath, 如果是Windows系统则添加 ?.dll, 否则添加 ?.so.不然加载错误后缀名的动态库会 ...
- GitHub无法访问或访问缓慢解决办法
缘由 由于众所周知的原因,Github最近无法访问或访问很慢.由于Github支持https,因此此次屏蔽Github采用的方法是dns污染,用户访问github会返回一个错误的IPFQ当然是一种解决 ...
- 阻尼回弹效果的ScrollView嵌套GridView
以前写过一篇带阻尼回弹效果的ScrollView,但是有些小问题,于是又重新整理了一下,这篇文章一是一个带阻尼的Scrollview,再个就是Scrollview嵌套GridView实现,而GridV ...
- JAVA面向对象-----抽象类注意细节
抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的). 抽象类可以继承普通类与抽象类. 抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化. 抽象类一定有构造方法 ...
- Java实现内部类
内部类是java中非常方便的一种机制,内部类所在的类称为宿主类,即内部类只能被它的宿主类使用,用这个特性,可以很好的控制类的可见性. 接下来看一个例子: package for_apro; impor ...
- Dynamics CRM 检测访问CRM延迟及带宽的工具
直接在浏览器中访问如下地址"http://CRMHOST/organization/tools/diagnostics/diag.aspx"(这里的CRMHOST和organiza ...
- 【ShaderToy】开篇
写在前面 呜呼,好久没有写博客了,好惭愧.题外话,感觉越大就越想家,希望可以一直和家人在一起,哪怕只是坐在一起不说话也觉得很温暖,一想到要分开眼睛就开始酸,哎.开学还是爬上来老实更新博客学习吧~ 今天 ...
- shell入门之函数应用
最近在学习shell编程,文中若有错误的地方还望各位批评指正. 先来看一个简单的求和函数 #!/bin/bash #a test about function f_sum 7 8 function f ...
- Dynamics CRM 修改数据导出到EXCEL的最大条数
系统默认的最大导出数为一万,这个数可以通过执行以下SQL看到,那要增加导出的最大数量改变MaxRecordsForExportToExcel的值即可. <span style="fon ...