队列链式存储 - 设计与实现 - 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- ...
随机推荐
- arm-none-eabi-g++ -Xlinker -T "../LF3Kmonitor.ld" -Xlinker -Map="Bogota_ICT_V.map"-ram-hosted.ld -mc
1.arm-none-eabi-g++:是编译ARM裸板用的编译器,不依赖于操作系统. 2.-Xlinker -T "../LF3Kmonitor.ld" -Xlinker -Ma ...
- EBS技术开发之VPD策略
VPD (虚拟专用数据库的简称),主要作用是根据运行环境的上下文,隐式的添加条 件. 好处是在数据库层解决细粒度的角色权限访问,避免在中间层写大量代码:坏处 是数据屏蔽的逻辑太隐蔽了,对于分析查找问题 ...
- Git运用基础之如何删除Github上不想要的项目
今天突然想删除,(强迫症想删除)之前练习时多创建的多个Github上的源代码或者无用Demo地址,然后看了一些文章都比较老式,这里我展示一下最新的删除步骤. 一.首先登录自己的Github账户主页(没 ...
- listener.ora--sqlnet.ora--tnsnames.ora的关系以及手工配置举例(转载:http://blog.chinaunix.net/uid-83572-id-5510.ht)
listener.ora--sqlnet.ora--tnsnames.ora的关系以及手工配置举例 ====================最近看到好多人说到tns或者数据库不能登录等问题,就索性总结 ...
- 早期Swift中Cocos2D初始化代码的重构
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在早期的Swift中在子类里只能调用超类的design ...
- C++对象模型的那些事儿之二:对象模型(下)
前言 上一篇博客C++对象模型的那些事儿之一为大家讲解了C++对象模型的一些基本知识,可是C++的继承,多态这些特性如何体现在对象模型上呢?单继承.多重继承和虚继承后内存布局上又有哪些变化呢?多态真正 ...
- SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式
这对时间在学习SSH中Spring架构,Spring的事务配置做了详细总结,在此之间对Spring的事务配置只是停留在听说的阶段,总结一下,整体把控,通过这次的学习发觉Spring的事务配置只要把思路 ...
- const引用
在C++中可以声明const引用 const Type& name = var: const引用让变量拥有只读属性 const int &a = b const int &a ...
- UNIX网络编程——shutdown 与 close 函数 的区别
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据 ...
- Docker教程:dokcer的配置和命令
http://blog.csdn.net/pipisorry/article/details/50803028 Docker命令查询 终端运行docker命令,它会打印所有可用的命令列表及使用描述:# ...