代码如下:
SeqQueue.c文件:
/************************************************************************************ 文件名:SeqQueue.c 头文件:SeqQueue.h 时间: 2014/03/31 作者: Hao 功能:可以复用的顺序循环队列 即入队列和出队列的时间复杂度都为O(1) ************************************************************************************/ #include <stdio.h> #include <malloc.h> #include "SeqQueue.h" typedef void* TSeqQueueNode; typedef struct str_SeqQueue { int capacity; int length; int front; int rear; TSeqQueueNode* node; }TSeqQueue; /************************************************************************************ 函数名: SeqQueue_Create 函数功能: 创建一个容量为capacity的循环队列 参数: int capacity 创建循环队列中成员的个数 即循环队列容量 返回值: void* ret 如果返回NULL 说明创建循环队列失败 如果返回ret 说明创建循环队列成功 且ret为描述循环队列的结构体 ************************************************************************************/ SeqQueue* SeqQueue_Create(int capacity) { 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); } } else { ret = NULL; } return (SeqQueue*)ret; } /************************************************************************************ 函数名: SeqQueue_Destroy 函数功能: 销毁循环队列 free开辟的内存 参数: void* list 描述循环队列结构体指针 返回值: void ************************************************************************************/ void SeqQueue_Destroy(SeqQueue* queue) { free(queue); } /************************************************************************************ 函数名: SeqQueue_Clear 函数功能:清空循环队列 其实就是给length=0; front = 0 rear = 0; 函数参数:SeqQueue* queue 描述循环队列结构体指针 函数返回值:int ret 成功返回0 失败返回-1 ************************************************************************************/ int SeqQueue_Clear(SeqQueue* queue) { int ret; TSeqQueue *Tqueue = (TSeqQueue* )queue; /*函数参数合法性检测*/ if(NULL != Tqueue) { Tqueue->length = 0; Tqueue->front = 0; Tqueue->rear = 0; ret=0; } else ret=-1; return ret; } /************************************************************************************ 函数名: SeqQueue_Length 函数功能:获得循环队列 现在的大小 函数参数:void* list 描述循环队列结构体指针 函数返回值:int ret 成功返回length 失败返回-1 ************************************************************************************/ int SeqQueue_Length(SeqQueue* queue) { int ret; TSeqQueue *Tqueue = (SeqQueue* )queue; /*函数参数合法性检测*/ if(NULL != Tqueue) { ret = Tqueue->length; } else ret = -1; return ret; } /************************************************************************************ 函数名: SeqQueue_Capacity 函数功能:获得循环队列 的容量 函数参数:void* list 描述循环队列结构体指针 函数返回值:int ret 成功返回capacity 失败返回-1 ************************************************************************************/ int SeqQueue_Capacity(SeqQueue* queue) { int ret; TSeqQueue *Tqueue = (SeqQueue* )queue; /*函数参数合法性检测*/ if(NULL != Tqueue) { ret = Tqueue->capacity; } else ret = -1; return ret; } /************************************************************************************ 函数名: SeqQueue_Push 函数功能:入队操作 函数参数:SeqQueue* queue入队队列, void* data入队数据元素 这个队列是从尾部入队rear 从头部出队front 函数返回值:int ret 成功返回 1 失败返回 0 ************************************************************************************/ int SeqQueue_Push(SeqQueue* queue, void* data) { TSeqQueue* Tqueue = (TSeqQueue*)queue; int ret = (Tqueue != NULL) && (data != NULL); //安全性检测 ret = ret && (Tqueue->length + 1 <= Tqueue->capacity); //容量检测 if(ret) { Tqueue->node[Tqueue->rear] = data; Tqueue->rear = (Tqueue->rear + 1) % Tqueue->capacity; Tqueue->length++; } return ret; } /************************************************************************************ 函数名: SeqQueue_Pop 函数功能:出队操作 函数参数:SeqQueue* queue出队队列 这个队列是从尾部入队rear 从头部出队front 函数返回值:void* ret 成功返回 数据元素地址 失败返回 NULL ************************************************************************************/ void* SeqQueue_Pop(SeqQueue* queue) { TSeqQueue* Tqueue = (TSeqQueue*)queue; void* ret = NULL; if((Tqueue != NULL) && (Tqueue->length > 0)) { ret = (void*)(Tqueue->node[Tqueue->front]); Tqueue->front = (Tqueue->front + 1) % Tqueue->capacity; Tqueue->length--; } return ret; } /************************************************************************************ 函数名: SeqQueue_Top 函数功能:获得队尾元素地址 函数参数:SeqQueue* queue出队队列 这个队列是从尾部入队rear 从头部出队front 函数返回值:void* ret 成功返回 队尾数据元素地址 失败返回 NULL ************************************************************************************/ void* SeqQueue_Top(SeqQueue* queue) { TSeqQueue* Tqueue = (TSeqQueue*)queue; void* ret = NULL; if((Tqueue != NULL) && (Tqueue->length > 0)) { ret = (void*)(Tqueue->node[Tqueue->front]); } return ret; }
#ifndef _SeqQueue_H_ #define _SeqQueue_H_ typedef void SeqQueue; SeqQueue* SeqQueue_Create(int capacity); void SeqQueue_Destroy(SeqQueue* queue); int SeqQueue_Clear(SeqQueue* queue); int SeqQueue_Push(SeqQueue* queue, void* data); void* SeqQueue_Pop(SeqQueue* queue); void* SeqQueue_Top(SeqQueue* queue); int SeqQueue_Length(SeqQueue* queue); int SeqQueue_Capacity(SeqQueue* queue); #endif
#include <stdio.h> #include <stdlib.h> #include "SeqQueue.h" int main(int argc, char *argv[]) { SeqQueue* queue = SeqQueue_Create(6); int a[10] = {0}; int i = 0; for(i=0; i<10; i++) { a[i] = i + 1; SeqQueue_Push(queue, a + i); } printf("Top: %d\n", *(int*)SeqQueue_Top(queue)); printf("Length: %d\n", SeqQueue_Length(queue)); printf("Capacity: %d\n", SeqQueue_Capacity(queue)); while( SeqQueue_Length(queue) > 0 ) { printf("Pop: %d\n", *(int*)SeqQueue_Pop(queue)); } printf("\n"); for(i=0; i<10; i++) { a[i] = i + 1; SeqQueue_Push(queue, a + i); printf("Pop: %d\n", *(int*)SeqQueue_Pop(queue)); } SeqQueue_Destroy(queue); return 0; }注意:其实循环队列就是在一段内存空间中,使用front和rear变量夹住一端空间,使其成为顺序队列,并且入队列和出队列的时间复杂度都是O(1)
数据结构学习笔记(8.循环队列与链队列),布布扣,bubuko.com
原文:http://blog.csdn.net/mbh_1991/article/details/22653511