数据结构封装之《LinkQueue2.0改进链式队列》
来源:互联网 发布:淘宝店铺网址怎么复制 编辑:程序博客网 时间:2024/06/06 07:30
说明:
本队列对LinkQueue进行了改进,摒弃了LinkList的代码,直接封装;
通过复用LinkList的方法封装的LinkQueue,LinkList请看:数据结构封装之《LinkList单向链表》
- 上一版本,请看:数据结构封装之《LinkQueue链式队列1.0》
下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析
代码:
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 <stdio.h>#include "LinkQueue.h"typedef struct _tag_LinkQueueNode TLinkQueueNode;struct _tag_LinkQueueNode{ TLinkQueueNode* next; void* item;};typedef struct _tag_LinkQueue{ TLinkQueueNode* front; TLinkQueueNode* rear; int length;} TLinkQueue;LinkQueue* LinkQueue_Create() // O(1){ TLinkQueue* ret = (TLinkQueue*)malloc(sizeof(TLinkQueue)); if( ret != NULL ) { ret->front = NULL; ret->rear = NULL; ret->length = 0; } return ret;}void LinkQueue_Destroy(LinkQueue* queue) // O(n){ LinkQueue_Clear(queue); free(queue);}void LinkQueue_Clear(LinkQueue* queue) // O(n){ while( LinkQueue_Length(queue) > 0 ) { LinkQueue_Retrieve(queue); }}int LinkQueue_Append(LinkQueue* queue, void* item) // O(1){ TLinkQueue* sQueue = (TLinkQueue*)queue; TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode)); int ret = (sQueue != NULL ) && (item != NULL) && (node != NULL); if( ret ) { node->item = item; if( sQueue->length > 0 ) { sQueue->rear->next = node; sQueue->rear = node; node->next = NULL; } else { sQueue->front = node; sQueue->rear = node; node->next = NULL; } sQueue->length++; } if( !ret ) { free(node); } return ret;}void* LinkQueue_Retrieve(LinkQueue* queue) // O(1){ TLinkQueue* sQueue = (TLinkQueue*)queue; TLinkQueueNode* node = NULL; void* ret = NULL; if( (sQueue != NULL) && (sQueue->length > 0) ) { node = sQueue->front; sQueue->front = node->next; ret = node->item; free(node); sQueue->length--; if( sQueue->length == 0 ) { sQueue->front = NULL; sQueue->rear = NULL; } } return ret;}void* LinkQueue_Header(LinkQueue* queue) // O(1){ TLinkQueue* sQueue = (TLinkQueue*)queue; void* ret = NULL; if( (sQueue != NULL) && (sQueue->length > 0) ) { ret = sQueue->front->item; } return ret;}int LinkQueue_Length(LinkQueue* queue) // O(1){ TLinkQueue* sQueue = (TLinkQueue*)queue; int ret = -1; if( sQueue != NULL ) { ret = sQueue->length; } return ret;}
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)); LinkQueue_Clear(queue); while (LinkQueue_Length(queue) > 0) { printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue)); } LinkQueue_Destroy(queue); return 0;}
函数结构分析:
1.LinkQueue_Create
2.LinkQueue_Clear
3.LinkQueue_Append
4.LinkQueue_Retrieve
5.LinkQueue_Header
6.LinkQueue_Length
汇编分析:
main
1.LinkQueue_Create
2.LinkQueue_Append
3.LinkQueue_Header
4.LinkQueue_Length
5.LinkQueue_Retrieve
6.LinkQueue_Destroy
7.LinkQueue_Clear
阅读全文
1 0
- 数据结构封装之《LinkQueue2.0改进链式队列》
- 数据结构封装之《LinkQueue2.0改进链式队列》
- 数据结构封装之《LinkQueue链式队列》
- 数据结构封装之《LinkQueue链式队列》
- 数据结构封装之《SeqQueue2.0改进顺序式队列》
- 数据结构封装之《SeqQueue2.0改进顺序式队列》
- 数据结构之链式队列
- 数据结构之链式队列
- 数据结构之链式队列
- 数据结构之链式队列
- 数据结构之队列(链式队列)
- Java数据结构之链式队列
- 【数据结构-队列】链式队列
- 常用数据结构之链式存储队列
- 数据结构之链式队列(优化版)
- 数据结构之---C语言实现链式队列
- 数据结构之链式队列的所有操作
- 数据结构学习之队列(链式存储)
- 数据库优化常用技巧
- CentOS 7 关闭图形界面
- IDEA maven配置Spring
- React总结7:render()渲染时机
- Fragment的app包和v4包解析
- 数据结构封装之《LinkQueue2.0改进链式队列》
- 获取微信用户的openId
- linux重启和关闭系统命令
- 仿QQ消息导航栏RadioGroup里添加拖拽的TextView(未读消息)
- 十六天
- Android常用控件之ImageView
- the linux storage stack diagram
- 王爽汇编第三版实验10.3 浅析
- sql语句drop,delete,truncate区别