顺序循环队列的基本操作

实现循环队列的基本操作。(循环队列最大长度不超过20)
输入若干个整数(以空格分隔,a结束输入),其中0表示做出队操作,不为0的整数为入队元素。
若出队错误输出“error”;
若最后队列为空,则输出“empty”;
若最后队列非空,依次输出队列的全部元素。

问题:输出的全是error,不知道怎么改


#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXQSIZE 20
typedef  int QElemType; /*队列元素类型*/
typedef struct
{
    QElemType *base;
    int front;
    int rear;
}SqQueue;

/*初始化队列*/
int InitQueue(SqQueue *Q)
{
    Q->base=(QElemType *)malloc(MAXQSIZE *sizeof(QElemType));
    if(!Q->base)
        return ERROR;
    Q->front=0;
    Q->rear=0;
    return OK;
}

/*求队长*/
int QueueLength(SqQueue *Q)
{
    int a;
    a=(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
    return a;
}

/*入队*/
int 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;
}

/*出队*/
int 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;
}

/*判队空*/
int QueueEmpty(SqQueue *Q)
{
    if(Q->front==Q->rear)
        return OK;
    else
        return ERROR;
}

/*取队头*/
int GetHead(SqQueue *Q,QElemType *e)
{
    if(Q->front==Q->rear)
        return ERROR;
    *e=Q->base[Q->front];
    return OK;
}

/*销毁队列*/
int DestroyQueue(SqQueue *Q)
{
    if(Q->base)
    {
        Q->rear=Q->front=0;
        free(Q->base);
    }
    return OK;
}

int main()
{
    SqQueue q;
    int e;
    InitQueue(&q);

    int i,j;
    for(i=0;i<MAXQSIZE;i++)
    {
        scanf("%d",&e);
        if(e='a')
            break;
        if(e==0)
            DeQueue(&q,e);
        if(e!=0)
            EnQueue(&q,e);
    }
    if(!DeQueue(&q,e))
    {
        printf("error");
    }
    else if(QueueEmpty(&q))
    {
        printf("empty");
    }
    else if(!QueueEmpty(&q))
    {
        for(j=0;j<MAXQSIZE;j++)
        {
            GetHead(&q,e);
        }
    }

    return 0;
}

先上结果

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXQSIZE 5
typedef  int QElemType; /*队列元素类型*/
typedef struct
{
    QElemType *base;
    int front;
    int rear;
}SqQueue;
/*初始化队列*/
int InitQueue(SqQueue *Q)
{
    Q->base=(QElemType *)malloc(MAXQSIZE *sizeof(QElemType));
    if(!Q->base)
        return ERROR;
    Q->front=0;
    Q->rear=0;
    return OK;
}
/*求队长*/
int QueueLength(SqQueue *Q)
{
    int a;
    a=(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
    return a;
}
/*入队*/
int 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;
}
/*出队*/
int 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;
}
/*判队空*/
int QueueEmpty(SqQueue *Q)
{
    if(Q->front==Q->rear)
        return OK;
    else
        return ERROR;
}
/*取队头*/
int GetHead(SqQueue *Q,QElemType *e)
{
    if(Q->front==Q->rear)
        return ERROR;
    *e=Q->base[Q->front];
    return OK;
}
/*销毁队列*/
int DestroyQueue(SqQueue *Q)
{
    if(Q->base)
    {
        Q->rear=Q->front=0;
        free(Q->base);
    }
    return OK;
}
int main()
{
    SqQueue q;
    int e;
    InitQueue(&q);
    int i,j;
    for(i=0;i<MAXQSIZE;i++)
    {
        scanf("%d",&e);
        if(e=='a')
            break;
        if(e==0)
            DeQueue(&q,&e);
        if(e!=0)
            EnQueue(&q,e);
    }
//    if(!DeQueue(&q,&e))
//    {
//        printf("error");
//    }
    if(QueueEmpty(&q))
    {
        printf("empty");
    }
    else
    for(j=0;j<MAXQSIZE-1;j++)
    {
        DeQueue(&q,&e);
        printf("%d ",e);
    }
    return 0;
}

这个代码我改动的有:
首先你传入函数的参数不太对,我给你改了一下,这里大概是指针没学好,你可以私信我或者再学学函数和指针相关的知识,然后就是在你的for循环里你写的if(e='a')是不对的,要写两个等于,不然一输入然后赋值然后就跳出了,队列里没有东西啊
还写了个if(!DeQueue(&q,&e))这个,这个好像没啥用啊,你不是专门写了个判队空的函数么,我看你后面也用了,为啥要先出一个,是害怕输入的都是无效值吗,那我觉得你应该重新写一个,不然你这个假设都是有效的,那不就不行了么,对不,有一个有效的然后出队,出了之后就error了,所以我把它注释了,

还有一个就是if(QueueEmpty(&q))这个和 if(!QueueEmpty(&q))这个这两个不是必然对立么,对不,要么空,要么不空,所以第二个if 可以不写,第一个的else就是第二个if

还有一个就是你最后一个for里面 GetHead(&q,e); 这个我没有看懂,是想输出第一个数吗,还是咋样[笑哭],但是输出第一个数的话为什么要写个循环呢,还有这个for 你要注意,循环队列是以牺牲一个位置来区分队满和队空的,所以你要小于maxsize减一才行

以上就是我个人的观点,我试了一下是可以跑起来的,如果你还有什么问题或者哪里还不理解可以私信我