数据结构封装之《LinkQueue链式队列》
2017-08-29 13:43
155 查看
说明:
本队列是通过链表实现的;这里采用了代码复用的方法,即使用了LinkList线性链表,详见 《LinkList单向链表》;
下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析
代码:
LinkQueue.h#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
LinkQueue.c
#include <malloc.h> #include "LinkList.h" #include "LinkQueue.h" typedef struct _tag_LinkQueueNode { LinkListNode header 4000 ; void* item; } TLinkQueueNode; //生成队列 LinkQueue* LinkQueue_Create() // O(1) { return LinkList_Create(); } //销毁队列 void LinkQueue_Destroy(LinkQueue* queue) // O(n) { LinkQueue_Clear(queue); LinkList_Destroy(queue); } //清空队列 void LinkQueue_Clear(LinkQueue* queue) // O(n) { while( LinkQueue_Length(queue) > 0 ) { LinkQueue_Retrieve(queue); } } //入队 int LinkQueue_Append(LinkQueue* queue, void* item) // O(n) { TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode)); int ret = (item != NULL) && (node != NULL); if( ret ) { node->item = item; ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue)); } if( !ret ) { free(node); } return ret; } //出队 void* LinkQueue_Retrieve(LinkQueue* queue) // O(1) { TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0); void* ret = NULL; if( node != NULL ) { ret = node->item; free(node); } return ret; } //队列头部数据(不出队) void* LinkQueue_Header(LinkQueue* queue) // O(1) { TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0); void* ret = NULL; if( node != NULL ) { ret = node->item; } return ret; } //队列长度 int LinkQueue_Length(LinkQueue* queue) // O(1) { return LinkList_Length(queue); }
main.c
#include <stdio.h> #include <stdlib.h> #include "LinkQueue.h" int main(int argc, char *argv[]) { LinkQueue* queue = LinkQueue_Create(); int a[10] = {0}; int i = 0; for(i=0; i<10; i++) { a[i] = i + 1; LinkQueue_Append(queue, a + i); } printf("Header: %d\n", *(int*)LinkQueue_Header(queue)); printf("Length: %d\n", LinkQueue_Length(queue)); while( LinkQueue_Length(queue) > 0 ) { printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue)); } LinkQueue_Destroy(queue); return 0; }
函数结构分析:
1.LinkQueue_Create2.LinkQueue_Retrieve
3.LinkQueue_Clear
4.LinkQueue_Header
5.LinkQueue_Append
汇编分析:
main1.LinkQueue_Create
2.LinkQueue_Append
3.LinkQueue_Header
4.LinkQueue_Length
5.LinkQueue_Retrieve
6.LinkQueue_Destroy
相关文章推荐
- week03_python内置数据结构__封装、解构
- java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 LinkedList
- 对象容器 - Java对数据结构的封装 - List, ArrayList, LinkedList, Set, SortedSet, HashSet, Map, TreeMap
- 3D游戏引擎底层数据结构的封装之Queue
- 【算法和数据结构】二叉树的定义和封装(C++实现)
- nginx封装的数据结构
- 一种数据结构的封装模式
- 3D游戏引擎底层数据结构的封装之Dictionary
- 封装TableView有可能用到的数据结构和UITableViewCell的一个继承类
- 数据结构数组接口和封装
- 数据结构与算法:单向链表实现与封装(有头)
- Nginx学习笔记(三):封装的数据结构
- Nginx学习(3)—封装的数据结构
- 3D游戏引擎底层数据结构的封装之Dictionary
- 封装c++与matlab引擎交互的数据结构:行优先矩阵类
- 【原】C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- JS高级-数据结构的封装
- 【算法和数据结构】线性表(三)栈的定义和封装
- C# 一个自己写的树结构代码(2)-Array,HashTable,List,String数据结构操作封装