如何检查array1中的所有元素是否都在array2中?

时间:2015-01-19 20:48:24

标签: c arrays

我需要编写一个程序来检查两个数组是否相等,这意味着array1中的元素都在array2中。元素可能位于不同的行和列中,但第一个数组中的所有元素都需要位于第二个数组中。我写了下面的代码:

 #include <stdio.h>

int fun(int m, int tab1[][m], int tab2[][m], int n)
{
    int i, j, k, p, itis = 0;

    if(itis == 0)
    {
        for(i=0; i<n; i++)
        {
            for(j=0; j<m; j++)
            {
                int elem = tab2[i][j];

                for(k=0; k<n; k++)
                {
                    for(p=0; p<m; p++)
                    {
                        if(tab1[k][m] == elem)
                        {
                            itis = 1;
                        }
                    }
                }

            }
        }
    }

    return itis;
}

int main()
{

    int tab1[][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
    int tab2[][3] = {{7,8,9}, {1,2,3}, {4,5,6}};
    int tab3[][3] = {{0,0,0}, {0,0,0}, {0,0,1}};

    int tab4[][3] = {{7,8,9}, {1,2,3}, {4,5,0}};

    printf("%d\n", fun(3, tab1, tab4, 3));

    return 0;
}

如果第一个数组中的所有元素都存在于第二个数组中,则我的函数应该返回1(可以按不同的顺序 - 行/列)。但是对于tab1tab4,我获得了1,而不是0。 (在tab1中有6个,但6个不在tab4中。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

int fun(int m, int tab1[][m], int tab2[][m], int n){
    int *element1 = &tab1[0][0];//top element
    int *endp1    = element1 + n*m;//end element
    int *element2 = &tab2[0][0];
    int *endp2    = element2 + n*m;
    int itis = 0, *p;

    for(;element1 != endp1; ++element1){
        itis = 0;
        for(p = element2; p != endp2; ++p){
            if(*p == *element1){
                itis = 1;//found!
                break;
            }
        }
        if(itis==0)//not found
            return itis;//0
    }
    return itis;//1: all exist
}