c - 打印两个数组中的公共(public)元素

标签 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;
}

最佳答案

您的程序中存在多个错误。评论者已经解决了一些问题。

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

这个约定意味着典型的 for lopp 看起来像这样:

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

看到起始索引为 1 或条件中的小于或等于符号应该让您警惕。 (这样的构造不一定是假的,但是当你坚持通常的 C 命名法时,它们是不寻常的。)

这也意味着当你向后遍历一个数组并从数组长度 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 超出了(当前有效的)数组范围的范围。

您先调用该函数,然后再定义它。这意味着编译器确实#T 知道它的签名并从使用的参数中派生出一个。这不是一个好的做法。在使用之前声明一个函数原型(prototype):

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

我已经将函数设置为 void,因为您实际上并没有返回任何东西;结果存储在全局变量中。这不是一个好的设计,但它适用于小程序。您的返回声明:

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

关于c - 打印两个数组中的公共(public)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35810676/

相关文章:

algorithm - 最优二叉搜索树仅针对特定顺序的键和频率对是最优的?

c - 为什么我除法时会跳过数字?

c - char * 和 char[] 的区别

c - 为什么这个 printf 语句或缺少该语句会改变 for 循环的效果?

java - 如何在android studio中将堆栈从一个 Activity 传递到另一个 Activity

c# - 何时在 C# 中使用 Stack<T> 集合?

c++ - 需要慢速插入链表多线程吗?

c - 自定义 Windows 身份验证包的实现 - LsaApUserLogonEx

javascript - javascript中树的广度优先遍历

data-structures - 反转查询区间内点的颜色