#define ALPHABET_SIZE 26 typedef struct lc_trie_node{ bool isEnd; struct lc_trie_node *children[ALPHABET_SIZE]; } LcTrie; LcTrie *LcTrieInit() { LcTrie *lcTrie = malloc(sizeof(LcTrie)); memset(lcTrie, 0, sizeof(lcTrie)); lcTrie->isEnd = false; for (int i = 0; i < ALPHABET_SIZE; ++i) { lcTrie->children[i] = NULL; } return lcTrie; } void LcTrieInsert(LcTrie *obj, const char *word) { LcTrie *objPos = obj; char* pos = word; while (*pos) { int ch = *pos - 'a'; if (objPos->children[ch] == NULL) { objPos->children[ch] = LcTrieInit(); } objPos = objPos->children[ch]; pos ++; } objPos->isEnd = true; } bool LcTrieSearch(LcTrie *obj, const char *word) { LcTrie *objPos = obj; char* pos = word; while (*pos) { int p = *pos - 'a'; if (objPos->children[p] == NULL) { return false; } objPos = objPos->children[p]; pos ++; } return objPos->isEnd; } bool LcTrieStartsWith(LcTrie *obj, char *prefix) { LcTrie *objPos = obj; char* pos = prefix; while (*pos) { int p = *pos - 'a'; if (objPos->children[p] == NULL) { return false; } objPos = objPos->children[p]; pos ++; } return true; } void LcTrieDetroy(LcTrie *obj) { if (obj != NULL) { for (int i = 0; i < ALPHABET_SIZE; ++i) { if (obj->children[i] != NULL) { LcTrieDetroy(obj->children[i]); } } free(obj); } }
04-26
149
09-05