顺序循环队列

顺序循环队列和顺序表差不多,但是队列他是一头进一头出,用两个指针来表示,对于入队和出队全靠这两个指针进行操作!

/-#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

//顺序循环队列


typedef int data_t;

typedef struct list
{
	data_t data[SIZE];
	int front;   //队头元素的下标

	int rear;   //对尾元素的下一个位置下标

}squeue;

//创建

squeue *creatsqueue()
{
	squeue *sq=(squeue *)malloc(sizeof(squeue));
	if(sq==NULL)
	{
		perror("malloc");
		return NULL;
	}
	
	memset(sq->data,0,sizeof(data_t)*SIZE);

	sq->front=sq->rear=0;

	return sq;
}

//判空
int squeue_is_empty(squeue *sq)
{
	return(sq->rear==sq->front)?1:0;
}

//判满
int squeue_is_full(squeue *sq)
{
	return((sq->rear+1)%SIZE==sq->front)?1:0;
}

//求表长

int squeue_length(squeue *sq)
{
	return((sq->rear-sq->front+SIZE)%SIZE);
}

//入队
int squeue_in(squeue *sq,data_t data)
{
	if(squeue_is_full(sq))
		return -1;

	sq->data[sq->rear]=data;
	sq->rear=(sq->rear+1)%SIZE;

	return 0;
}


//出队
data_t squeue_out(squeue *sq)
{
	if(squeue_is_empty(sq))
		return -1;
	
	squeue *p=sq;
	data_t data=p->data[p->front];

	p->front=(p->front+1)%SIZE;

	return data;

}

//清空

void squeue_clear(squeue *sq)
{
	sq->front=sq->rear;  //栈内的元素没有消失,只是遍历不到
}

//销毁

void squeue_xiaohui(squeue **sq)
{
	free(*sq);
	*sq=NULL;
}


//打印

void squeue_printf(squeue *sq)
{
	int temp =sq->front;
	while(temp<sq->rear)
	{
		printf("%d ",sq->data[temp]);
		temp=(temp+1)%SIZE;
	}

	puts("");
}



int main(int argc, const char *argv[])
{
	squeue *sq=creatsqueue();

	int m=squeue_is_empty(sq);

	int n=squeue_length(sq);

	int a=squeue_is_full(sq);

	printf("m=%d n=%d a=%d\n",m,n,a);

	//入队
	int i=0;
	while(i<10)
	{
		squeue_in(sq,i+1);
		i++;
	}
	
	//打印
	squeue_printf(sq);


	//出栈
	int j=0;
	while(j<5)
	{
		data_t data = squeue_out(sq);
		printf("data=%d \n",data);
		j++;
	}

	squeue_printf(sq);

	//清空链表
	squeue_clear(sq);
	squeue_printf(sq);

	//销毁链表
	squeue_xiaohui(&sq);
	squeue_printf(sq);
	printf("null\n");


	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值