那边的薯片半价阿 2018-10-20 05:19 采纳率: 83.3%
浏览 623
已采纳

循环队列头元素删不掉?

能输出队头元素的值,但是删不掉队头元素
好奇为什么 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;
}
  • 写回答

2条回答 默认 最新

  • Italink 2018-10-21 10:50
    关注
     #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题