队列,数组式

就当作学习数据结构的记忆吧

//队列,数组式

#include <stdio.h>
#include <stdlib.h>
#define ELEMTYPE int
#define STATUS int
#define STRUCTSIZE sizeof(QUEUE)
#define ELEMSIZE sizeof(ELEMTYPE)

typedef struct QUEUE
{
	ELEMTYPE *epData;
	int iFront;
	int iRear;
	int iQueueSize;//循环队列存在闲置节点,该值不包含闲置节点
}QUEUE,*QUEUEP;

QUEUEP queueInit(int iSize);
STATUS isFull(QUEUEP spQueue);
STATUS isEmpty(QUEUEP spQueue);
STATUS queueInput(QUEUEP spQueue,ELEMTYPE eTemp);
STATUS queueOutput(QUEUEP spQueue,ELEMTYPE *eTemp);
ELEMTYPE queueGetFirst(QUEUEP spQueue);
void queueFree(QUEUEP *sppQueue);

void main()
{
	QUEUEP spQueue=NULL;
	int iTemp=0;
	int iTemp2=0;
	spQueue=queueInit(10);
	
	while(1)
		if(queueInput(spQueue,iTemp++)==-1)
			break;
	
	printf("%d\n",queueGetFirst(spQueue));
	
	while(iTemp2<5)
		if(queueOutput(spQueue,&iTemp)==1)
		{
			printf("%d ",iTemp);
			iTemp2++;
		}
		else
			break;
	printf("\n");
	
	printf("%d\n",queueGetFirst(spQueue));

	while(1)
		if(queueInput(spQueue,iTemp2++)==-1)
			break;

	while(1)
		if(queueOutput(spQueue,&iTemp)==1)
			printf("%d ",iTemp);
		else
			break;
	printf("\n");

	queueFree(&spQueue);
}

QUEUEP queueInit(int iSize)//iSize实际节点数
{
	QUEUEP spTemp=NULL;
	if(iSize<=0)
		return NULL;
	spTemp=malloc(STRUCTSIZE);
	if(!spTemp)
		return NULL;
	(*spTemp).epData=malloc(ELEMSIZE*(iSize+1));
	if(!(*spTemp).epData)
		return NULL;
	(*spTemp).iFront=(*spTemp).iRear=0;
	(*spTemp).iQueueSize=iSize;
	return spTemp;
}

STATUS isFull(QUEUEP spQueue)//队满返回1
{
	if( ((*spQueue).iRear+1) % ((*spQueue).iQueueSize+1) == (*spQueue).iFront )
		return 1;
	return -1;
}

STATUS isEmpty(QUEUEP spQueue)//队空返回1
{
	if((*spQueue).iRear==(*spQueue).iFront)
		return 1;
	return -1;
}

STATUS queueInput(QUEUEP spQueue,ELEMTYPE eTemp)//成功返回1
{
	if(isFull(spQueue)==1)
		return -1;
	(*spQueue).epData[(*spQueue).iRear]=eTemp;
	(*spQueue).iRear=((*spQueue).iRear+1)%((*spQueue).iQueueSize+1);
	return 1;
}

STATUS queueOutput(QUEUEP spQueue,ELEMTYPE *epTemp)//成功返回1
//注意形参
{
	if(isEmpty(spQueue)==1)
		return -1;
	*epTemp=(*spQueue).epData[(*spQueue).iFront];
	(*spQueue).iFront=((*spQueue).iFront+1)%((*spQueue).iQueueSize+1);
	return 1;
}

ELEMTYPE queueGetFirst(QUEUEP spQueue)
//数据域的类型改变,此函数返回值亦须改变
{
	if(isEmpty(spQueue)==1)
		return -1;
	return (*spQueue).epData[(*spQueue).iFront];
}

void queueFree(QUEUEP *sppQueue)
//注意形参
{
	if(!(*sppQueue))
		return;
	if((*(*sppQueue)).epData)
		free((*(*sppQueue)).epData);
	free(*sppQueue);
	*sppQueue=NULL;
	return;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值