H中的哈希结构

时间:2011-11-17 22:48:15

标签: c pointers hash struct

所以我试图实现一个散列表来散列包含单词的结构。

结构与此类似:

#ifndef HASHTABLE_H
#def HASHTABLE_H

typedef int (*HashFunctionT) (char* string, int upperbound);

struct node_
{
    char * word;
    struct node * next;
}
typedef struct node_ * node;

struct nodehash_
{
    int size;
    struct node * hash[100];
}
typedef struct nodehash_ * nodehash;

Hashtable createHashTable();
void addtohash(node list, nodehash hash);
#endif

我希望哈希函数能够像这样工作:

#include "hashtable.h"

int hashFunction(char *word, int hashTableSize)
{
    int length = strlen(word);
    int h = 0;
    int i;  
    for(i = 0; i<length; i++)
    {
        h=31 *h  + word[i];
    }
    return h % hashTableSize;
};

nodehash createHashtable()
{
    nodehash hashtable;    
    hashtable = malloc(sizeof(struct nodehash_));

    hashtable->size = 100;
    hashtable->hash = malloc(100 * sizeof (node));
    int i;   
    for (i = 0; i < hashtable->size; i++)
    {
            hashtable->table[i] = NULL;
    }
    return hashtable;
};

void addtohash(node list, nodehash hashtable)
{
    int nodehashnumber;
    nodehashnumber = hashfunction(list->word, hash->size);
    hashtable->hash[nodehasnumber] = list;
};

主函数看起来像这样(假设节点结构的链表已经创建并填充)。

int main()
{
    nodehash hashtable = createhashtable();
    node nodelist;
    /* here the nodelist would be created and filled and such and such*/
    while (nodelist->next != NULL)
    {
        addtohash(nodelist, hashtable);
    }
    return;
}

假设不存在碰撞,因为要散列的每个单词都会有所不同。

基本上,我想知道我是否错过了,明显的错误或逻辑上的缺陷。

非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:3)

我没有给代码一个广泛的阅读,但第一个非常突出的是散列表大小,100。最好使用prime number for the size of your hash tables来帮助避免碰撞。

答案 1 :(得分:0)

您似乎遇到分号问题:

struct node_
{
    char * word;
    struct node * next;
}   /* <<-- HERE */
typedef struct node_ * node;

但是::

int hashFunction(char *word, int hashTableSize)
{
    int length = strlen(word);
    int h = 0;
    int i;  
    for(i = 0; i<length; i++)
    {
        h=31 *h  + word[i];
    }
    return h % hashTableSize;
}; /* <<-- NOT here */

另外,明智的建议是IMHO尽可能多地使用无符号类型:对于散列值(模数除法对负操作数做什么?)以及大小和索引。

经验法则:如果它不能为负数:它是未签名的