关于队列出队的问题,如何解决?

一运行到出队就发生这样。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Maxsize 100
typedef int Datatype;
typedef struct {
    Datatype data[Maxsize];
    int front;
    int rear;
}SqQueue;
//初始化;
void initQueue(SqQueue* Q) {
    Q->front = Q->rear = 0;
}
//判空;
bool empty(SqQueue* Q) {
    if (Q->rear == 0)
        printf("为空\n");
    else
        printf("非空\n");
    return 1;
}
//判满
bool isfull(SqQueue* Q) {
    if (Q->rear == Maxsize)
        printf("已满\n");
    else
        printf("非满\n");
    return 1;
}
//入队;
bool push(SqQueue* Q, Datatype x) {
    if (Q->rear == Maxsize)
        return 0;
    else
        Q->data[Q->rear++] = x;
    return 1;
}
//出队;
bool pop(SqQueue* Q, Datatype &x) {
    if (Q->rear == 0)
        return 0;
    else
        x = Q->data[Q->front++];
    return 1;
}
//计算队列长度;
int getlength(SqQueue* Q) {
    int L = 0;
    L = (Q->rear - Q->front + Maxsize) % Maxsize;
    printf("%d", L);
    return L;
}
//读取队列
void sqqueueprintf(SqQueue*Q) {
    while (Q->front!=Q->rear)
    {
        printf("%6d", Q->data[Q->front++]);
    }
}
int main() {
    SqQueue Q;
    Datatype x;
    initQueue(&Q);
    empty(&Q);
    for (int i = 0; i < 5; i++)
    {
        push(&Q, i);
    }
    int i = 1;
    while (i)
    {
        printf("当前的队列如下:\n");
        sqqueueprintf(&Q);
        printf("\n");
        printf("------------------------------------\n");
        printf("         Main Menu         \n");
        printf("    1   入队    \n");
        printf("    2   出队   \n");
        printf("    3   清屏   \n");
        printf("    0   结束程序      \n");
        printf("------------------------------------\n");
        printf("请输入你选择的菜单号<1, 2, 3, 0>:\n");
        scanf_s("%d", &i);
        switch (i)
        {
        case 1:
            printf("请输入入队元素:");
            scanf_s("%d", &x);
            push(&Q, x);
            printf("\n\n");
            break;
        case 2:
            pop(&Q, x);
            printf("\n\n");
            break;
        case 3:
            system("cls");
            break;
        case 0:
            exit(0);
            break;
        default:
            printf("输入有误\n");
            break;
        }
    }
    return 0;
}

img

你连怎么输入的也没给出

但是一眼就能看到问题

bool empty(SqQueue* Q) {
    if (Q->rear == 0)
        printf("为空\n");
    else
        printf("非空\n");
    return 1;
}

这个代码,无论是否为空,都返回1

修改如下,改动处见注释,供参考:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Maxsize 100
typedef int Datatype;
typedef struct {
    Datatype data[Maxsize];
    int front;
    int rear;
}SqQueue;
//初始化;
void initQueue(SqQueue* Q) {
    Q->front = Q->rear = 0;
}
//判空;
bool empty(SqQueue* Q) {   //修改
    //f (Q->rear == 0)
    //    printf("为空\n");
    //else
    //    printf("非空\n");
    return  Q->rear == Q->front;//1; 修改
}
//判满
bool isfull(SqQueue* Q) {     //修改
    //if (Q->rear == Maxsize)
    //    printf("已满\n");
    //else
    //    printf("非满\n");
    return  (Q->rear + 1) % Maxsize == Q->front;  //1; 修改
}
//入队;
bool push(SqQueue* Q, Datatype x) {
    if (isfull(Q))           //修改
        return 0;
                             //else {  修改
    Q->data[Q->rear] = x;
    Q->rear = (Q->rear + 1) % Maxsize; //修改
    return 1;
                             //}
}
//出队;
bool pop(SqQueue* Q, Datatype& x) {
    if (empty(Q))      //if (Q->rear == 0)
        return 0;
    x = Q->data[Q->front];
    Q->front = (Q->front + 1) % Maxsize; //修改
    return 1;
}
//计算队列长度;
int getlength(SqQueue* Q) {
    int L = 0;
    L = (Q->rear - Q->front + Maxsize) % Maxsize;
    printf("%d", L);
    return L;
}
//读取队列
void sqqueueprintf(SqQueue* Q) {
    int  f = Q->front;    // 修改
    while (f != Q->rear)  //while (Q->front != Q->rear) 修改
    {
        printf("%6d", Q->data[f]); // 修改
        f = (f + 1) % Maxsize;     // 修改
    }
}
int main() {
    SqQueue Q;
    Datatype x;
    initQueue(&Q);
    empty(&Q);
    for (int i = 0; i < 5; i++)
    {
        push(&Q, i+1);
    }
    int i = 1;
    while (i)
    {
        printf("当前的队列如下:\n");
        sqqueueprintf(&Q);
        printf("\n");
        printf("------------------------------------\n");
        printf("         Main Menu         \n");
        printf("    1   入队    \n");
        printf("    2   出队   \n");
        printf("    3   清屏   \n");
        printf("    0   结束程序      \n");
        printf("------------------------------------\n");
        printf("请输入你选择的菜单号<1, 2, 3, 0>:\n");
        scanf_s("%d", &i);
        switch (i)
        {
        case 1:
            printf("请输入入队元素:");
            scanf_s("%d", &x);
            push(&Q, x);
            printf("\n\n");
            break;
        case 2:
            pop(&Q, x);
            printf("\n\n");
            break;
        case 3:
            system("cls");
            break;
        case 0:
            exit(0);
            break;
        default:
            printf("输入有误\n");
            break;
        }
    }
    return 0;
}