C实现简单循环队列
2013-07-15 10:34
411 查看
//SqQueue.h #ifndef SQQUEUE_H #define SQQUEUE_H #include <stdlib.h> #include <stdio.h> #define QUEUE_SIZE 8 //#define NULL 0x00 struct _Node { int iValue; }; typedef struct _Node Node; typedef struct { Node* pBase; int iFront; int iRear; int iSize; }SqQueue; #endif
//SqQueue.c #include "SqQueue.h" SqQueue* InitQueue() { SqQueue* pQueue = (SqQueue*)malloc( sizeof( SqQueue )); if( !pQueue ) return NULL; pQueue->pBase = (Node*)malloc( sizeof( Node ) * QUEUE_SIZE ); if( !pQueue->pBase ) return NULL; pQueue->iFront = 0; pQueue->iRear = 0; pQueue->iSize = 0; return pQueue; } int QueueLength( SqQueue* pQueue ) { if( !pQueue ) return 0; return pQueue->iSize; } void PrintNode( Node* pNode ) { if( !pNode ) return; printf( "%d ", pNode->iValue ); } int EnQueue( SqQueue* pQueue, Node* pNode ) { if( !pQueue || !pNode ) return -1; if( pQueue->iSize == QUEUE_SIZE ) { puts( "Queue full!" ); return -2; } ( pQueue->pBase + pQueue->iRear )->iValue = pNode->iValue; pQueue->iRear = ( pQueue->iRear + 1 ) % QUEUE_SIZE; pQueue->iSize++; return 0; } Node* DeQueue( SqQueue* pQueue ) { if( !pQueue || pQueue->iSize == 0 ) return NULL; pQueue->iFront = ( pQueue->iFront + 1 ) % QUEUE_SIZE; pQueue->iSize--; return pQueue->pBase + ( QUEUE_SIZE + pQueue->iFront - 1 ) % QUEUE_SIZE; } void ClearQueue( SqQueue* pQueue ) { if( !pQueue ) return; free( pQueue->pBase ); pQueue->pBase = NULL; pQueue->iSize = 0; pQueue->iFront = 0; pQueue->iRear = 0; } void DestroyQueue( SqQueue** pQueue ) { if( !(*pQueue ) ) return; ClearQueue( *pQueue ); free( *pQueue ); *pQueue = NULL; } Node* CreateNode( int iValue ) { Node* pNode = (Node*)malloc( sizeof( Node ) ); if( !pNode ) return NULL; pNode->iValue = iValue; return pNode; } void QueueTraverse( SqQueue* pQueue ) { if( !pQueue || 0 == pQueue->iSize ) return; int i = pQueue->iFront; int iEnd = (pQueue->iRear - 1 + QUEUE_SIZE) % QUEUE_SIZE; puts( "" ); if( iEnd >= i ) { for( ; i <= iEnd; i++ ) { PrintNode( pQueue->pBase + i ); } } else { for( ; i < QUEUE_SIZE; i++ ) { PrintNode( pQueue->pBase + i ); } for( i = 0; i <= iEnd; i++ ) { PrintNode( pQueue->pBase + i ); } } puts( "" ); } int main( int argc, char* argv[] ) { SqQueue* pQueue = InitQueue(); EnQueue( pQueue, CreateNode( 1 ) ); EnQueue( pQueue, CreateNode( 2 ) ); EnQueue( pQueue, CreateNode( 3 ) ); EnQueue( pQueue, CreateNode( 4 ) ); EnQueue( pQueue, CreateNode( 5 ) ); EnQueue( pQueue, CreateNode( 6 ) ); EnQueue( pQueue, CreateNode( 7 ) ); EnQueue( pQueue, CreateNode( 8 ) ); QueueTraverse( pQueue ); puts( "DeQueue..." ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); PrintNode( DeQueue( pQueue ) ); puts( "\nEnQueue 9 ..." ); EnQueue( pQueue, CreateNode( 9 ) ); EnQueue( pQueue, CreateNode( 10 )); EnQueue( pQueue, CreateNode( 11 )); EnQueue( pQueue, CreateNode( 12 )); EnQueue( pQueue, CreateNode( 13 )); EnQueue( pQueue, CreateNode( 14 )); EnQueue( pQueue, CreateNode( 15 )); EnQueue( pQueue, CreateNode( 16 )); EnQueue( pQueue, CreateNode( 17 )); EnQueue( pQueue, CreateNode( 18 )); DeQueue( pQueue ); DeQueue( pQueue ); QueueTraverse( pQueue ); DestroyQueue( &pQueue ); QueueTraverse( pQueue ); return 0; }
makefile
default: a.out ./a.out run: a.out ./a.out clean: a.out rm a.out a.out: SqQueue.c SqQueue.h gcc *.c rebuild: SqQueue.h SqQueue.c gcc *.c debug: gcc -g SqQueue.c gdb a.out
相关文章推荐
- 循环队列的简单实现
- CycleQueue--循环队列(c语言简单实现)
- 数据结构学习之路(四)用数组简单实现循环队列
- 数组实现的简单循环队列
- 链表实现的简单循环队列
- 循环队列简单实现
- c++ 栈,队列,循环队列 简单实现
- 简单数据结构的实现之循环队列
- Java循环队列简单实现
- 循环队列的简单实现
- c语言用简单数组实现循环队列
- 队列--基于简单循环数组实现(Java)
- 循环队列简单实现
- 链栈,顺序栈,单链队列,循环队列,非循环队列的简单实现
- 循环队列的一个简单实现
- 简单循环队列模版(数组实现)
- 循环队列的简单实现
- 简单的双线程数组循环队列缓冲区的实现
- 数据结构——循环队列的简单实现
- c循环队列简单实现