我的任务是实现一个程序,将字典编入数据结构,然后拼写检查它。我已经设法用一个简单的链表来完成它,但是当我尝试使用哈希表时,我得到了错误的结果。我找到了许多拼写错误的单词我不知道什么是错的。
typedef struct node
{
char word[LENGTH+1];
struct node *next;
}
node;
node *hashtable[150000] = {NULL};
检查功能:
int i = hash(word);
node *cursor = hashtable[i];
while(cursor!=NULL)
{
if(strcasecmp(cursor->word, word) == 0)
{
return true;
}
else
{
cursor = cursor->next;
}
}
return false;
我尝试在NULL旁边设置w->并且它完全没有区别。所以我摆脱了它。
加载到哈希表
// open dictionary file and ensure it worked
FILE *d = fopen(dictionary, "r");
if(d==NULL)
{
printf("File wont open");
return false;
};
// initiate loop for putting all words into array, untile the end of dictionary.
while(fscanf(d, "%s", word) != EOF)
{
//create a new node and ensure it worked
node *w = malloc(sizeof(node));
if(w ==NULL)
{
unload();
return false;
}
//coppy word from dictionary to node. w->word is a pointer to char in a node created above.
strcpy(w->word, word);
//get hash code and stor in i.
long i = hash(word);
//place the node in hashtable in correct place.
if(hashtable[i]->next==NULL)
{
hashtable[i]->next = w;
}
else
{
w->next = hashtable[i]->next;
hashtable[i]->next = w;
}
}
fclose(d);
return true;
和一个哈希函数:
long hash = 0;
for (int counter = 0; str[counter]!='\0'; counter++)
{
hash = (str[counter] + (hash << 6) + (hash << 16) - hash)%150000;//150000=size of hashtable
}
return hash;
答案 0 :(得分:0)
事实证明,检查函数中的strcasecmp区分大小写。 根据{{3}},它不应该是。
在我要手动将所有字符更改为要检查的单词中的小写字母后,一切正常。