// Returns true if key presents in trie, else false bool search(struct TrieNode **root, const char *key, int idx) { int level; int length = strlen(key); int index; struct TrieNode *pCrawl = *root; // pi(idx); for (level = 0; level < length; level++) { str_new(ch); str_insert_char(ch, key[level]); if (ch.type & STR_TYPE_DIGIT) index = INT_TO_INDEX(key[level]); else if (ch.type & STR_TYPE_ALPHABETIC) index = CHAR_TO_INDEX(key[level]); str_free(ch) if (!pCrawl->children[index]) { index = CHAR_TO_INDEX('x'); if (!pCrawl->children[index]) return false; } pCrawl = pCrawl->children[index]; // pp(pCrawl->next); if (pCrawl->next) { // pi(pCrawl->next->idx) // pp(*root) *root = pCrawl->next; // pp(*root) // bool result = search(pCrawl->next, key, idx); // pb(result); } } // pi(pCrawl->count) bool final_match = false; for (int i = 0; i < pCrawl->count; i++) { // pi(pCrawl->idx[i]) if (pCrawl->idx[i] == idx) final_match = true; } // pb(final_match) return (pCrawl != NULL && pCrawl->isEndOfWord && final_match); } // Returns true if key presents in trie, else false bool search_segmented(struct TrieNode *root, struct TrieNode *segments, const char *key) { int level; int length = strlen(key); int index; struct TrieNode *pCrawl = root; str_new(segment); int idx = 0; for (level = 0; level < length; level++) { str_insert_char(segment, key[level]); ps(segment.string); // pp(segments) bool result1 = search(&segments, segment.string, idx); // pp(segments) pi(idx) pb(result1); if (result1) { str_reset(segment); idx++; } pi(idx) str_new(ch); str_insert_char(ch, key[level]); if (ch.type & STR_TYPE_DIGIT) index = INT_TO_INDEX(key[level]); else if (ch.type & STR_TYPE_ALPHABETIC) index = CHAR_TO_INDEX(key[level]); str_free(ch) if (!pCrawl->children[index]) { index = CHAR_TO_INDEX('x'); if (!pCrawl->children[index]) return false; } pCrawl = pCrawl->children[index]; } str_free(segment); return (pCrawl != NULL && pCrawl->isEndOfWord); }