数据结构 10 队列 不使用代码复用 提高效率的实现
2014-01-03 18:22
751 查看
1.链表的实现
[b]2.线性的实现[/b]
#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_H_ #include <malloc.h> #include "linkqueue.h" typedef struct _tag_LinkQueueNode { struct _tag_LinkQueueNode* next; void* item; }TLinkQueueNode; 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)/* 由于我们在LinkQueue_Append()在#line:32中创建节点时分配了空间所以需要手工释放 */ { 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));/* #line:32 */ int ret = (item != NULL) && (node != NULL) && (sQueue != 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; // node指向头结点 sQueue->front = node->next; ret = node->item; free(node); sQueue->length--; if(0 == sQueue->length) { 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; } #include <stdio.h> #include <stdlib.h> #include "linkqueue.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 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; }
[b]2.线性的实现[/b]
#ifndef _SQEQUEUE_H_ #define _SQEQUEUE_H_ typedef void SeqQueue; SeqQueue* SeqQueue_Create(int capacity); void SeqQueue_Destroy(SeqQueue* queue); void SeqQueue_Clear(SeqQueue* queue); int SeqQueue_Append(SeqQueue* queue, void* item); void* SeqQueue_Retrieve(SeqQueue* queue); void* SeqQueue_Header(SeqQueue* queue); int SeqQueue_Capacity(SeqQueue* queue); int SeqQueue_Length(SeqQueue* queue); #endif // _SQEQUEUE_H_ #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include "sqequeue.h" typedef unsigned int TSeqQueueNode; typedef struct _tag_SeqQueue { int capacity; int length; int front; int rear; TSeqQueueNode* node; }TSeqQueue; SeqQueue* SeqQueue_Create(int capacity)// O(1) { TSeqQueue* ret = NULL; if(capacity >= 0) { ret = (TSeqQueue*)malloc(sizeof(TSeqQueue) + sizeof(TSeqQueueNode) * capacity); } if(ret != NULL) { ret->capacity = capacity; ret->length = 0; ret->front = 0; ret->rear = 0; ret->node = (TSeqQueueNode*)(ret + 1); } } void SeqQueue_Destroy(SeqQueue* queue)// O(1) { free(queue); } void SeqQueue_Clear(SeqQueue* queue) // O(1) { TSeqQueue* sQueue = (TSeqQueue*)queue; if(sQueue != NULL) { sQueue->length = 0; sQueue->front = 0; sQueue->rear = 0; } } int SeqQueue_Append(SeqQueue* queue, void* item)// O(1) { TSeqQueue* sQueue = (TSeqQueue*)queue; int ret = (sQueue != NULL); ret = ret && (item != NULL) && (sQueue->length+1 <= sQueue->capacity); if(ret) { sQueue->node[sQueue->length] = (TSeqQueueNode*)item; sQueue->rear = (sQueue->rear + 1) % sQueue->capacity; // 为了提高空间的利用率 尾加了一个元素 则尾向后退一个单位 +1 sQueue->length++; } return ret; } void* SeqQueue_Retrieve(SeqQueue* queue)// O(1) { TSeqQueue* sQueue = (TSeqQueue*)queue; void* ret = SeqQueue_Header(queue); if(ret != NULL) { sQueue->front = (sQueue->front + 1) % sQueue->capacity; // 从头删除一个元素 则头向后退一个单位 +1 sQueue->length--; } return ret; } void* SeqQueue_Header(SeqQueue* queue) // O(1) { TSeqQueue* sQueue = (TSeqQueue*)queue; void* ret = NULL; if((sQueue != NULL) && (sQueue->length > 0)) { ret = (void*)(sQueue->node[sQueue->front]); } return ret; } int SeqQueue_Capacity(SeqQueue* queue) // O(1) { TSeqQueue* sQueue = (TSeqQueue*)queue; int ret = -1; if(sQueue != NULL) { ret = sQueue->capacity; } return ret; } int SeqQueue_Length(SeqQueue* queue) // O(1) { TSeqQueue* sQueue = (TSeqQueue*)queue; int ret = -1; if(sQueue != NULL) { ret = sQueue->length; } return ret; } #include <stdio.h> #include <stdlib.h> #include "sqequeue.h" int main(void) { SeqQueue* queue = SeqQueue_Create(20); int a[10] = {0}; int i = 0; for(i = 0; i < 10; ++i) { a[i] = i+1; SeqQueue_Append(queue, a + i); } printf("Header: %d\n", *(int*)SeqQueue_Header(queue)); printf("Length: %d\n", SeqQueue_Length(queue)); printf("Capacity:%d\n", SeqQueue_Capacity(queue)); while( SeqQueue_Length(queue) > 0) { printf("Retrieve:%d\n", *(int*)SeqQueue_Retrieve(queue)); } printf("Header: %d\n", *(int*)SeqQueue_Header(queue)); printf("Length: %d\n", SeqQueue_Length(queue)); printf("Capacity:%d\n", SeqQueue_Capacity(queue)); SeqQueue_Destroy(queue); return 0; }
相关文章推荐
- 数据结构学习记录连载10(队列提高要求实现)
- 数据结构学习记录连载10(队列提高要求实现)
- 您希望通过将所有ArrayList对象替换为相应的泛型版本以提高应用程序的效率,并使得代码更易于使用。当结构体或其他值类型存储在这些数据结构中时,会导致装箱/拆箱操作,这时就需要这么做。
- 数据结构 09 队列 代码复用的实现
- 数据结构队列C++代码实现
- 算法与数据结构-栈与队列 讲解与java代码实现
- java实现队列数据结构代码详解
- 使用JavaScript实现链表的数据结构的代码
- 数据结构-使用两个栈实现一个队列
- 基于.NET的分词软件设计与实现V4.0--使用SortedList提高分词效率
- 使用JRebel实现Web项目热部署, 提高开发效率
- 【数据结构】队列(顺序队列、链队列)的JAVA代码实现
- iOS Mobile Development: Using Xcode Targets to Reuse the Code 使用xcode targets来实现代码复用
- 数据结构之队列10单链队列定义及实现
- .Net Core中使用ref和Span<T>提高程序性能的实现代码
- 使用Cruise和Mercurial实现个人预提交,提高生产效率及整体自动化测试成功率
- PHP中的traits实现代码复用使用实例
- 使用JavaScript的数组实现数据结构中的队列与堆栈
- 使用ognl表达式,实现代码复用
- java 代码优化 优化内存使用 防止内存泄露 优化代码规范 提高效率