I am building my load() function and I'm wondering if I'm building it so that it is indeed storing the dictionary words correctly.
I tried printing both:
printf("%s\n", new_node->word); //to see if I'm reading all words
printf("%s\n", hashtable[index]->word); //to see if the head of each linked list is correct.
For printf("%s\n", hashtable[index]->word);
I was assuming that it might print out just 26 words [the first letter of each list a...z] but rather it printed out many words.
I know I'm still struggling to fully grasp how to populate the dictionary.
Any feedback on the below code would be helpful and any insights into how to check if a hashtable is correct [ie. how can I print out or test the structure to know it's correct]?
// Loads dictionary into memory, returning true if successful, false if not
bool load(const char *dictionary)
{
//open dictionary file
FILE *inptr = fopen(dictionary, "r");
//declare temp array for word
char word[LENGTH + 1];
//read each word in dictionary til end of file
//for every line we read in dictionary
//we call it "word" and read it until as line
while (fscanf(inptr, "%s ", word) != EOF)
{
//create a node and allocate memory for each word
node *new_node = malloc(sizeof(node));
// memset(new_node, 0, sizeof(node));
//if empty...
if (new_node == NULL)
{
//speller quits
unload();
return false;
}
//hash function provides location of word
int index = hash(word);
//if this is the start of table
if(hashtable[index] == NULL)
{
head = malloc(sizeof(node));
if(head == NULL)
{
printf("null head!");
unload();
exit (1);
}
//add word into node...
strcpy(head->word ,word);
head->next = NULL;
//tell head what word it represents
hashtable[index] = head;
}
else
{
//https://cs50.stackexchange.com/questions/34928/check-function-in-speller-pset5-not-quite-understanding-the-apostrophe/34931#34931
//copy each word from dictionary into node
strcpy(new_node->word, word);
//test if built correctly
//printf("%s\n", new_node->word);
//declare hashed index of word
index = hash(word);
//thinking of hashtable[index] as head
//switch it to new node
hashtable[index] = new_node;
//is hashtable the first of the letter?
//printf("%s\n", hashtable[index]->word);
//make the next point to null
new_node->next = NULL;
//increment counter for each word in dictionary to return in SIZE
word_count++;
}
}
//close dictionary file
fclose(inptr);
return true;
}
NOTE: so far my check() function, which I'm still working on, prints out every word as mispelled, so I believe there an error in load(). And I was aiming to follow advice from this excellent response from another user.
Thanks!