顺序队列(非循环)

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXQSIZE 5 //最大队列长度

typedef struct SqQueue
{
	int * base;
	int front; //队头指针 若队列不空 指向队列头元素
	int rear; //尾指针 若队列不空 指向队列尾元素的下一个位置
}SqQueue;

bool InitQueue(SqQueue *q); //队列的初始化
void QueueEmpty(SqQueue q); // 判断队列是否为空
int QueueLength(SqQueue q); //求队列的长度
bool EnQueue(SqQueue *q,int e); //入队
bool QueueTraverse(SqQueue *q); //输出队列元素 址传递
//bool QueueTraverse(SqQueue q);  //输出队列元素 值传递 两种输出方式均可
bool DeQueue(SqQueue *q,int *e); //删除队头元素 用e返回
bool GetHead(SqQueue q,int *e); //返回队头元素
bool ClearQueue(SqQueue *q); //清空队列
bool DestoryQueue(SqQueue *q); //销毁队列

int main() //主函数
{
	int i, n;
	int d;
	SqQueue q;
	InitQueue(&q);
	QueueEmpty(q);
	printf("队列的长度:%d\n",QueueLength(q));
	printf("请输入队列元素个数:");
	scanf("%d",&n);
	for(i = 0; i < n; i++)
	{
		scanf("%d",&d);
		EnQueue(&q,d);
	}

	printf("队列的长度:%d\n",QueueLength(q));
	QueueEmpty(q);

	printf("现在队列中的元素:\n");
	QueueTraverse(&q);
	//QueueTraverse(q);

	DeQueue(&q,&d);
	printf("删除的队头元素为 %d\n",d);
	printf("队列中的元素:\n");
	QueueTraverse(&q);

	if( GetHead(q,&d) )
		printf("队头元素为:%d\n",d);
	else
		printf("队头元素为空\n");

	ClearQueue(&q);
	QueueEmpty(q);

	if( GetHead(q,&d) )
		printf("队头元素为:%d\n",d);
	else
		printf("无队头元素\n");

	DestoryQueue(&q);
	return 0;
}

bool InitQueue(SqQueue *q) //队列的初始化
{
	q->base = (int *)malloc(MAXQSIZE*sizeof(int));
	if(q->base == NULL)
	{
		printf("内存分配失败 程序终止");
		exit(-1);
	}
	q->front = q->rear = 0;
	return true;
}

void QueueEmpty(SqQueue q) // 判断队列是否为空
{
	if(q.front == q.rear) //队列空
		printf("队列为空\n");
	else
		printf("队列不为空\n");
}

int QueueLength(SqQueue q) //求队列的长度
{
	return (q.rear - q.front);
}

bool EnQueue(SqQueue *q,int e) //入队
{
	if(q->rear >= MAXQSIZE) //队列满 增加一个存储单元
	{
		q->base = (int *)realloc(q->base,(q->rear+1)*sizeof(int));
		if(q->base == NULL)
		{
			printf("内存分配失败 程序终止\n");
			exit(-1);
		}
	}
	*(q->base + q->rear) = e;
	q->rear++;
	return true;
}

bool QueueTraverse(SqQueue *q) //输出队列元素
{
	int i;
	i = q->front;
	while(i != q->rear)
	{
		printf("%d ",q->base[i]);
		i++;
	}
	printf("\n");
	return true;
}

/*
bool QueueTraverse(SqQueue q)
{
	int i;
	i = q.front;
	while(i != q.rear)
	{
		printf("%d ",q.base[i]);
		i++;
	}
	printf("\n");
	return true;
}
*/

bool DeQueue(SqQueue *q,int *e) //删除队头元素 用e返回
{
	if(q->front == q->rear) //队列为空
		return false;
	*e = q->base[q->front];
	q->front = q->front + 1;
	return true;
}

bool GetHead(SqQueue q,int *e) //返回队头元素
{
	if(q.rear == q.front)
	{
		return false;
	}
	*e = q.base[q.front];
	return true;
}

bool ClearQueue(SqQueue *q) //清空队列
{
	q->front = q->rear = 0;
	return true;
}

bool DestoryQueue(SqQueue *q) //销毁队列
{
	if(q->base)
		free(q->base);
	q->base = NULL;
	q->front = q->rear = 0;
	return true;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值