Виступаючий 1: Давайте дамо це рішення спробувати. Отже, давайте подивимося, що наш Структура, вузол буде виглядати. Тут ми бачимо, що ми збираємося мати Bool Слово і Struct вузол зірки Діти дужки алфавіт. Так перше, що ви можете бути здивовані,, чому алфавіт хеш визначається як 27? Ну, пам'ятаєте, що ми збираємося потрібно бути обробки апостроф, так що буде свого роду спеціальний місце усюди цієї програми. Добре, тепер, згадайте, як Trie насправді працює. Скажімо ми індексації слова кішок, потім від кореня нашого Trie, ми будемо дивитися на дітей Масив, і ми будемо дивитися на індекс, який відповідає букві С. Так що було б індекс два. Тому, враховуючи, що, що дасть нам новий вузол, а потім ми будемо працювати з цим вузлом. Тому, враховуючи, що вузол, ми в черговий раз будемо дивитися на масиві дітей, і ми будемо дивитися на нульовий індекс щоб відповідати А в кіт. Отже, ми збираємося піти на цей вузол, і враховуючи, що вузол, ми збираємося дивитися на індекс, який відповідає Т. і перейти до цього вузла, нарешті, ми повністю подивився через нашу слова Cat, а тепер Bool Слово передбачається вказати, чи є це дане слово насправді слово. Так чому ж ми повинні, що приватний випадок? Ну, що, якщо слово катастрофа знаходиться в нашому словнику, але слово кішка не є? Таким чином, в дивився, якщо слово кішка в нашому словнику, ми збираємося успішно переглядати індексів С-А-Т і досягти вузол, але це тільки тому, що катастрофа сталася в створити вузли на шляху з C-A-T все аж до кінця слова. Так Bool Слово використовується чи вказують це особливе розташування фактично вказує на слово. Гаразд, так що тепер, коли ми знаємо, що Trie збирається виглядати, давайте подивимося у функції Load. Так навантаження збирається повертати Bool для того ми успішно або безуспішно завантажувалася словник і це буде словник що ми хочемо завантажити. Так перше, що ми збираємося зробити, це відкрити до цього словника для читання. Ми повинні переконатися, що ми не забув, тому, якщо словник ні успішно відкритий, то він поверне Ні, в якому випадку ми збираємося повернутися False. Але якщо припустити, що він успішно відкрив, то ми можемо насправді читати через словнику. Так перше, що ми збираємося хочу зробити, це у нас є це глобальна змінна корінь. Тепер, корінь буде вузол зірка. Це вершина нашої Trie, що ми буде ітерації. Так перше, що ми збираємося хочете зробити, це виділити пам'ять для нашого кореня. Зверніть увагу, що ми використовуємо Calloc Функція, яка в основному те ж саме як функція Malloc, за винятком, що це гарантовано повернути те, що є повністю обнуляється. Так що, якщо ми використовували Malloc, ми повинні були б пройти через всі покажчики в нашій вузол і переконайтеся, що вони все нуль. Так Calloc зробить це за нас. Тепер, так само, як Malloc, ми повинні зробити упевнений, що виділення насправді успішним. Якщо це повертається нуль, то потрібно закрити наш словник файл і повернути False. Так припускаючи розподіл був успішно, ми збираємося використовувати вузол зірки курсора для ітерації через нашу Trie. Таким чином, наш корінь ніколи не збирається змінювати, але ми збираємося використовувати курсор в насправді йти від вузла до вузла. Гаразд, так що в цьому для циклу, ми читати через файл словника, і ми використовуємо в fgetc. Так fgetc збирається захопити один персонаж з файлу. Ми збираємося продовжити захоплення символів у той час як ми не доходять кінець файлу, так що є два випадки, які ми повинні впоратися. Перший, якщо персонаж не був Нова лінія, тому ми знаємо, якщо це був новий лінія, то ми збираємося перейти до нових словом. Але якщо припустити, що це не було нової лінії, то тут, ми хочемо з'ясувати, Індекс ми збираємося індексу в в масиві дітей, що ми дивилися на перед. Так як я вже говорив, ми повинні Особливий випадок апостроф. Зверніть увагу, що ми з тризначним оператором тут, так що ми збираємося читати це як якщо персонаж ми читаємо, був апостроф, то ми збираємося встановити індекс, рівний алфавіту мінус 1, який буде індекс 26. В іншому випадку, якщо це не було апостроф, потім ми збираємося встановити індекс дорівнює з мінус. Так що пам'ятайте назад від попередніх наборів р, з мінус збирається дати нам алфавітний становище з, так що якщо з буквою А, ця воля дати нам нульовий індекс. Для письма B, це дало б нам індекс 1, і так далі. Так що це дає нам індекс у Діти масив, який ми хочемо. Тепер, якщо цей показник в даний час нульовий в масив Діти, що означає, що вузол даний час не існує від що шлях, так що ми повинні виділити вузол для цього шляху. Це те, що ми робимо тут. Таким чином, ми збираємося, знову ж таки, використовувати Calloc Функція, щоб ми не повинні обнулити всі покажчики, і ми, знову ж, потрібно перевірити, що Calloc не провалився. Якщо Calloc нічого не вийде, то ми повинні вивантажити все, закриваємо словник, і повернути False. Так припускаючи, що він не забув, то це створить нового дитини для нас, а потім ми підемо в цієї дитини. Наша курсор ітерації до цієї дитини. Тепер, якщо це не було порожньою для початку, то курсор можна просто перебрати до цієї дитини, практично не того, щоб виділити нічого. Це той випадок, коли ми вперше відбулося виділити слово кішку, і це означає, що, коли ми йдемо виділити катастрофа, нам не потрібно створювати вузли для C-A-T знову. Вони вже існують. Отже, що ж це за інше? Це стан, при якому кондиціонер був коса риса п, де кондиціонер був нова лінія. Це означає, що ми успішно завершила слово. Тепер, що ми хочемо зробити, коли ми успішно завершила слово? Ми збираємося використовувати це поле слово всередині нашого Struct вузла. Ми хочемо, щоб встановити, що до Правда, таким чином, щоб вказує, що цей вузол вказує успішним слово актуальною слово. Тепер встановіть, що Істина. Ми хочемо, щоб скинути нашу курсор до точки на початку Trie знову. І, нарешті, збільшити наш словник Розмір так як ми знайшли ще одне слово. Гаразд, так що ми збираємося продовжувати робити що, читаючи характер по характер, побудови нових вузлів в наша Trie і для кожного слова в словник, поки ми нарешті не досягне гр одно EOF, в цьому випадку, ми порушуємо з файлу. Тепер, є два випадки під які ми могли б потрапити EOF. Перший, якщо сталася помилка читання з файлу, так що якщо не було про помилку, ми повинні зробити типовий вивантажити все, закрийте файл, повернутися False. Припускаючи, що не було помилок, які просто означає, що ми насправді потрапив в кінці файл, в якому випадку, ми закриваємо файл і повернутися Правда, так як ми успішно завантажений словник в нашій Trie. Гаразд, так що тепер давайте Виїзд Заїзд. Дивлячись на перевірки функції, ми бачимо, що Перевірити збирається повертати Bool. Вона повертає Правда, якщо це слово, що це передається в нашій Trie. Вона повертає значення False у противному випадку. Так як ми збираємося визначити, чи є це слово в нашому Trie? Ми бачимо тут, що, як і раніше, ми збираємося використовувати курсор для перебору через нашу Trie. Тепер, ось, ми збираємося ітерації над усім нашим словом. Так ітерації слова ми пройшло, ми збираємося визначити індекс у масиві дітей, що відповідає слово кронштейна I. Так що це буде виглядати так само, як Навантаження, де, якщо слово кронштейн я є апостроф, то ми хочемо використовувати індекс алфавіт мінус 1, тому що ми визначили тобто, куди ми йдемо для зберігання апострофи. Решту ми збираємося використовувати ToLower Слово кронштейн я. Так що пам'ятайте, що слово може мати довільне капіталізація, і тому ми хочете, щоб переконатися, що ми використовуємо рядкової версією речей. А потім відняти з цієї нижньому регістрі щоб, знову ж таки, дають нам алфавітний положення з цього символу. Так що це буде наш індекс в масиві дітей. І тепер, якщо що індекс в інтересах дітей Масив є порожнім, що означає, що ми більше не може продовжувати ітерації вниз нашої Trie. Якщо це так, то це слово не може можливо, буде в нашому Trie, так як, якщо він були, це означатиме, що буде Шлях вниз до цього слова, і ви б ніколи не стикаються нуль. Так зустрічаючи нуль, ми повертаємося False. Слово немає у словнику. Якби не нуль, то ми збираємося продовження ітерацій, так що ми збираємося оновити наш курсор, щоб вказати на що конкретний вузол за цим індексом. Таким чином, ми продовжувати робити це протягом все слово. Припустимо, що ми ніколи не вдарив нуль, що означає ми змогли пройти через весь світ і знайти вузол в нашому Trie, але ми ще не закінчили ще. Ми не хочемо, щоб просто повернути True. Ми хочемо повернутися курсора помилку слово так, пам'ятайте, знову ж, якщо кішка не в наш словник і катастрофа, тоді ми будемо успішно пройти слово кішка, але курсор слово буде Брехня і неправда. Так ми повертаємося курсора слово для позначення Чи цей вузол насправді слово, і ось воно що для перевірки. Так давайте перевіримо Розмір. Так Розмір буде досить легко так, пам'ятаєте, в Load, ми збільшуючи розмір словника для кожне слово, що ми стикаємося з. Так Розмір тільки збирається повернутися розмір словника, і ось воно що. Гаразд, нарешті, у нас є Unload. Так вивантаження, ми збираємося використовувати рекурсивна функція насправді робити все роботи для нас, тому нашій функції збирається назвати Розвантажувач. Що Розвантажувач збираєтеся робити? Ми бачимо тут, що Розвантажувач збирається перебору всіх дітей у цей конкретний вузол, і якщо дитина вузол не є нульовим, то ми збираємося вивантажити дочірній вузол. Так це буде рекурсивно вивантажити всі наші діти. Після того, як ми впевнені, що всі наші діти були вивантажені, то ми може звільнитися, тому розвантажити OURSELF. Так що це буде рекурсивно вивантажити Весь Trie, а потім один раз це зроблено, ми можемо просто повернути True. Вивантаження не може потерпіти невдачу, ми просто звільняючи речі. Тому, як тільки ми закінчимо звільняючи все, повернутися Правда. І це все. Мене звуть Боб, і це був [нерозбірливо].