m0_52445259
m0_52445259
2021-04-12 23:36
采纳率: 50%
浏览 42

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

#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条回答 默认 最新

  • technologist_23
    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,输出显示视觉效果更好。

     

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

    点赞 1 评论
  • technologist_15
    CSDN专家-三岁丫 2021-04-12 23:40

    贴代码,请用专门的代码段控件

    点赞 评论
  • whj1688
    梧桐树✯ 2021-04-13 00:53

    同意一楼

    点赞 评论
  • QA_Assistant
    有问必答小助手 2021-04-13 09:21

    您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论

相关推荐