码迷,mamicode.com
首页 > 其他好文 > 详细

顺序队列(非循环)

时间:2016-05-12 12:23:47      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

#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;
}
技术分享

顺序队列(非循环)

标签:

原文地址:http://blog.csdn.net/qq_26883101/article/details/51371551

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!