dev c++,合并两个升序数组到另一数组后,输出的最后一个是0,理论上应该不是0

 

#include<stdio.h>
int shuru(int a[]);
void paixu(int *p,int n);
void shuchu(int a[],int n);
void hebing(int a[],int b[],int c[],int na,int nb);
int main()
{
    int a[100], b[100], c[200],na,nb;
    na=shuru(a);//na,nb记录数组的有效数字的长度
    paixu(a,na);
    shuchu(a,na);
    nb=shuru(b);
    paixu(b,nb);
    shuchu(b,nb);
    hebing(a,b,c,na,nb);
    shuchu(c,na+nb);
    return 0;
}

int shuru(int a[])
{
    int i=0;
    static int x=0;//控制输出的文字
    char k;//用来控制输入结束
    if(x==0)
        printf("输入数组a的整数(输入回车可退出输入):\n");
    if(x==1)
        printf("输入数组b的整数(输入回车可退出输入):\n");
    x=1;
    for(i=0;i<100;i++)
    {
        scanf("%d",&a[i]);
        if((k=getchar())=='\n')
        {
            printf("该数组的有效长度:%d\n",i+1);
            return i+1;
        }
    }
}

void paixu(int *p,int n)
{
    int i=0,j=0, min=0;
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(*(p+i)>*(p+j))
            {
                min=*(p+j);
                * (p+j)=* (p+i);
                * (p+i)=min;
            }
        }
    }
}

void shuchu(int a[],int n)
{
    int i=0;
    static int x=0;
    if(x==0)
    {
        printf("按升序排序后的a数组为:\n");
        x=1;
    }
        else if(x==1)
        {
            printf("按升序排序后的b数组为:\n");
            x=-1;
        }
    else if(x==-1)
        printf("合并了a,b数组的c数组为:\n");
    for(i=0;i<n;i++)
    {
        printf("%-5d",a[i]);
        if((i)%10==0&&i!=0)
            printf("\n");//每输出10个数换行一次
    }
    printf("\n");
}
void hebing(int a[],int b[],int c[],int na,int nb)
{
    int i=0,j=0,k=0;
    if(na>=nb)
    {
        for(i=0;i<nb+1;i++)
            for(;j<nb+1;j++)
                if(a[i]<=b[j])
                    {
                        c[k++]=a[i];
                        break;//a大于b跳出内层,用下一个a
                    }
                    else 
                    {
                        c[k++]=b[j];//当a的这个元素小于b后,把b的元素给c,同时继续用a的这个元素与b的下一个作比较,直到a的大于b,a就到下一个元素
                    }
        while(i<na) 
        c[k++]=a[i++];//当b的元素都比较完后直接将a的依次给c
    }
    else if(na<nb)
    {
        for(i=0;i<na+1;i++)
            for(;j<na+1;j++)
                if(a[i]<=b[j])
                {
                    c[k++]=a[i];
                    break;//a大于b跳出内层,用下一个a
                }
                else 
                {
                    c[k++]=b[j];//当a的这个元素小于b后,把b的元素给c,同时继续用a的这个元素与b的下一个作比较,直到a的大于b,a就到下一个元素
                }
        while(j<nb)
        c[k++]=b[j++];//当a的元素都比较完后直接将b的依次给c
    }
}//将a,b数组合并到c数组且c数组按升序排序,a数组与b数组有相同元素时a在前
 

合并的逻辑太乱了。参考如下:如有帮助,请采纳一下,谢谢。

int ina = 0;  //a的起始索引
int inb = 0;  //b的起始索引
int inc = 0;  //c的起始索引

while(ina < na && inb < nb)
{
	if(ina == na && inb < nb)
	{
		c[inc] = b[inb];
		inc++;
		inb++;
	}else if (ina < na && inb == nb)
	{
		c[inc] = a[ina];
		inc++;
		ina++;
	}else
	{
		if (a[ina] < b[inb])
		{
			c[inc] = a[ina];
			inc++;
			ina++;
		}else
		{
			c[inc] = b[inb];
			inc++;
			inb++;
		}
	}

}

 

看下判断的地方,是不是少考虑了临界情况

最后一个数丢了

搞这么复杂干啥呢,把a,b先合并到c,然后对c进行paixu()不就行了么

在程序中试了一下,还是那样,最后一个输出是0

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^