C语言中的散列结构

C语言中的散列结构,c,pointers,hash,struct,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 si

所以我尝试实现一个哈希表,它将哈希包含单词的结构

结构与此类似:

#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;
};
假设不存在冲突,因为要散列的每个单词都是不同的

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

任何帮助都将不胜感激


谢谢。

我没有对代码进行详细阅读,但是第一件非常明显的事情是哈希表的大小,
100
。最好使用a来帮助避免冲突。

您似乎对分号有问题:

struct node_
{
    char * word;
    struct node * next;
}   /* <<-- HERE */
typedef struct node_ * node;
struct节点_
{
字符*字;
结构节点*下一步;

}/*这会更好吗?哦,我甚至不知道它的存在。。。谢谢你让我知道!你不能仅仅因为每个词都不一样就认为不可能有冲突。散列函数可以为多个不同的输入生成相同的输出。此外,如果假设没有冲突,那么为什么要将节点结构与下一个指针一起使用?如果不考虑冲突,您可以使用char*数组。这是实现LRU缓存的大型项目的一部分。。。基本上,我们得到一个.txt文件作为输入,我们需要标记该文件,并使用优于O(n^2)的时间搜索该文件(因此基本上,线性搜索是不可能的,我们被鼓励使用哈希表)。LRU缓存将包含令牌,并且将是动态的:也就是说,用户指定自己的缓存大小。这是一个神奇的数字,出现在几个地方。@FredLarson:难怪它如此迅速地脱颖而出:)--gfppaste,一定要用变量或
#define
替换硬编码的
100
,因此,您可以在将来更轻松地更改表的大小。我认为在这种情况下,素数的性能并不一定更好。如果有足够的分散度(在《不是城里最好的》中提到的K&R散列,但对于长度合理的字符串就可以了),模100的性能不会比模101差太多。而且,考虑到显然没有输入冲突的可能性,这其实并不重要。:)
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 */