野马脱缰的騏 2023-03-27 18:11 采纳率: 16.7%
浏览 22
已结题

循环队列Segmentation fault的产生原因

请问为什么循环队列这段代码会爆出Segmentation fault的错误啊?

#include <iostream>
#include <cmath>

using namespace std;

struct elem
{
    int *arr;
    int maxSize;
    int front,rear;
};
void create(elem *p,int a)
{
    p->arr=new int [a];
    p->maxSize=a;
    p->front=p->rear=0;
}
void clear(elem *p)
{
    delete [] p->arr;
}

bool isEmpty(elem *p)
{
    return p->front==p->rear;
}
void doubleSpace(elem *p)
{
    int *tmp=p->arr;
    p->arr=new int [2*(p->maxSize)];
    for (int i=1;i<p->maxSize;++i) p->arr[i]=tmp[(p->front+i)%p->maxSize];
    p->front=0;p->rear=p->maxSize-1;
    (p->maxSize)*=2;
    delete tmp;
}
void deQueue(elem *p)
{
    if(!isEmpty(p))
    {p->front = (p->front+1)%p->maxSize;
    cout << p->front <<' '<<abs((p->rear)-(p->front))<<endl;
    }
    else {
        cout << p->front <<' '<<abs((p->rear)-(p->front))<<endl;
    }
}
void enQueue(elem *p,int i)
{   if((p->rear+1)%p->maxSize==p->front) doubleSpace(p);
    p->rear=(p->rear+1)%p->maxSize;
    p->arr[p->rear]=i;
  cout << p->rear <<' '<<abs((p->rear)-(p->front))<<endl;
}
int getHead (elem *p)
{
    return p->arr[(p->front+1)%p->maxSize];
}

int main()
{   elem *p;



    int m,n,b;
    cin >> m >> n;
    create (p,m);
    b=n;
    while (b-->0)
    {
        int i;
        cin>>i;
        switch(i){
        case 0: int x;
        cin>>x;
        enQueue(p,x);break;
        case 1:deQueue(p);break;
        }
    }
    clear (p);
    return 0;

}


  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-03-27 18:18
    关注

    基于Monster 组和GPT的调写:

    #include <iostream>
    #include <cmath>
     
    using namespace std;
     
    struct elem
    {
        int *arr;
        int maxSize;
        int front,rear;
    };
    void create(elem *p,int a)
    {
        p->arr=new int [a];
        p->maxSize=a;
        p->front=p->rear=0;
    }
    void clear(elem *p)
    {
        delete [] p->arr;
    }
     
    bool isEmpty(elem *p)
    {
        return p->front==p->rear;
    }
    void doubleSpace(elem *p)
    {
        int *tmp=p->arr;
        p->arr=new int [2*(p->maxSize)];
        for (int i=1;i<p->maxSize;++i) p->arr[i]=tmp[(p->front+i)%p->maxSize];
        p->front=0;p->rear=p->maxSize-1;
        (p->maxSize)*=2;
        delete[] tmp;
    }
    void deQueue(elem *p)
    {
        if(!isEmpty(p))
        {
            p->front = (p->front+1)%p->maxSize;
            cout << p->front <<' '<<abs((p->rear)-(p->front))<<endl;
        }
        else {
            cout << p->front <<' '<<abs((p->rear)-(p->front))<<endl;
        }
    }
    void enQueue(elem *p,int i)
    {   
        if((p->rear+1)%p->maxSize==p->front) doubleSpace(p);
        p->rear=(p->rear+1)%p->maxSize;
        p->arr[p->rear]=i;
        cout << p->rear <<' '<<abs((p->rear)-(p->front))<<endl;
    }
    int getHead (elem *p)
    {
        return p->arr[(p->front+1)%p->maxSize];
    }
     
    int main()
    {   
        elem q;
        elem *p=&q;
     
        int m,n,b;
        cin >> m >> n;
        create(p, m);
        b=n;
        while (b-->0)
        {
            int i;
            cin>>i;
            switch(i){
            case 0: 
                int x;
                cin>>x;
                enQueue(p,x);
                break;
            case 1:
                deQueue(p);
                break;
            }
        }
        clear(p);
        return 0;
     
    }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题