我的C程序的目的是获取两个数组(均由唯一的数字组成)并将它们两个合并为一个新的数组,从而消除两者之间相同的任何数字。但是,当我尝试合并两者时,它会打印回合并的两个数组,而不会消除任何重复项。
我的程序通过首先添加“ array_A”中的元素来创建“ array_C”。然后,它使用计数器变量检查“ array_B”和“ array_C”之间是否存在重复项。对于for循环检查的“ array_C”中的每个值,如果“ array_B”的值不等于“ array_C”中的值,则计数器减1。如果检查了“ array_C”中的所有值,则counter <= 0,表示“ array_C”中没有该值的重复项,应将其添加到“ array_C”的末尾。我使用“位置”变量对此进行跟踪。
//Creation of array_C
int length_C = length_A + length_B;
int array_C[length_C];
//Copying array_A to array_C
for (i = 0; i < length_A; i++) {
array_C[i] = array_A[i];
}
//Checking array_C against array_B for duplicates
counter = length_A;
int position = length_A;
for (i = 0; i < length_B; i++) {
for (j = 0; j < length_C; j++) {
if (array_B[i] != array_C[j]) {
counter--;
} else {
counter++;
}
}
//this is the position tracker to add new value in array_C
if (counter <= 0) {
array_C[position] = array_B[i];
position++;
}
}
如果我输入以下内容:
Enter the length of array 1: 6
Enter the elements of the array: 1 2 3 4 5 6
Enter the length of array 2: 6
Enter the elements of the array: 3 4 5 6 7 8
我希望结果应该像这样:
Here is the merged array:
1 2 3 4 5 6 7 8
但是,它看起来像这样:
1 2 3 4 5 6 3 4 5 6 7 8
显然,出了点问题,并且不了解它应该只添加不是重复的变量。
答案 0 :(得分:1)
您的逻辑有缺陷。这就是为什么您得到意想不到的结果。请参见代码中的以下修订:
for (i = 0; i < length_B; i++) {
int skip = 0;
for (j = 0; j < length_C; j++) {
if (array_B[i] == array_C[j]) {
skip=1;
break;
}
}
if(skip == 1) continue;
array_C[position++] = array_B[i];
}
答案 1 :(得分:1)
问题出在内部for循环内部的逻辑上。根据问题陈述,如果array_c的任何值与array_b的任何值都匹配,则应删除该值,否则将其添加到array_c。因此您可以简单地尝试执行以下操作。请确保您了解代码。如果您有任何疑问,请随时提问。
for (i = 0; i < length_B; i++) {
bool isExistInArrayC = false;
for (j = 0; j < length_C; j++) {
if (array_B[i] == array_C[j]) {
isExistInArrayC = true;
break;
}
}
//this is the position tracker to add new value in array_C
if (isExistInArrayC == false) {
array_C[position] = array_B[i];
position++;
}
}
答案 2 :(得分:1)
这些建议当然会起作用,但是性能(尤其是大型阵列)的性能将非常差。从数组B添加整数时,我将维护一个排序的数组“ C”并对其进行二进制搜索。 您当然需要数组C的双向链接列表。