此代码用于查找可能包含重复项的两个未排序数组的交集和并集。
联合工作正常,但在尝试访问交集数组内存时,我得到了垃圾结果。
我无法找出问题所在,试图对其进行调试,但它对我没什么帮助。
注意:remember[]
是一个标志数组,用于保存两个数组中交集元素的索引。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,n1,n2,j;
int user1[20];
int unionSize;
int intersectionArraySize;
printf("enter array1 size::\n");
scanf("%d",&n1);
printf("array1: ");
for(i=0; i<n1; i++)
{
scanf("%d",&user1[i]);
if (i>0) if(user1[i]==user1[i-1]) user1[i-1]=user1[i];
}
int user2[20];
printf("enter array2 size::\n");
scanf("%d",&n2);
for(i=0; i<n2; i++)
{
scanf("%d",&user2[i]);
if (i>0) if(user2[i]==user2[i-1]) user2[i-1]=user2[i];
}
int unionArray[20];
int remember[20]= {0}; // save index of common elements btn 2 arrays
int intersectionArray[20]={0};
intersectionArraySize=0;
unionSize=n1;
int index=0;
for(i=0; i<n1; i++)
{
for(j=0; j<n2; j++)
{
if (user1[i]==user2[j])
{
remember[j]=1;
intersectionArray[index]==user1[i];
intersectionArraySize++;
index++;
}
else unionArray[i]=user1[i];
}
}
for(i=0; i<n2; i++)
{
if(remember[i]!=1)
{
unionArray[n1]=user2[i];
n1++;
unionSize++;
}
}
printf("Union: ");
for (i=0; i<unionSize; i++)
{
if(i==unionSize-1) printf("%d\n",unionArray[i]);
else printf("%d ,",unionArray[i]);
}
printf("intersection: ");
for (i=0; i<intersectionArraySize; i++)
{
if(i==intersectionArraySize-1) printf("%d\n",intersectionArray[i]);
else printf("%d ,",intersectionArray[i]);
}
return 0;
}
答案 0 :(得分:0)
问题在于:
intersectionArray[index]==user1[i];
应该是:
intersectionArray[index]=user1[i];
对您的代码的一般评论:
设计非常糟糕。例如,除非你有充分的理由,否则不要同时计算两者。有一个块交叉而且只有那个。工会也一样。
您声明了具有固定大小的数组,因为您要求大小,这有点奇怪。这不是什么大问题,但如果您输入的尺寸超过20,请注意危险。
更糟糕的是unionArray
的大小为20.应该是40。
index
和intersectionArraySize
几乎是同一个变量。摆脱一个。
这看起来很乱:
for (i=0; i<unionSize; i++) {
if(i==unionSize-1) printf("%d\n",unionArray[i]);
else printf("%d ,",unionArray[i]);
}
这样做:
for (i=0; i<unionSize-2; i++) {
printf("%d ,",unionArray[i]);
}
printf("%d\n", unionArray[unionSize-1]);
也不是什么大问题,但是为什么当你知道它是应该特别对待的最后一个元素时,对每一个元素进行有条件的检查?