我试图从两个大小相同的未排序数组中找到共同的元素....
我无法将预期的元素作为输出。我的代码有什么问题。
#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;
}
答案 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;
}