白日梦也迷茫 2021-10-20 19:41 采纳率: 90.5%
浏览 171
已结题

顺序循环队列的基本操作

实现循环队列的基本操作。(循环队列最大长度不超过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;
}

  • 写回答

1条回答 默认 最新

  • Autumn0923 2021-10-20 22:44
    关注

    先上结果

    #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减一才行

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月20日

悬赏问题

  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services