循环队列(线性队列)模拟(方式1)-数据结构

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
const int DEFAULT_LEN = 12;//队列长度必须>=2;

typedef struct Queue
{
	int * pbase;
	int * front;
	int * rear;
}QUEUE,*PQUEUE;

void init(PQUEUE);//初始化一个队列
int * get_next_rear(PQUEUE);//获取下一个的rear应该分配的地址
int * get_next_front(PQUEUE);//获取下一个的front应该分配的地址
bool is_empty(PQUEUE);//判断队列是否为空
bool is_full(PQUEUE);//判断队列是否已满
bool in_queue(PQUEUE,int);//入队
bool out_queue(PQUEUE,int *);//出队
void traverse(PQUEUE);//遍历队列并打印输出
void destroy(PQUEUE);//销毁(未完成)
int len(PQUEUE);//求队列长度(未完成)


int main(void)//队列测试
{	
	QUEUE q;
	int out_val;
	init(&q);
	in_queue(&q,11);
	in_queue(&q,35);
	in_queue(&q,37);
	in_queue(&q,78);
	in_queue(&q,89);
	in_queue(&q,23);
	in_queue(&q,92);
	traverse(&q);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	traverse(&q);
	in_queue(&q,22);
	in_queue(&q,45);
	in_queue(&q,12);
	in_queue(&q,56);
	traverse(&q);
	out_queue(&q,&out_val);
	out_queue(&q,&out_val);
	in_queue(&q,67);
	in_queue(&q,89);
	in_queue(&q,99);
	traverse(&q);
	return 0;
}

void init(PQUEUE pq)//初始化一个队列
{
	pq->front = pq->rear = pq->pbase = (int *)malloc(sizeof(int) * DEFAULT_LEN);
}

int * get_next_rear(PQUEUE pq)//获取下一个的rear应该分配的地址
{
	int * pt;
	if(&(pq->pbase[DEFAULT_LEN-1]) == pq->rear) 
		pt = pq->pbase;
	else
		pt = pq->rear+1;
	return pt;
}

int * get_next_front(PQUEUE pq)//获取下一个的front应该分配的地址
{
	int * pt;
	if(&(pq->pbase[DEFAULT_LEN-1]) == pq->front) 
		pt = pq->pbase;
	else
		pt = pq->front+1;
	return pt;
}

bool is_empty(PQUEUE pq)//判断队列是否为空
{
	return pq->front==pq->rear;
}

bool is_full(PQUEUE pq)//判断队列是否已满
{
	return get_next_rear(pq) == pq->front;
}


bool in_queue(PQUEUE pq,int val)//入队
{
	if(is_full(pq))
	{
		printf("队列已满,入队失败。\n");
		return false;
	}
	*(pq->rear) = val;
	pq->rear = get_next_rear(pq);
	return true;
}

bool out_queue(PQUEUE pq,int * pval)//出队
{
	if(is_empty(pq))
	{
		printf("队列为空,出队失败。\n");
		return false;
	}
	*pval = pq->front[0];
	printf("出队成功,出队值为:%d\n",*pval);
	pq->front = get_next_front(pq);
	return true;
}


void traverse(PQUEUE pq)//遍历队列并打印输出
{
	if(is_empty(pq))
	{
		printf("队列为空,遍历失败。\n");
		return;
	}
	int * pt1 = pq->front;
	while(pq->front != pq->rear)
	{
		printf("%d\t",*(pq->front));
		pq->front = get_next_front(pq);
	}
	pq->front = pt1;
	printf("\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值