#define SIZE 50
typedef struct{
int key;
int value;
}HASH_TABLE;
HASH_TABLE* hashArray[SIZE];
int hashCode(int key) {
return key % SIZE;
}
bool containsDuplicate(int* nums, int numsSize){
int count = 1,i=0;
HASH_TABLE* data = (HASH_TABLE*)malloc(sizeof(HASH_TABLE*));
data->value = count;
for(i=0;i<numsSize;i++)
{
int hashIndex = hashCode(nums[i]);
hashArray[hashIndex]->key = nums[i];
hashArray[hashIndex]->value = data->value;
++hashIndex;
hashIndex %= SIZE;
if(hashArray[hashIndex]->key == nums[i])
{
data->value++;
}
}
if(data->value>0)
return true;
return false;
}
我正在尝试使用 C 中的哈希表算法编写代码来查找重复项。
代码应按以下方式工作
给定一个整数数组,查找该数组是否包含任何重复项。
如果任何值在数组中至少出现两次,则函数应返回 true;如果每个元素都不同,则函数应返回 false。
示例1:
输入:[1,2,3,1] 输出:真 示例2:
输入:[1,2,3,4] 输出:假 示例3:
输入:[1,1,1,3,3,4,3,2,4,2] 输出:true
请帮助我解决我的错误
谢谢
最佳答案
您的代码中有几个错误:
- 您为表中的每个哈希条目仅指定了一个值的空间。这意味着您仅通过哈希值而不是整数值来比较数字。假设您输入
1
然后你就有51
。当您计算模50
的余数时,两者具有相同的哈希值。作为哈希值,因此它们将进入同一个表条目(索引为1
的条目),这是第二个条目。当你读到号码51
,您更改字段data
中的值至51
,并且,如果稍后,到达另一个1
,你最终会失去它作为第一个1
你以前有过,当你添加51
时就飞出去了数字。哈希表允许您获得更快的访问速度,但是您必须存储您可以拥有的所有键,无论它们具有哈希值如何。因此,每个表条目必须支持哈希值均为 x 的条目列表,并且该列表必须包含共享相同哈希值的所有条目,并比较各个键以查看哪个是您正在比较的键。 - 您应该使用
malloc(sizeof *data)
或malloc(sizeof(HASHTABLE))
,比你所做的更好。在代码中,您分配字节来保存指针(您指定指针的大小,而不是记录的大小)。sizeof *data
是指向数据的大小(是的,你可以在sizeof
运算符之后使用它,即使它还没有被分配,编译器对指向的值不感兴趣,只对它的数据大小感兴趣)里> - 从不,从不,从
malloc(3)
返回的值进行转换。这不是你想要的。它让您忘记#include <stdlib.h>
(其中给出了malloc(3)
的正确原型(prototype)),因此,隐藏更多错误,这比您想要避免的错误要危险得多。 Malloc 始终返回一个指针,但如果您不使用原型(prototype)(如果您将返回的值转换为#include <stdlib.h>
,则会发生这种情况,编译器将假设malloc()
返回int
(这不是真的) )并会生成代码将返回的值转换为指向HASH_TABLE
的指针,这将在最好的情况下丢弃malloc()
返回的数据。在 64 位架构中,指针是 64 位,而整数只有 32 位。此架构中 malloc 返回的值是 64 位宽...编译器将生成代码来转换(未定义行为)32 位数据的 32 位,并将其(以未定义行为扩展)该数据转换为 64 位,并使具有该数据(未定义行为)的指针。当您尝试将指针用于除打印其值之外的任何其他用途时,您很可能会收到段错误和程序崩溃。 - 如果你使用这么简单的哈希函数,那么你最好使用质数作为哈希表中的元素数量,这样你就不会得到一些条目挤满了数据,而另一些条目却是空的。使用质数可以更好地分配数字(尽管最好选择更好的哈希表函数)
关于c - 第 25 行中的运行时错误 : Char 35: runtime error: member access within null pointer of type 'struct HASH_TABLE' (solution. c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60119681/