// Returns true if word is in dictionary else false
bool check(const char *word) { //change letters to lowercase
int length = strlen(word); char copy[length + 1]; for (int i = 0; i < length; i++) { copy[i] = tolower(word[i]); } int copy_index = hash(copy); //sed pointer to the head of linked list node *head = table[copy_index]; node *cursor = head; if (head != NULL) { while (cursor != NULL) { if (strcasecmp(copy,cursor -> word) == 0) { return true; } else { cursor = cursor -> next; } } } return false; }
// Hashes word to a number// unsigned int hash(const char *word) { // TODO unsigned long hash = 5381; int c;
while ((c = *word++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ return hash; }
// Loads dictionary into memory, returning true if successful else false bool load(const char *dictionary) {
FILE* source = fopen(dictionary , "r" ); // check the file is not empty if (!source) { fprintf(stderr, "Couldn't open dictionary.\n"); return false; } char WORD[45]; int count = 0; while (fscanf(source, "%s", WORD) != EOF) { struct node *wnode = malloc(sizeof(node)); if (wnode == NULL) { unload(); return false; } strcpy(wnode->word, WORD); unsigned long key = hash(wnode->word); wnode->next = table[key]; table[key] = wnode; // number of words loaded in dictionary count++ ; } return true; }
// Returns number of words in dictionary if loaded else 0 if not yet loaded// unsigned int size(void) { // TODO return 0; }
// Unloads dictionary from memory, returning true if successful else false// bool unload(void) { // TODO for( int i = 0; i < N; i++) { node *head = table[i]; node *cursor = head; if ( cursor != NULL) { node *tmp = cursor; cursor = cursor -> next; free(tmp); } } return false; }