Advertisement
rupek1995

Untitled

Apr 2nd, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.38 KB | None | 0 0
  1. /**
  2.  * Inserts new word from dictionary into trie
  3.  */
  4. void insert_word(char *word)
  5. {
  6.     int word_len = strlen(word) + 1, curr_letter;
  7.     trie *traversal = root;
  8.  
  9.     for (int i = 0; i < word_len; i++)
  10.     {
  11.         // convert current letter/apostrophe from ascii alphabet value (96-122) to array-like (0-26) value
  12.         // if uppercase - calculate it for lowercase letter
  13.         if (word[i] < 96)
  14.             curr_letter = tolower(word[i]) % 97;
  15.         else
  16.             curr_letter = word[i] % 97;
  17.  
  18.         // if next letter node is empty - malloc it
  19.         if (traversal->children[curr_letter] == NULL)
  20.         {
  21.             traversal->children[curr_letter] = malloc(sizeof(trie));
  22.         }
  23.  
  24.         // travel to next letter in trie until end of word
  25.         if (word[i] != '\0')
  26.             traversal = traversal->children[curr_letter];
  27.     }
  28.  
  29.     traversal->is_word = true;
  30. }
  31.  
  32. /**
  33.  * Returns true if word is in dictionary else false.
  34.  */
  35. bool check(const char *word)
  36. {
  37.     // variable for iterating through every letter of word, and a traversal pointer
  38.     int word_len = strlen(word), curr_letter;
  39.     trie *traversal = root;
  40.  
  41.     // go through every letter node for word until an empty node
  42.     for (int i = 0; i < word_len; i++)
  43.     {
  44.         // current letter index in trie array, if uppercase - calculate it for lowercase letter
  45.         if (word[i] < 96)
  46.             curr_letter = tolower(word[i]) % 97;
  47.         else
  48.             curr_letter = word[i] % 97;
  49.  
  50.         // if next letter's node is null - word is misspelled, else go to next node
  51.         if (traversal->children[curr_letter] == NULL)
  52.             return false;
  53.         else
  54.             traversal = traversal->children[curr_letter];
  55.     }
  56.  
  57.     if (traversal->is_word)
  58.         return true;
  59.     else
  60.         return false;
  61. }
  62.  
  63. /**
  64.  * Count total words in trie
  65.  */
  66. int count_words_trie(trie *curr_trie)
  67. {
  68.     trie *traversal = curr_trie;
  69.  
  70.     // search parent for non-null node
  71.     for (int i = 0; i < ALPHABET_LENGTH; ++i)
  72.     {
  73.         // if found - search children for non-null node
  74.         if (traversal->children[i] != NULL)
  75.             count_words_trie(traversal->children[i]);
  76.     }
  77.  
  78.     if (traversal->is_word == true)
  79.         word_count++;
  80.  
  81.     return word_count;
  82. }
  83.  
  84.  
  85. bool destroy_trie(trie *curr_trie)
  86. {
  87.     bool success = false;
  88.     trie *traversal = curr_trie;
  89.  
  90.     // search parent for non-null node
  91.     for (int i = 0; i < ALPHABET_LENGTH; ++i)
  92.     {
  93.         // if found - search children for non-null node
  94.         if (traversal->children[i] != NULL)
  95.             destroy_trie(traversal->children[i]);
  96.     }
  97.  
  98.     free(traversal);
  99.     success = true;
  100.     return success;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement