diff options
author | Fudgerboy <91767657+Fudgerboy@users.noreply.github.com> | 2024-04-29 03:04:02 +0000 |
---|---|---|
committer | Fudgerboy <91767657+Fudgerboy@users.noreply.github.com> | 2024-04-29 03:04:02 +0000 |
commit | 972c8907013125ac88eddf5e81f08024ee8f2806 (patch) | |
tree | eca3611e5df98049261c99cf16663a3d735da6e5 /wk5/pset/speller/test.c | |
parent | 52f306460bf9e45bb8b4535a4bde824c0f4e5097 (diff) |
Sun, Apr 28, 2024, 8:04 PM -07:00
Diffstat (limited to 'wk5/pset/speller/test.c')
-rw-r--r-- | wk5/pset/speller/test.c | 136 |
1 files changed, 130 insertions, 6 deletions
diff --git a/wk5/pset/speller/test.c b/wk5/pset/speller/test.c index bc5055f..7e5cc61 100644 --- a/wk5/pset/speller/test.c +++ b/wk5/pset/speller/test.c @@ -1,20 +1,144 @@ -#include <cs50.h> +// Implements a dictionary's functionality + #include <ctype.h> -#include <stdint.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <math.h> +#include "dictionary.h" + +// Represents a node in a hash table +typedef struct node +{ + char word[LENGTH + 1]; + struct node *next; +} node; + +// TODO: Choose number of buckets in hash table +const unsigned int N = 26; + +// Hash table +node *table[N]; + +// Size integer +int siz = 0; + +// Returns true if word is in dictionary, else false +bool check(const char *word) +{ + // hash word to find bucket + int val = hash(word); + node *current = table[val]; + + // check all nodes in the bucket + while (current != NULL) + { + // check if this is the word + if (strcmp(current->word, word) == 0) + { + return true; + } + current = current->next; + } + + return false; +} // Hashes word to a number -int main(void) +unsigned int hash(const char *word) { - char *word = "scatter"; // (sum of (letter - 'A') % 26) of a word to get a value of where to store it in the hash table int val = 0; for (int i = 0; word[i] != '\0'; i++) { val += toupper(word[i]) - 'A'; } - printf("%i\n", val %= 26); + return val %= 26; +} + +// Loads dictionary into memory, returning true if successful, else false +bool load(const char *dictionary) +{ + // initialize the table + for (int i = 0; i < N; i++) { + // malloc size of next + table[i] = NULL; + } + + // Open dictionary file + FILE *source = fopen(dictionary, "r"); + if (source == NULL) + { + return false; + } + + //read each word in dictionary + char word[LENGTH + 1]; + // use fscanf(file, "%s", word) to grab words + // check for ended file + while(fscanf(source, "%s", word) == 1) + { + // update size int + siz++; + // create new node + // use malloc + node *ptr = malloc(sizeof(node)); + // check if return is NULL + if (ptr == NULL) + { + fclose(source); + return false; + } + // copy word from fscanf into node using strcpy + strcpy(ptr->word, word); + // set the new ptr + ptr->next = NULL; + // hash the word to find the bucket it goes in + int val = hash(ptr->word); + // put new node at begining of bucket + if (table[val] == NULL) + { + // if empty put it there + table[val] = ptr; + } + else + { + // if not empty move the current first one down, + // then put the new one there + ptr->next = table[val]; + table[val] = ptr; + } + + } + + // Close the dictionary file + fclose(source); + return true; +} + +// Returns number of words in dictionary if loaded, else 0 if not yet loaded +unsigned int size(void) +{ + return siz; +} + +// Unloads dictionary from memory, returning true if successful, else false +bool unload(void) +{ + // for every bucket + for (int i = 0; i < N; i++) + { + // while there's more in the bucket + node *current = table[i]; + while (current != NULL) + { + // record position of this node + node *this = current; + // record position of next node + current = current->next; + // free this node + free(this); + } + } + return true; } |