我正在执行CS50的PSET4,基本上需要您创建26个节点(每个字母的每个字母的每个节点(,并在这些节点中创建一个链接的列表来连接字典中的单词。
因此,例如,节点0将存储以a开头的字典中的每个单词,节点1 wills存储以b开始的词典的每个单词,等等。
...所以,这是代码的主要部分:
// Insert words into hash table
while (fscanf(file, "%s", word) != EOF)
{
// for every word, we allocate enough memory for a node, that will carry the word
node *new_node = malloc(sizeof(node));
if(new_node == NULL) { printf("could not allocate memory.n"); return false; }
strcpy(new_node->word, word);
new_node->next = NULL;
if(!hashtable[alphabetPosition(word[0])]){
hashtable[alphabetPosition(word[0])] = new_node;
}
else
{
for(node *ptr = hashtable[alphabetPosition(word[0])]; ptr != NULL; ptr = ptr->next){
hashtable[alphabetPosition(word[0])]->next = new_node;
}
}
}
alphabetPosition((基本上是一个函数,它将返回单词的第一个字符。
主要问题是:
else
{
for(node *ptr = hashtable[alphabetPosition(word[0])]; ptr != NULL; ptr = ptr->next){
hashtable[alphabetPosition(word[0])]->next = new_node;
}
}
因为其他事情都在起作用。创建了节点,但链接列表却没有。
我很确定这件代码有问题,但我似乎无法理解。如果有人可以帮助我(解释如何解决(,它将对我有很大帮助。
谢谢!
主要缺陷是: hashtable[index]
仅,并且总是指向创建的最后一个节点。IE。hashtable[alphabetPosition(word[0])]->next
始终设置为new_node
。
for
循环基本上是错误的。该程序只需要将new_node
指向列表的当前头(即hashtable[alphabetPosition(word[0])
,然后使New_Node成为新头。