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

循环队列头元素删不掉?

能输出队头元素的值,但是删不掉队头元素
好奇为什么 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;
    }
    
    
    点赞 评论
  • 那边的薯片半价阿 2018-10-22 10:16
    #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;
    }
    
    
    点赞 评论

相关推荐 更多相似问题