#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MaxSize 5
typedef struct {
int data[MaxSize];
int front,rear;
}SqQueue;
int InitQueue(SqQueue *Q){//此时front指向队列中对头元素 rear指向队列中队尾元素下一元素
Q->front=Q->rear=0; //需要牺牲掉一个节点的存储单元 所以最大容量为MaxSize-1
printf("该循环队列已完成初始化\n\n");
return 1;
}
int length(SqQueue Q){
return((Q.rear-Q.front+MaxSize)%MaxSize);
}
int isEmpty(SqQueue Q){
if(Q.front==Q.rear)return 1;
else return 0;
}
int EnQueue(SqQueue *Q,int e){
if((Q->rear+1)%MaxSize==Q->front)
return 0;//若当前循环队列为空
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MaxSize;
printf("本次元素:%d已入队\n\n",e);
return 1;
}
int DeQueue(SqQueue *Q,int *e){
if(isEmpty(*Q)){
printf("该循环队列为空,无法出队\n\n");
return 0;
}
(*e)=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;
printf("本次出队元素为:%d\n\n",*e);
return 1;
}
int GetHead(SqQueue Q){
if(Q.front==Q.rear){
printf("该循环队列当前为空\n\n");
return 0;
}
printf("该循环队列当前队头元素为%d\n\n",Q.data[Q.front]);
return 1;
}
int main()
{
SqQueue Q;
int discard;
InitQueue(&Q);
EnQueue(&Q,5);
EnQueue(&Q,9);
EnQueue(&Q,2);
EnQueue(&Q,7);
if(isEmpty(Q))
printf("当前该循环队列为空\n\n");
else
printf("当前该循环队列的长度为%d\n\n",length(Q));
DeQueue(&Q,&discard);
if(isEmpty(Q))
printf("当前该循环队列为空\n\n");
else
printf("当前该循环队列的长度为%d\n\n",length(Q));
GetHead(Q);
return 0;
}
<数据结构> rear指针指向队尾元素下一位置&&牺牲一个存储位置 的循环队列实现(C语言)(第1种/共6种)
于 2022-06-18 14:20:21 首次发布