|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
函数要求1:编写函数 int mergearr( int a[], int m, int b[], int n),将两个严格增序数组a[],b[]合并,并保证合并后数组严格增序,函数值返回合并后的数组a[]中元素个数。
函数要求2:不能定义额外新数组。
由于本人才开始学习C,经常出现各种BUG,却不知道错在哪,请各位大佬帮忙~
本人思路文字描述:将b[]中小于a[i]的元素按序插入数组a,大于a[m]的元素插入a[]尾部。
{
i=0,j=0;
a[i]与b[j]进行循环对比(i<a[]长度,j<b[]长度):
1,如果a[i]<b[j]时,a[i]位置不变,i++后重新对比;
2,如果a[i]=b[j]时,a[i]不变,i++;j++后重新对比;
3,如果a[i]>b[j]时,数组a[]中第【i】位元素之后整体后移一位,再将b[j]赋值给a,数组a[]长度++;j++后重新对比。
循环后两种情况:
1,数组a[]包含所有数组b[]元素,实现函数要求。
2,数组a[]未包含所有b[]元素,需要将数组b[]剩余元素插入数组a[]尾部,实现函数要求。
}#include<stdio.h>
int mergearr(int a[],int m,int b[],int n)
{
int i=0,j=0,k,len=m;//m是数组a[]初始长度,len是a[]可变长度。
printf("函数内m=%d,n=%d\n",m,n);//验证函数各项数值,可忽略。
while(i<len&&j<n)//while循环逐一判断数组a,b中的元素大小
{
if(a[i]<b[j])
{
i++;
}
else if(a[i]==b[j])
{
i++;j++;
}
else if(a[i]>b[j])
{
for(k=len;k>i;k--)//数组a[]从a[i]之后整体后移
{
a[k]=a[k-1];
}
a[i]=b[j];//插入b[j]
len++;
j++;
}
}
printf("j=%d,a[len-1]=%d,b[j]=%d,len=%d\n",j,a[len-1],b[j],len);//验证函数各项数值,可忽略。
while(a[len-1]<b[j]&&j<n)//循环判断数组a[]是否包含全部数组b[],并将剩余数组b[]元素插入数组a[]尾部。
{
a[len]=b[j];
len++;
j++;
}
printf("j=%d,a[len-1]=%d,b[j]=%d,len=%d\n",j,a[len-1],b[j],len);//验证函数各项数值,可忽略。
printf("函数内m=%d,n=%d\n",m,n);//验证函数各项数值,可忽略。
for(i=0;i<len;i++)
{
printf("%d,\n",a[i]);
}
return len;
}
int main()
{
int i,j,p,q,length;
int c[]={1,2,3,5,7,9};
int d[]={2,4,5,6,8,9,10};
p=sizeof(c)/sizeof(c[0]);//求c[]长度
q=sizeof(d)/sizeof(d[0]);
printf("调用前p=%d,q=%d\n",p,q);//验证函数各项数值,可忽略
int mergearr(int a[],int m,int b[],int n);
length=mergearr(c,p,d,q);
printf("length=%d\n",length);
printf("调用后p=%d,q=%d\n",p,q);//验证函数各项数值,可忽略
for(i=0;i<length;i++)
{
printf("%d,",c[i]);
}
}
输出结果如下:[/i][/i][/i][/i][/i][/i][/i]
这里:调用后p=10,以及最后输出的结果1,2,3,4,5,6,7,8,10,10均不是想要的答案,却不知道在哪里出错,如何更改,请各位大佬帮忙。
本帖最后由 jackz007 于 2019-3-14 14:17 编辑
main() 函数中对 c[] 定义的时候,没有为 d[] 预留空间,导致拼接后 c[] 严重越界 所以,我对 main() 也做了修改: #include <stdio.h>
mergearr(int a[] , const int m , const int b[] , const int n)
{
int i = 0 , j = 0 , k ;
for(i = 0 ; i < n ; i ++) a[m + i] = b[i] ;
for(i = 1 ; i < m + n ; i ++) {
j = i ;
while(j > 0 && a[j] < a[j - 1]) {
k = a[j] ;
a[j] = a[j - 1] ;
a[j - 1] = k ;
j -- ;
}
}
for(i = 0 ; i < m + n ; i ++) printf("%d\n" , a[i]) ;
return m + n ;
}
main(void)
{
int i , j , p , q , length ;
int c[20] = {1 , 2 , 3 , 5 , 7 , 9} ;
int d[] ={2 , 4 , 5 , 6 , 8 , 9 , 10} ;
p = 6 ; // 求c[]长度
q = sizeof(d) / sizeof(int) ;
printf("调用前 p = %d , q = %d\n" , p , q) ; //验证函数各项数值,可忽略
length = mergearr(c , p , d , q) ;
printf("length = %d\n" , length) ;
printf("调用后 p = %d , q = %d\n" , p , q) ; //验证函数各项数值,可忽略
for(i = 0 ; i < length ; i ++) printf("%d ," , c[i]) ;
}
const 的意思是变量在函数内只读,不允许修改,编译程序在检查语法的时候会更加严格。
|
|