/*循环队列 基本操作:初始化、取队头元素、取队尾元素、判断队空、判断队满、入队、出队、求队列长度*/
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define LENGTH 10
typedef int ElemType;
typedef int Status;
typedef struct SqQueue{
ElemType *base; //初始化时动态分配存储空间
int front;
int rear;
}SqQueue;
/*Function:循环队列初始化*/
Status Init_SqQueue(SqQueue *q){
q->base=(ElemType *)malloc(LENGTH*sizeof(ElemType));//分配空间
if(!q->base){
return ERROR;
}
q->front=q->rear;
printf("对初始化成功!\n");
return OK;
}
/*Function:求循环队列长度*/
int QueueLength(SqQueue q){
return (q.rear-q.front+LENGTH)%LENGTH;
}
/*FUnction:入队*/
Status EnQueue(SqQueue *q){
ElemType e;
if((q->rear+1)%LENGTH==q->front){
return ERROR;
}
printf("请输入入队元素:\n");
scanf("%d",&e);
q->base[q->rear]=e;
q->rear=(q->rear + 1) % LENGTH; //队尾指针加1
printf("入队成功 \n");
return OK;
}
/*function:出队*/
Status OutQueue(SqQueue *q){
if(q->front==q->rear){
return ERROR;
}
printf("%d出队\n",q->base[q->front]);
q->front++;
return OK;
}
/*Function:取队头元素*/
ElemType getQueueFront(SqQueue q){
if(q.front!=q.rear){ //非空
return q.base[q.front];
}
}
/*Function:取队尾元素*/
ElemType getQueueRear(SqQueue q){
if(q.front!=q.rear){
q.rear--;
return q.base[q.rear];
}
}
/*Function:判断队是否为空 */
Status isEmpty(SqQueue q){
if(q.front==q.rear){//为空
return OK;
}else{
return ERROR;
}
}
/*Function:判断队是否已满 */
Status isFull(SqQueue q){
if((q.rear+1)%LENGTH==q.front){//已满
return OK;
}else{
return ERROR;
}
}
void main(){
SqQueue s;
ElemType e;
Init_SqQueue(&s);
EnQueue(&s);
EnQueue(&s);
EnQueue(&s);
OutQueue(&s);
e=getQueueFront(s);
printf("队头元素为:%d\n",e);
e=getQueueRear(s);
printf("队尾元素为:%d\n",e);
if(isEmpty(s)){
printf("队为空!\n");
}else{
printf("队非空!\n");
}
}
对此程序中主程序有疑问,就是传递参数时传递s和&s有什么区别