kerrysk 发表于 2013-1-26 15:50:32

C 实现循环队列

前几天在公司开发写了个循环队列,感觉挺好的,没用上可惜了。拿出来秀一秀
 队列可以自动增长,就是涨上去需要再trim下。
 
头文件:
 
#ifndef _NODECIRCLEQUEUE_H#define _NODECIRCLEQUEUE_Htypedef enum { false=0, true=!false } bool;typedef void *Node;typedef struct NodeCircleQueue_T{Node*queue;inthead;inttail;intinitLength;intmaxLength;}NodeCircleQueue;typedef void (*NodeFunc) (Node node,void *args);bool vInitNodeCircleQueue(NodeCircleQueue *cqueue,int initLength,int maxLength);void vDestoryNodeCircleQueue(NodeCircleQueue *cqueue);bool vOfferNodeCircleQueue(NodeCircleQueue *cqueue,Node node);Node vPollNodeCircleQueue(NodeCircleQueue *cqueue);void vTraversalNodeCircleQueue(NodeCircleQueue *cqueue,NodeFunc func,void *args);#endif源文件:
 #include "nodeCircleQueue.h"
#include <stdlib.h>#include <string.h>bool vInitNodeCircleQueue(NodeCircleQueue *cqueue,int initLength,int maxLength){cqueue->queue = (Node*)malloc(initLength * sizeof(Node));if(cqueue->queue == NULL){return false;}cqueue->head = cqueue->tail = 0;cqueue->initLength = initLength;cqueue->maxLength = maxLength;return true;}void vDestoryNodeCircleQueue(NodeCircleQueue *cqueue){free(cqueue->queue);}bool vOfferNodeCircleQueue(NodeCircleQueue *cqueue,Node node){//queue is fullif(cqueue->head == ((cqueue->tail+1) % cqueue->initLength)){if(cqueue->initLength == cqueue->maxLength)return false;Node* newQueue;int newLength;newLength = cqueue->initLength * 2;if(newLength > cqueue->maxLength)newLength = cqueue->maxLength;newQueue = (Node*)malloc(newLength * sizeof(Node));if(newQueue == NULL)return false;memcpy(newQueue , cqueue->queue , cqueue->initLength * sizeof(Node));free(cqueue->queue);cqueue->initLength = newLength;cqueue->queue = newQueue;}//put node at tail,tail++*(cqueue->queue + cqueue->tail) = node;cqueue->tail = (cqueue->tail + 1) % cqueue->initLength;return true;}Node vPollNodeCircleQueue(NodeCircleQueue *cqueue){//queue is emptyif(cqueue->tail == cqueue->head)return NULL;Node node;//node = head, head++node = *(cqueue->queue + cqueue->head);cqueue->head = (cqueue->head + 1) % cqueue->initLength;return node;}void vTraversalNodeCircleQueue(NodeCircleQueue *cqueue,NodeFunc func,void *args){int ptr;ptr = cqueue->head;while(ptr != cqueue->tail){func(*(cqueue->queue + ptr),args);ptr = (ptr + 1)% cqueue->initLength;}}
页: [1]
查看完整版本: C 实现循环队列