使用C实现哈希表

时间:2015-01-14 16:53:52

标签: c arrays string file hashtable

我正在尝试读取名称文件,并根据其字母值将这些名称散列到某个位置。我已成功获取文件中每个名称的值,但我在创建哈希表时遇到问题。我可以只使用常规数组并编写一个函数来将单词放在其值的索引处吗?

while (fgets(name,100, ptr_file)!=NULL) //while file isn't empty
            {
            fscanf(ptr_file, "%s", &name); //get the first name
            printf("%s ",name); //prints the name
            int length = strlen(name); // gets the length of the name
            int i;
            for (i =0; i <length; i++) 
            //for the length of the string add each letter's value up
                {
                value = value + name [i];
                value=value%50;
                }
            printf("value= %1d\n", value);
            }

3 个答案:

答案 0 :(得分:0)

不,你不能,因为你会有碰撞,因此你必须考虑到一个哈希的多个值。通常,您的散列并不是一个明智的实现 - 为什么要将值的范围限制为50?内存真的很稀疏,所以你不能拥有比50个指针更大的字典吗?

我建议使用现有的C字符串哈希表实现,例如2001年的this one

答案 1 :(得分:0)

通常,您将遇到哈希冲突,您需要找到一种方法来处理它。处理这种情况的两种主要方式如下:

  1. 如果采用哈希表条目,则使用下一个条目,并迭代直到找到空条目。在查找时,您需要做同样的事情。这对于向哈希表添加内容非常简单,但却使删除操作变得棘手。

  2. 使用哈希桶。每个散列表条目是具有相同散列值的条目的链接列表。首先找到您的哈希桶,然后在列表中找到该条目。添加新条目时,只需将其添加到列表中即可。

答案 2 :(得分:0)

这是我的演示程序,它从stdin读取字符串(单词),和 存入哈希表。此后(在EOF处),迭代哈希表,并计算单词数量,不同单词,并打印最频繁的单词:

http://olegh.cc.st/src/words.c.txt

在哈希表中,使用了双哈希算法。