循环队列头元素删不掉?

能输出队头元素的值,但是删不掉队头元素
好奇为什么 orz求大神帮帮忙
代码如下

 #include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
typedef struct
{
    int *base;
    int front;
    int rear;
}SqQueue;
void init(SqQueue *Q)
{
    Q->base=(int *)malloc(MAXSIZE*sizeof(int));
    if(Q->base==0)
        exit(1);
    Q->front=Q->rear=0;
}

void create(SqQueue *Q)
{
    int i;
    for(i=1;i<=20;i++)
    {
        Q->base[i]=i;
        Q->rear=(Q->rear+1)%MAXSIZE;
    }
    Q->front=Q->base[1];//让头指针指向队列的第一个元素
    if((Q->rear+1)%MAXSIZE==Q->front)
        printf("error");
}
void input(SqQueue *Q,int e)
{
    int i;
    if(Q->front==(Q->rear+1)%MAXSIZE)
        printf("队满溢出");
    Q->base[Q->rear]=e;
    Q->rear=(Q->rear+1)%MAXSIZE;
     for(i=1;i<MAXSIZE;i++)
    {
        printf("%d\n",Q->base[i]);
    }

}
void output(SqQueue *Q,int *e)
{
    int i;
    if(Q->front==Q->rear)
        printf("队空");
    *e=Q->base[Q->front];
    Q->front=(Q->front+1)%MAXSIZE;//这行代码加不加输出结果毫无区别。。。
    for(i=1;i<MAXSIZE;i++)
    {
        printf("%d\n",Q->base[i]);
    }
}
int main()
{
    SqQueue *Q;
    int e;
    scanf("%d",&e);
    init(Q);
    create(Q);
    input(Q,e);
    output(Q,&e);
    printf("%d",e);
    printf("Hello world!\n");
    return 0;
}
 #include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
typedef struct
{
    int *base;
    int front;
    int rear;
}SqQueue;
void init(SqQueue *Q)
{
    Q->base = (int *)malloc(MAXSIZE * sizeof(int));
    if (Q->base == 0)
        exit(1);
    Q->front = Q->rear = 0;
}
void create(SqQueue *Q)             //这个函数相当于20个input输入0-19这二十个数,没必要写这个函数,可以直接在main函数中用input出处理
{
    int i;
    for (i = 0; i < 20; i++)        //这里直接从0开始,如果你非要从1,请在init函数中把front和rear初始化为1
    {
        Q->base[i] = i;
        Q->rear = (Q->rear + 1) % MAXSIZE;
    }
    //Q->front = 1;    //front是用来存起始下标的,直接在init中初始化,不用再这里修改,因为一开始front和rear是有联系的
    if ((Q->rear + 1) % MAXSIZE == Q->front)
        printf("error");
}
void input(SqQueue *Q, int e)
{
    int i;
    if (Q->front == (Q->rear + 1) % MAXSIZE)
        printf("队满溢出");
    Q->base[Q->rear] = e;
    Q->rear = (Q->rear + 1) % MAXSIZE;
}
int len(SqQueue *Q)
{
    return ((Q->rear - Q->front + MAXSIZE) % MAXSIZE);
}
void show(SqQueue *Q)           //展示队列单独写一个函数
{
    for (int i = Q->front; i != Q->rear; i = (i + 1) % MAXSIZE) {
        printf("%d ", Q->base[i]);
    }
    printf("\n");
}
void output(SqQueue *Q, int *e, int L)          //L参数没用
{
    int i;
    if (Q->front == Q->rear)
        printf("队空");
    *e = Q->base[Q->front];
    Q->front = (Q->front + 1) % MAXSIZE;        //这里已经删除了对头元素
                                                /*for (i = 1; i<L - 1; i++)
                                                {
                                                printf("%d\n", Q->front);
                                                Q->front++;//改了的地方是这里,我让头指针++以后就删去了队头 元素   //你这里把队列过了一遍
                                                }*/
}
void emp(SqQueue *Q)
{
    if (Q->front == Q->rear)
        printf("队空");
    else
        printf("非空");
}
int main()
{
    SqQueue Q;          //这里直接创建结构体,而不是指针,谨记“指针是用来存地址的”,创建指针一开始是没有分配空间的,除非你手动给它分配
    int e, L;
    scanf("%d", &e);
    init(&Q);
    create(&Q);
    show(&Q);
    input(&Q, e);
    show(&Q);
    L = len(&Q);
    printf("queue`s length is :%d\n", L);
    output(&Q, &e, L);
    show(&Q);
    printf("Pop :%d\n", e);
    emp(&Q);
    printf("Hello world!\n");
    return 0;
}

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
typedef struct
{
    int *base;
    int front;
    int rear;
}SqQueue;
void init(SqQueue *Q)
{
    Q->base=(int *)malloc(MAXSIZE*sizeof(int));
    if(Q->base==0)
        exit(1);
    Q->front=Q->rear=0;
}

void create(SqQueue *Q)
{
    int i;
    for(i=1;i<=20;i++)
    {
        Q->base[i]=i;
        Q->rear=(Q->rear+1)%MAXSIZE;
    }
    Q->front=Q->base[1];
    if((Q->rear+1)%MAXSIZE==Q->front)
        printf("error");
}
void input(SqQueue *Q,int e)
{
    int i;
    if(Q->front==(Q->rear+1)%MAXSIZE)
        printf("队满溢出");
    Q->base[Q->rear]=e;
    Q->rear=(Q->rear+1)%MAXSIZE;
     for(i=1;i<MAXSIZE;i++)
    {
        printf("%d\n",Q->base[i]);
    }

}
int len(SqQueue *Q)
{
    return ((Q->rear-Q->front+MAXSIZE)%MAXSIZE);
}
void output(SqQueue *Q,int *e,int L)
{
    int i;
    if(Q->front==Q->rear)
        printf("队空");
    *e=Q->base[Q->front];
    Q->front=(Q->front+1)%MAXSIZE;
    for(i=1;i<L-1;i++)
    {
        printf("%d\n",Q->front);
        Q->front++;//改了的地方是这里,我让头指针++以后就删去了队头 元素
    }
}
void emp(SqQueue *Q)
{
    if(Q->front==Q->rear)
        printf("队空");
    else
        printf("非空");
}
int main()
{
    SqQueue *Q;
    int e,L;
    scanf("%d",&e);
    init(Q);
    create(Q);
    input(Q,e);
    L=len(Q);
    printf("%d\n",L);
    output(Q,&e,L);
    printf("%d\n",e);
    emp(Q);
    printf("Hello world!\n");
    return 0;
}