大佬们帮个忙 c语言一道题:用for循环合并两个数组 数组中的元素随便 谢谢

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-01
一个C语言程序问题,合并两个数组元素,相同的元素只输出一个,并按大小顺序排列

你按照楼上那样改掉abc的类型定义后,往c数组里添加数据的循环改成下面这样。
i = 0;
j = 0;
k = p + q;
for (n = 0; n<k && i!=p && j!=q; n++)
{
if (a[i]<b[j])
{
c[n] = a[i];
i++;
}
else if (a[i] == b[j])
{
c[n] = a[i];
i++;
j++;
k--;
}
else
{
c[n] = b[j];
j++;
}
}
if (i == p){
do{
c[n] = b[j];
j++;
n++;
} while (j < q);
}
else if (j == q){
do{
c[n] = a[i];
i++;
n++;
} while (i < p);
}

我解释一下吧,你第一个判断a[i]<b[j]。比如a有2个数1,3,b有2个数2,4。在比较3和4后,a中的3进入到c中,i指针后移一个,但是现在我们知道a已经没有元素了,i所指的为不确定的地址,你现在再比较a[i]和b[j]就会出现问题了。因为a[i]现在是一个错值,比如-87328432,这样的值,与b[j]的4比较肯定是小,最后一个数就会输出-87328432这样的值。
所以你需要在后面加上一个判断,如果i,j指针移动到了末尾,就停止比较,直接把多余的值,搬到c中就行了。


如图

#include <stdio.h>

void sort(int a[],int n) {
int i,j,k,t;
for(i = 0;i < n - 1;++i) {
k = i;
for(j = k + 1;j < n;++j) {
if(a[j] < a[k]) k = j;
}
if(i != k) {
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}

int merge(int a[],int n,int b[],int m) {
int i;
for(i = 0;i < m;i++) a[n + i] = b[i];
return m + n;
}

void show(int a[],int n) {
int i;
for(i = 0; i < n; ++i) printf("%d ",a[i]);
printf("
");
}

int main() {
int n,m = 5;
int a[10] = {36,35,39,48,38};
int b[5] = {21,19,18,29,27};
sort(a,m);
sort(b,m);
show(a,m);
show(b,m);
n = merge(a,m,b,m);
show(a,n);
sort(a,n);
show(a,n);
return 0;
}