CS50 pset5哈希表检查问题

时间:2017-02-21 13:33:41

标签: c cs50

我的任务是实现一个程序,将字典编入数据结构,然后拼写检查它。我已经设法用一个简单的链表来完成它,但是当我尝试使用哈希表时,我得到了错误的结果。我找到了许多拼写错误的单词我不知道什么是错的。

 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;

1 个答案:

答案 0 :(得分:0)

事实证明,检查函数中的strcasecmp区分大小写。 根据{{​​3}},它不应该是。

在我要手动将所有字符更改为要检查的单词中的小写字母后,一切正常。