CS50 Pset 5哈希表问题

时间:2020-06-14 04:53:49

标签: hashtable cs50

创建哈希表并将每个字母分配给该表的值后,我注意到该表输出的第一个单词对于每个链接列表的开头都是同一个单词。尽管我试图将它们分开,但似乎以某种方式我正在将整个字典转移到表中的每个数组。任何协助都会很棒!预先感谢

// Implements a dictionary's functionality

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "dictionary.h"

// Represents a node in a hash table
typedef struct node
{
    char *word;
    struct node *next;
}
node;

// Number of buckets in hash table
const unsigned int N = 25;

// Hash table
node *table[N];

char lowerword[LENGTH+1];
// Returns true if word is in dictionary else false
bool check(const char *word)
{
    int bucketfind = 0;
    int x = 0;
    for (int b = word[x]; b != '\0';b = word[x], x++)
    {
        int lowertemp = tolower(word[x]);
        if (x == 0)
        {
            bucketfind = lowertemp - 97;
        }
        char lowerfinal = lowertemp;
        lowerword[x] = lowerfinal;

        //printf("%c", lowerword[x]);
    }
    int wordlen = x + 1;
    int pr = 0;
    while (table[bucketfind] -> next != NULL)
    {
        int dwlen = strlen(table[bucketfind]-> word);
        pr++;
        //printf("%i, %i, %s, %i\n", pr, dwlen, table[bucketfind] -> word, bucketfind);
    }
    //TODO
    return false;
}

// Hashes word to a number
unsigned int hash(const char *word)
{
    int asciifirst = word[0];
    int lowerfirst = tolower(asciifirst);
    int bucketnum = lowerfirst - 97;
    return bucketnum;
}

// Loads dictionary into memory, returning true if successful else false
int dictwords = 0;
//char *cword = (char*)malloc(sizeof(char)*46);
bool load(const char *dictionary)
{
    char *cword = malloc(sizeof(char)*46);
    FILE *dict = fopen(dictionary, "r");
    if (dictionary == NULL)
    {
        return false;
    }
    int x = 0;
    while ((fscanf(dict, "%s", cword) != EOF))
    {
        node *nword = malloc(sizeof(node));
        nword -> word = cword;
        nword -> next = NULL;

        int bucket = hash(cword);
        //printf("%i\n", bucket);
        if (table[bucket] != NULL)
        {
            nword -> next = table[bucket];
            table[bucket] = nword;
        }
        else
        {
            table[bucket]= nword;
        }
        dictwords++;
    }
    fclose(dict);
return true;
}

// Returns number of words in dictionary if loaded else 0 if not yet loaded
unsigned int size(void)
{
    return dictwords;
}

// Unloads dictionary from memory, returning true if successful else false
bool unload(void)
{
    // TODO
    return false;
}

1 个答案:

答案 0 :(得分:0)

这不仅是第一个单词;链接列表中的每个单词都是相同的单词(最后一个被读取)。 cword在此处char *cword = malloc(sizeof(char)*46);的特定地址获取46字节的内存。字典中的每个单词都被读入相同的地址。