您的位置:首页 > 理论基础 > 数据结构算法

数据结构(5)——循环队列的顺序表示和实现

2016-10-10 21:05 513 查看
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>

#define OK 1
#define ERROR -1
#define OVERFLOW  -2
#define TRUE 1
#define FALSE 0
#define MAXQSIZE 100   //最大队列长度
typedef int QElemType;
typedef int Status;

typedef struct{
QElemType *base;    //初始化的动态分配存储空间
int front;			//头指针,若队列不空,指向队列头元素
int rear;			//尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;

Status InitQueue(SqQueue &Q);
//构造一个空队列Q
Status DestroyQueue(SqQueue &Q);
//销毁队列Q,Q不再存在
Status ClearQueue(SqQueue &Q);
//将Q清为空队列
Status QueueEmpty(SqQueue Q);
//若队列Q为空队列,则返回TRUE,否则返回FALSE
int QueueLength(SqQueue Q);
//返回队列Q元素个数,即队列长度
Status GetHead(SqQueue Q,QElemType &e);
//若队列不为空,则用e返回Q的队首元素,并返回OK;否则返回ERROR
Status EnQueue(SqQueue &Q,QElemType e);
//插入元素e为Q的新的队尾元素
Status DeQueue(SqQueue &Q,QElemType &e);
//若队列不为空,则删除Q的队首元素,用e返回,并返回OK;否则返回ERROR
Status QueueTraverse(SqQueue Q);
//从队首至队尾遍历队列Q中的元素

/*构造一个空队列*/
Status InitQueue(SqQueue &Q){
Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if(!Q.base)
exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}//InitQueue

/*销毁队列Q*/
Status DestoryQueue(SqQueue &Q){
if(Q.base)
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
return OK;
}//DestoryQueue

/*将Q清为空队列 */
Status ClearQueue(SqQueue &Q){
Q.front = Q.rear = 0;
return OK;
} //ClearQueue

/*判断队列是否为空*/
Status QueueEmpty(SqQueue Q){
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}

/*返回队列Q元素个数,即队列长度*/
int QueueLength(SqQueue Q){
return (Q.rear - Q.front +MAXQSIZE)%MAXQSIZE;
}//QueueLength

/*若队列不为空,则用e返回Q的队首元素*/
Status GetQueue(SqQueue Q,QElemType &e){
if(!QueueEmpty)
e = Q.base[Q.front];
return OK;
}

/*插入元素e为Q的队尾元素*/
Status EnQueue(SqQueue &Q,QElemType e){
if((Q.rear + 1)%MAXQSIZE == Q.front)
return ERROR;			//队已满
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1)%MAXQSIZE;
return OK;
}//EnQueue

/*删除Q的队头元素 用e返回其值*/
Status DeQueue(SqQueue &Q,QElemType &e){
if(Q.front == Q.rear)
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1)%MAXQSIZE;
return OK;
}//DeQueue

/*遍历队列元素*/
Status QueueTraverse(SqQueue Q){
int p = Q.front;
if(p == Q.rear){
printf("此队列为空!\n");
return ERROR;
}
for(int i=0;i<QueueLength(Q);i++){
printf("%d ",Q.base[p]);
p++;
}
printf("\n");
return OK;
}

int  main(){
SqQueue Q;
QElemType e;
int n,m;
InitQueue(Q);
printf("请输入循环队列元素个数:\n");
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&m);
EnQueue(Q,m);
}
printf("循环队列元素为:\n");
QueueTraverse(Q);

if(!QueueEmpty(Q))
printf("非空\n");
else
printf("空\n");
printf("将循环链表置空\n");
ClearQueue(Q);
if(!QueueEmpty(Q))
printf("非空\n");
else
printf("已空\n");

EnQueue(Q,1);
EnQueue(Q,2);
EnQueue(Q,3);
EnQueue(Q,4);
EnQueue(Q,5);
printf("删除队头元素:\n");
DeQueue(Q,e);
printf("循环队列元素为:\n");
QueueTraverse(Q);
printf("队头元素为%d:\n",e);

DestoryQueue(Q);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息