我编译了一个代码来检查一维数组中的重复项,我唯一的问题是它会显示一个副本,而不是其他副本。我已经包含了我的代码。我是一个新手,我努力做到这一点。
这是我的代码:
#include <stdio.h>
#include <malloc.h>
void duplicate(int array[], int num)
{
int *count = (int *)calloc(sizeof(int), (num - 2));
int i;
printf(" The duplicate integers in this array are: ");
for (i = 0; i < num; i++)
{
if (count[array[i]] == 1)
printf(" %d ", array[i]);
else
count[array[i]]++;
}
}
int main()
{
int array[] = {7, 77, 42, 2, 1, 4, 2, 7, 42};
int array_freq = sizeof(array) / sizeof(array[0]);
duplicate(array, array_freq);
getchar();
return 0;
}
答案 0 :(得分:0)
你方式超出count
数组的范围,执行count[array[i]]
意味着您使用e,g,array[1]
作为索引count
数组,array[1]
为77
,这意味着您使用77
作为count
的索引,只有7个条目。
这当然会导致undefined behavior。
答案 1 :(得分:0)
除了@JoachimPileborg在他的回答中指出的关于访问count
越界的问题之外,我认为你没有正确的逻辑来检查重复项。
让我们从array
,7
的第一个元素开始。
检查以后是否找到7
。找到后,打印重复项。
然后请注意您已检查7
的重复项。在迭代7
时遇到array
时,您不必再次检查7
的重复项。
void duplicate(int array[], int num)
{
int i;
int j;
int* status = calloc(sizeof(int), num);
printf(" The duplicate integers in this array are: ");
for (i = 0; i < num; i++)
{
if ( status[i] == 1 )
{
// Already visited and marked as duplicate
// Go on to the next item.
continue;
}
for ( j = i+1; j < num; ++j )
{
if (array[i] == array[j])
{
// Note that array[j] has already been visited and
// marked as a duplicate.
status[j] = 1;
// If array[i] is not already printed, print it and
// mark it as a duplicate.
if ( status[i] == 0 )
{
printf(" %d ", array[i]);
status[i] = 1;
}
}
}
}
printf("\n");
// Make sure to deallocate the memory before returning from
// the function.
free(status);
}