TheAlgorithms-C/data_structures/trie/trie.c
2020-05-29 20:23:24 +00:00

188 lines
4.0 KiB
C

/*------------------Trie Data Structure----------------------------------*/
/*-------------Implimented for search a word in dictionary---------------*/
/*-----character - 97 used for get the character from the ASCII value-----*/
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ALPHABET_SIZE 26
/*--Node in the Trie--*/
typedef struct TrieNode
{
struct TrieNode *children[ALPHABET_SIZE];
char character;
bool isEndOfWord;
} TrieNode;
/*--Create new node--*/
TrieNode *createTrieNode()
{
TrieNode *node;
node = malloc(sizeof(TrieNode));
node->isEndOfWord = false;
int i = 0;
while (i < ALPHABET_SIZE)
{
node->children[i] = NULL;
i++;
}
return node;
}
/*--Insert new word to Trie--*/
void insert(TrieNode *root, char *word)
{
/*----Addition of the word done by recurcively----*/
// Check wheather word character pointer is NULL
if ((strlen(word) - 1) != 0)
{
char character = *word;
if (root->children[character - 97] == NULL)
{
TrieNode *node = NULL;
node = createTrieNode();
node->character = character;
root->children[character - 97] = node;
}
word++;
insert(root->children[character - 97], word);
}
else
{
root->isEndOfWord = true;
}
return;
}
/*--Search a word in the Trie--*/
TrieNode *search(TrieNode *root, char *word)
{
TrieNode *temp;
while (*word != '\0')
{
char character = *word;
if (root->children[character - 97] != NULL)
{
temp = root->children[character - 97];
word++;
root = temp;
}
else
{
printf("No possible words!!\n");
return NULL;
}
}
return root;
}
/*---Print a word in the array--*/
void printArray(char chars[], int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("%c", chars[i]);
}
printf("\n");
}
/*---Return all the related words------*/
void printPathsRecur(TrieNode *node, char prefix[], int filledLen)
{
if (node == NULL)
return;
prefix[filledLen] = node->character;
filledLen++;
if (node->isEndOfWord)
{
printArray(prefix, filledLen);
}
int i;
for (i = 0; i < ALPHABET_SIZE; i++)
{
printPathsRecur(node->children[i], prefix, filledLen);
}
}
/*--Travel through the Trie and return words from it--*/
void traverse(char prefix[], TrieNode *root)
{
TrieNode *temp = NULL;
temp = search(root, prefix);
int j = 0;
while (prefix[j] != '\0')
{
j++;
}
printPathsRecur(temp, prefix, j - 1);
}
/*------Demonstrate purposes uses text file called dictionary -------*/
#define NUMBER_OF_WORDS (354935)
#define INPUT_WORD_SIZE (100)
/*----Get input from the user------*/
char *receiveInput(char *s)
{
scanf("%99s", s);
return s;
}
int main()
{
// Read the file dictionary
int word_count = 0;
char *words[NUMBER_OF_WORDS];
FILE *fp = fopen("dictionary.txt", "r");
if (fp == 0)
{
fprintf(stderr, "Error while opening dictionary file");
exit(1);
}
words[word_count] = malloc(INPUT_WORD_SIZE);
while (fgets(words[word_count], INPUT_WORD_SIZE, fp))
{
word_count++;
words[word_count] = malloc(INPUT_WORD_SIZE);
}
// Push the words in to Trie
TrieNode *root = NULL;
root = createTrieNode();
int i;
for (i = 0; i < NUMBER_OF_WORDS; i++)
{
insert(root, words[i]);
}
while (1)
{
printf("Enter keyword: ");
char str[100];
receiveInput(str);
printf(
"\n==========================================================\n");
printf("\n********************* Possible Words ********************\n");
// Find the word through the Trie
traverse(str, root);
printf(
"\n==========================================================\n");
}
}