完整的正确代码如下:
#include<stdio.h>
#define MaxSize 10 //宏定义
typedef struct{//结构体定义
int data[MaxSize];
int length;
}SqList;
int main(){
SqList b={{1,3,5,7,9,11,13,15},8};
SqList a={{2,4,6,8,10,12,14,16,18,20},10};
SqList c;
c.length=a.length+b.length;
printf("Clength的初始值%d\n",c.length);
int i;
printf("数组A ");
for(i=0;i<a.length;i++)
{
printf("%d ",a.data[i]);
}
printf("\n");
printf("数组B ");
for(i=0;i<b.length;i++)
{
printf("%d ",b.data[i]);
}
printf("\n");
//顺序表的初始化
Combine(a,b,&c);
printf("函数调用后Clength%d\n",c.length);//11???
for(i=0;i<c.length;i++)
{
printf("%d ",c.data[i]);
}
return 0;
}
void Combine(SqList A,SqList B,SqList *C){
int i=0,j=0,k=0;
while(i<A.length && j<B.length){
if(A.data[i]<B.data[j]){
C->data[k++]=A.data[i++];
}
else{
C->data[k++]=B.data[j++];
}
}
printf("两两比较后Clength %d\n",C->length);
while(i<A.length){
C->data[k++]=A.data[i++];
}
while(j<B.length){
C->data[k++]=B.data[j++];
}
printf("所有循环结束Clength %d\n",C->length);
C->length=k;//必须重新赋值,不然会变成11???? 为什么为什么为什么,奇怪
}
正常结果如下:
在删除函数末尾的赋值语句后
C->data[k++]=A.data[i++];
}
while(j<B.length){
C->data[k++]=B.data[j++];
}
printf("所有循环结束Clength %d\n",C->length);
C->length=k;//必须重新赋值,不然会变成11???? 为什么为什么为什么,奇怪
}
错误结果如下:
由图可以看出C结构体中的length发生了变化
但问题在于
我最开始就给C的length赋值为了18(即a的长度加上b的长度)
我不理解
测试了半天改了好几个地方才发现是这里的错误
就请问一下为什么C的length发生了改变
而且我直接把循环条件改成18,打印的结果也会变成正确的情况
// for(i=0;i<c.length;i++) 原本如此
for(i=0;i<18;i++)
{
printf("%d ",c.data[i]);
}
return 0;
}
问:C的length为什么发生了改变???