从两个数组中打印公共元素

时间:2016-03-05 05:57:46

标签: c data-structures

我试图从两个大小相同的未排序数组中找到共同的元素....

我无法将预期的元素作为输出。我的代码有什么问题。

#include<stdio.h>
#include<stdlib.h>

int f=0, k=0;
int arr[10];
int main()
{
    int *a,*a1,n,i,c;

    printf("enter no of elements in arrays  ");
    scanf("%d", &n);

    a = (int *)malloc(sizeof(int *)*n);
    a1 = (int *)malloc(sizeof(int *)*n);


    printf("enter elements 1st array\n");
    for(i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
    }

    printf("enter elements 2nd array\n");   
    for(i=1; i<=n; i++)
    {
        scanf("%d", &a1[i]);
    }

    commonelefind(a,a1,n);

    if(k == 0)
    {
        printf("there is no common element");
    }
    else
    {
        printf("common elements are");
        while(k!=0)
        {
            printf("%d\n", arr[k]);
            k--;
        }
    } 
}

commonelefind(int *a, int *a1, int n)
{
    int i,j,ele;

    for(i=1;i<=n;i++)
    {
        ele = a[i];
        for(j=1;j<=n;j++)
        {
            if (ele == a1[j])
            {
                k++;
                arr[k] = ele;
            }
        }
    }
    return *arr,k;
}

2 个答案:

答案 0 :(得分:2)

您的计划中存在多个错误。有些人已经被评论者解决了。

在C中,数组索引从0开始。索引的范围用包含下限和独占上限表示。如果您有一个n元素数组,n不是有效索引;它超出了有效范围。最后一个元素的索引是n - 1

这种惯例意味着典型的for lopp看起来像这样:

for (int i = 0; i < n; i++) ...

在条件中看到起始索引为1或小于或等于标志应该让您警惕。 (这种结构不一定是假的,但是当你坚持使用通常的C nmomenclature时,这是不寻常的。)

这也意味着当你向后遍历一个数组并从数组长度n开始时,你必须在使用之前递减索引,因为n本身并不是有效的索引。因此,向后打印arr元素的循环应为:

    while (k != 0) printf("%d\n", arr[--k]);

或者,或许更好:

    while (k-- > 0) printf("%d\n", arr[k]);

(后一个变量可能更好,因为在这里,k`在整个循环体中保持一个有效的索引。这里并不重要,循环体只是一个语句,但更适合较大的循环。 )

将元素附加到数组的逻辑相同:使用旧索引访问元素,然后增加到新长度:

    arr[k++] = a[i];

因为(yadda,yadda)新长度k超出了(当前有效的)数组范围的范围。

在定义之前调用该函数。这意味着编译器doens知道它的签名并从使用的参数派生出一个。这不是一个好习惯。在使用它之前声明一个函数原型:

void commonelefind(int *a, int *a1, int n);

我已经完成了void这个功能,因为你没有真正归还任何东西;结果存储在全局的ariables中。这不是一个好的设计,但它适用于小型程序。您的退货声明:

return *arr, k;

可能不是您想要的:它返回逗号运算符右侧的k。评估*arr,但没有效果。不要在这里归还任何东西。

最后,对打印方式更加细致:字符串末尾应该有一个换行符,以便结果和消息不会一起运行。

这是一个带有硬编码数组的修正变体。如果元素在一个数组中出现多次,它仍会多次考虑元素。 (这使得arr的维度太小,因为在最坏的情况下,两个数组由相同的重复元素组成,你有n*n命中率,但我把它留作练习:

#include <stdio.h>
#include <stdlib.h>

void commonelefind(int *a, int *a1, int n);

int f = 0, k = 0;
int arr[10];

int main()
{
    int a[] = {3, 4, 1, 6, 7, 8, 3, 4, 5};
    int b[] = {2, 4, 6, 8, 10, 12, 14, 16, 18};
    int n = 9;

    commonelefind(a, b, n);

    if (k == 0) {
        printf("there is no common element\n");
    } else {
        printf("common elements are\n");
        while (k-- > 0) {
            printf("%d\n", arr[k]);
        }

    }

    return 0;
}

void commonelefind(int *a, int *b, int n)
{
    int i, j;

    k = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (a[i] == b[j]) {
                arr[k++] = a[i];
            }
        }
    }
}

答案 1 :(得分:1)

您的程序无法编译或运行,因此“无法获得预期的元素”似乎是轻描淡写。让我们修复你的代码,使其编译并在此过程中消除不是一个好主意的全局变量:

#include <stdio.h>
#include <stdlib.h>

/* we can't return two things so the result array length is returned
 via the arguments (unfortunately) */
int *commonelefind(int *array1, int *array2, int source_size, int *result_size)
{
    int i, j;

    /* result array will always be less than or equal to sum of source arrays */
    int *result = (int *)malloc(sizeof(int) * source_size * 2);

    *result_size = 0;

    for (i = 0; i < source_size; i++)
    {
        int element = array1[i];

        for (j = 0; j < source_size; j++)
        { 
            if (element == array2[j])
            { 
                result[*result_size] = element;

                *result_size += 1;
            }
        }
    }

    return result;
 }


int main()
{
    int *a1, *a2, i, n, *common, length;

    printf("enter no of elements in arrays: ");
    scanf("%d", &n);

    a1 = (int *)malloc(sizeof(int) * n);
    a2 = (int *)malloc(sizeof(int) * n);

    printf("enter elements 1st array\n");

    for (i = 0; i < n; i++)
    {
        scanf("%d", &a1[i]);
    }

    printf("enter elements 2nd array\n");   

    for (i = 0; i < n; i++)
    {
        scanf("%d", &a2[i]);
    }

    common = commonelefind(a1, a2, n, &length);

    if (length == 0)
    {
        printf("there is no common element");
    }
    else
    {
        printf("common elements are:\n");

        for (i = 0; i < length; i++)
        {
            printf("%d\n", common[i]);
        }
    }

    free(common);  /* we're obligated to free this when we're finished */

    return 0;
}