两个未排序数组的交集和并集

时间:2017-10-26 13:16:27

标签: c arrays

此代码用于查找可能包含重复项的两个未排序数组的交集和并集。

联合工作正常,但在尝试访问交集数组内存时,我得到了垃圾结果。

我无法找出问题所在,试图对其进行调试,但它对我没什么帮助。

注意: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;
}

1 个答案:

答案 0 :(得分:0)

问题在于:

intersectionArray[index]==user1[i];

应该是:

intersectionArray[index]=user1[i];

对您的代码的一般评论:

设计非常糟糕。例如,除非你有充分的理由,否则不要同时计算两者。有一个块交叉而且只有那个。工会也一样。

您声明了具有固定大小的数组,因为您要求大小,这有点奇怪。这不是什么大问题,但如果您输入的尺寸超过20,请注意危险。

更糟糕的是unionArray的大小为20.应该是40。

indexintersectionArraySize几乎是同一个变量。摆脱一个。

这看起来很乱:

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]);

也不是什么大问题,但是为什么当你知道它是应该特别对待的最后一个元素时,对每一个元素进行有条件的检查?