C语言循环队列入队时出现的问题

我这个循环队列的入队哪里出问题了,为什么每次入队都是1,各位帮我看看

img

好好调试,看x到底是几
是不是调用的时候每次都push的值是1
还是说打印的时候一直只打印一个

努力の小熊参考Chatgpt做出的回答:
在你的代码中,CirQueueInit 函数中分配空间时使用的数据类型是 CirQueue *,也就是说,q->base 存储的是一个指向 CirQueue 结构体的指针。但在 CirQueuePush 函数中,你将元素值直接赋给了 q->base[q->rear],这样会导致队列中存储的元素并不是你想象中的整数,而是一个指向其他内存地址的指针,因此每次入队都是 1。

要解决这个问题,你需要将 CirQueue 中的 base 成员改为指向元素类型 ElemType 的指针,同时在 CirQueueInit 函数中分配空间时应该按照元素类型分配空间。修改后的代码如下:

#define MAXSIZE 8
typedef int ElemType;
typedef struct CirQueue {
    ElemType *base; // 修改为指向元素类型的指针
    int front;
    int rear;
} CirQueue;

//初始化
void CirQueueInit(CirQueue *q) {
    //分配空间
    q->base = (ElemType *) malloc(MAXSIZE * sizeof(ElemType)); // 按照元素类型分配空间
    q->front = 0;
    q->rear = 0;
}

//队列销毁
void CirQueueDestroy(CirQueue *q) {
    assert(q);
    free(q->base);
    q->base = NULL;
}

//入队
void CirQueuePush(CirQueue *q, ElemType x) {
    assert(q);
    //判断循坏队列是否为满
    if (((q->rear + 1) % MAXSIZE) == q->front) {
        printf("队列已满,无法入队\n");
        return;
    } else {
        //队列未满
        q->base[q->rear] = x; // 更改尾指针的指向
        q->rear = (q->rear + 1) % MAXSIZE;
    }
}

这样修改后,程序就可以正常将整数元素入队了。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7688209
  • 你也可以参考下这篇文章:c语言程序设计 编写一个程序,以每行一个单词的形式打印其输出
  • 你还可以看下c语言参考手册中的 c语言-成员访问与间接
  • 除此之外, 这篇博客: C语言函数参数顺序中的 函数的参数,在计算的时候是按照从右往左的顺序进行的。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 对于函数func,先求右边x+=2参数,返回x=8,然后计算结果。也就是传递给形参的两个值都是8,返回值为16。

    下面我们写程序验证下,并结合自增自减运算升级下难度。

    思考下面程序执行结果:

    #include<stdio.h>
    
    void fun(int m,int n)
    
    {
    
    printf("%d+%d\n",m,n);
    
    }
    
    int main()
    
    {
    
    int a=100;
    
    fun(a,a+=2);
    
    printf("%d,%d,%d\n",++a,a--,++a);
    
    printf("%d\n",a);
    
    return 0;
    
    }
    

    根据上面讲到的内容,你要想到的是printf也是函数,参数计算也要按照从左往右。但这时候涉及到++,多数同学就又会弄不清了。我们看下执行结果,帮助大家理解。
    在这里插入图片描述
    首先,第一行验证了传递给形参的值都是a加2之后值102.

    第二行,按照从右往左,第一个是先让a的值+1,输出103。第二个还是a 103。但下一步是先让a的值-1,再计算左边的参数,还是别的呢?

    根据运行结果,我们知道是先计算左边参数,a的值+1输出104,然后用完了以后a的值-1。

    最后一行输出103也验证了是最后执行a的值-1。

  • 您还可以看一下 CSDN讲师老师的C语言精髓之编译过程视频教程课程中的 计算机的组成部分,栈内存的特点;画出内存图,引入指针的概念小节, 巩固相关知识点