我对旧的家庭作业有一些疑问。我希望我能得到一些这方面的帮助。我应该做的是从.txt文件中读取,并将该文本文件中的单词插入到链表的数组中,然后散列每个单词并打印输出,以及它有多少次碰撞。 到目前为止,我要做的是从文本文件中读取并将其插入到链表中,但我不知道如何使用键来编写散列函数来散列单词。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Hash {
int collisions = 0;
struct HashWords
{
string words;
struct HashWords* next;
};
HashWords* head;
public:
Hash() :collisions(0){ head = NULL; }
void Load_Dictionary();
void appendNode(string);
};
void Hash::Load_Dictionary() {
string words;
fstream in("dictionary.txt", ios::in);
while (in >> words)
{
cout << "Word: " << words << endl;
appendNode(words);
}
in.close();
}
void Hash::appendNode(string word)
{
HashWords* newNode, *nodePtr;
newNode = new HashWords;
newNode->words = word;
newNode->next = NULL;
if (!head)
head = newNode;
else
{
nodePtr = head;
while (nodePtr->next)
nodePtr = nodePtr->next;
nodePtr->next = newNode;
}
}
int main()
{
Hash dictionary;
dictionary.Load_Dictionary();
system("pause");
return 0;
}
从.txt文件加载单词并插入链表后,会显示:
接下来我需要做的是创建一个键和散列函数来散列这些单词并打印结果,以及它有多少碰撞。这就是我被困住的地方。
答案 0 :(得分:0)
看起来你错过了几点。
您应该拥有一系列链接列表,而不仅仅是一个链接列表
也就是说,每个数组元素都是一个链表
(编写单独的链表类别或使用std::list
是一个好主意。)
这个列表数组是你的哈希表。
您要存储的字是关键字 您使用哈希函数来计算哪个&#34;桶&#34; (数组索引)这个词属于。
每个存储桶的冲突数是该存储桶中列表的长度。