C实现简单循环队列

//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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值