我正在尝试将一个项目添加到我的Hashtable中,我已经使用了很多 printf是为了看看发生了什么,但看起来应该添加它,但实际上并非如此。
所以这是我的代码:
struct hashnode_s {
char *key;
ValueType tag;
union
{
int IntegerValue;
char *StringValue;
}u;
struct hashnode_s *next;
};
我正在尝试模仿GCC编译器。 用我的哈希表
typedef struct hashtbl {
hash_size size;
struct hashnode_s **nodes;
hash_size (*hashfunc)(const char *);
} HASHTBL;
和我的插入方法
int hashtbl_InsertString(HASHTBL *hashtbl, const char *key, const char *value)
{
struct hashnode_s *node;
hash_size hash;
hash = SearchForHashIndex(hashtbl, key, value);
if(hash ==-1)
{
hash=hashtbl->hashfunc(key);
}
fprintf(stderr, "hashtbl_insert() key=%s, hash=%d\n\n\n", key, hash);
node=hashtbl->nodes[hash];
while(node)
{
printf("In while\n\n\n\n\n");
/* This Code isn't correct
if(!strcmp(node->key, key)) {
node->data=data;
return 0;
}*/
node=node->next;
}
if(!(node=malloc(sizeof(struct hashnode_s)))) return -1;
if(!(node->key=mystrdup(key))) {
free(node);
return -1;
}
node->key = key;
node->tag = StringConst;
node->u.StringValue = value;
node->next=hashtbl->nodes[hash];
printf("ADDING HASH NODE \n\n\n");
hashtbl->nodes[hash]=node;
return 0;
}
我继续在搜索方法时获取空值。不应该是这种情况。我是否正确插入?
int SearchForHashIndex(HASHTBL *hashtbl, const char *key, const char *value)
{
printf("INSIDE SEARCH FOR HASH INDEX \n\n\n\n\n");
int i;
for(i=0; i < CurrentHashSize; i++)
{
struct hashnode_s *node;
node = hashtbl->nodes[i];
printf("%d\n",i);
if(node == NULL)
{
printf("NULL");
}
while(node)
{
if(strcmp(node->key,key) || strcmp(node->u.StringValue,value))
{
printf("INSIDE HERE!\n");
return i;
printf("returning %d\n",i);
}
node = node->next;
}
}
printf("returning -1\n");
return -1;
}
答案 0 :(得分:4)
这看起来不对:
if(!(node->key=mystrdup(key))) {
free(node);
return -1;
}
node->key = key;
您正在将node->key
设置为(显然)提供的key
的副本;然后你立即用函数参数覆盖那个指针,这不太可能是正确的。
答案 1 :(得分:1)
strcmp()在成功进行比较时返回0。您需要在搜索功能中更改if()条件。
此外,插入例程中的这个块:
node=hashtbl->nodes[hash];
while(node)
{
printf("In while\n\n\n\n\n");
/* This Code isn't correct
if(!strcmp(node->key, key)) {
node->data=data;
return 0;
}*/
node=node->next;
}
没用,因为你之后直接将新分配的内存分配给节点。
答案 2 :(得分:0)
如果你的哈希函数是可靠的(并且它必须是一个哈希函数),你的搜索函数不应该迭代所有的链表。您不应该需要那个外部for
循环 - 只需将i
设置为hashtabl->hashfunc(key)
并在该列表中搜索该元素。如果它不在该列表中,它不应该在任何列表中,如果是,那么你的插入功能肯定是错误的。
实际上,您的搜索功能应返回hashtabl->hashfunc(key)
或-1。
此外,如果有人对不同的对象使用相同的密钥会发生什么?