我这个循环队列的入队哪里出问题了,为什么每次入队都是1,各位帮我看看
好好调试,看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;
}
}
这样修改后,程序就可以正常将整数元素入队了。
对于函数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。