iDragonLong 2021-04-12 23:36 采纳率: 50%
浏览 61
已采纳

【数据结构】循环队列代码为什么运行错误

#include <string.h>  //导入头文件 
#include <stdio.h>   //导入头文件
#include <stdlib.h>
#include <time.h>   //导入头文件

#define MAXSIZE 50
typedef struct Queue * CirQueue; //定义一个结构体指针 

struct Queue
{
    int front; //队头
    int rear;  //队尾
    int data[MAXSIZE];//数据 
};

//队列的创建 
CirQueue Create()
{
    CirQueue Cq=(CirQueue)malloc(sizeof(struct Queue)); //用malloc函数为队列在堆上申请空间 
    Cq->front = Cq->rear = -1;  //数组没数据,用-1标记 
    memset(Cq->data,0,MAXSIZE*sizeof(int)); //为队列元素申请内存空间 
    return Cq; //返回Sq的值 

//队列的长度 
int getLength(CirQueue Cq)
{
    return (Cq->rear+MAXSIZE-Cq->front)%MAXSIZE; //队列长度是队头队尾之差,队尾减队头 
}

//判断队列是否为空
int IsEmpty(CirQueue Cq)
{
    if(Cq->front = Cq->rear)  //判断队列是否为空的条件:队头是否等于队尾
    {
        return 1; //如果队列为空则返回1 
    } 
    return 0; //如果队列不为空则返回0 

void Insert(CirQueue Cq,int val)//入队
{
    if ((Cq->rear + 1) % MAXSIZE == Cq->front)
    {
        printf("队列已满,无法再插入元素!\n");//打印错误提示
        return;//返回
    }
    if (IsEmpty(Cq))//如果队列为空
    {
        Cq->front = Cq->rear = 0;//先让front和rear都等于0  插入后rear++
        Cq->data[Cq->rear] = val;//将val赋值
        Cq->rear++;//rear自增
    }
    else
    {
        Cq->data[Cq->rear] = val;
        Cq->rear = (Cq->rear + 1) % MAXSIZE;
    }
    
}
int Del(CirQueue Cq) //出队 
{
    
    if(IsEmpty(Cq))
    {
        printf("队列为空,无元素可出队!\n");
        return 0;
    }
    int temp = Cq->data[Cq->front];
    Cq->front = (Cq->rear+1)% MAXSIZE;
   return temp;

//获得队头
int GetHead(CirQueue Cq)
{
    //空队列
    if(Cq->front == Cq->rear)
    {
        printf("队列为空,无元素可取!\n"); //如果为空队列,则打印队列为空,无元素可取!
        return 10000;  //返回错误标志 
    }
    //获取元素
    return Cq->data[Cq->front]; //返回队头元素 

//清空 
void Clear(CirQueue Cq)

    Cq->front = Cq->rear = -1;  //
    printf("队列已清空!\n");  //打印队列已清空 

//销毁
void Destroy(CirQueue Cq)
{
    free(Cq); //用free函数释放队列 
    printf("队列已销毁!\n"); //打印队列已销毁

int main()
{
    CirQueue Cq = Create();  //创建队列
    srand((unsigned)time(0)); //随机生成数 
    int i = 0; //定义一个i,赋初值为0 
    for(i; i<10 ; ++i) //执行for循环 
    {
        Insert(Cq,rand()%100);  //将随机产生的数入队列 
    }

    printf("队列长度:%d\n",getLength(Cq)); //用getLength函数计算队列的长度 
    printf("队头元素    出队元素\n"); //打印队头元素,出队元素 
    while(getLength(Cq)>0)  //出队列,循环条件是队列不为空
    {
        int ret = GetHead(Cq); //获取队头元素
        printf("%d",ret); //打印队内元素 
        ret = Del(Cq);     //出队列
        printf("%d        \n",ret);  //打印删除的元素 
    } 
    
    Clear(Cq); //清空栈 
    Destroy(Cq); //销毁栈 
    
    system("pause"); //结束函数 
    return 0; 
}

  • 写回答

4条回答 默认 最新

  • CSDN专家-cpp_learner 2021-04-13 08:36
    关注

    小问题:

    问题一:

    判断队列是否为空中,if(Cq->front = Cq->rear);使用了赋值号,把该改成等号运算符就行。if (Cq->front == Cq->rear)

    问题二:

    出队 函数中,Cq->front = (Cq->rear+1)% MAXSIZE;使用了队尾,把它改成队头就行。Cq->front = (Cq->front + 1) % MAXSIZE;

    还有一个: printf("%d \t\t",ret); //打印队内元素 这里加两个\t,输出显示视觉效果更好。

     

    你发出来的两条问答均是我作答,如果问题解决,点个采纳吧!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统