
- •Розрахункова робота
- •«Проблемно – орієнтоване програмування»
- •«Програмування червоно – чорних дерев»
- •1. Огляд літератури
- •1.1 Довідкові матеріали по мові с
- •1.2 Програмування дерев пошуку
- •1.3 Балансування червоно – чорних дерев
- •1.4 Аналіз інших методів організації баз даних
- •2. Формулювання задачі
- •3. Алгоритми розв’язування задачі
- •3.1 Загальний алгоритм написання програми
- •3.2 Алгоритми основних функцій
- •3.2.1 Алгоритм пошуку вузла
- •3.2.2 Алгоритм додавання вузла
- •3.2.3 Алгоритм видалення вузла
- •3.3 Алгоритм вирішення задачі балансування
- •3.3.1 Алгоритм балансування при додаванні вузла
- •3.3.2 Алгоритм балансування при видаленні вузла
- •4. Програмні реалізації алгоритму
- •4.1 Загальні характеристики програми
- •4.2 Призначення програми
- •4.3 Вхідна інформація
- •4.4 Результуюча інформація
- •4.5 Структура програми
- •4.6 Таблиця ідентифікаторів програми
- •4.7 Середовище реалізації програми
- •4.8 Технологія виконання та від лагодження програми
- •5. Інструкція користувачеві програми
- •6. Контрольні приклади та аналіз їх реалізації
- •Висновок
- •Література
- •Додатки (код програми)
3.1 Загальний алгоритм написання програми
Створення типів структур даних і вузла, а також базових функцій: додавання, віднімання, знаходження вузлів, визначення максимальних і мінімальних висот дерева, роз друк дерева. Занесення їх коду у спеціальний файл призначений для запису базових функцій (General_Fun.cpp), які будуть доступні всім файлам програми. Також створення хедер файлу (fun_prototupes.h), який буде підключений до усіх файлів програми і занесення прототипів базових функцій у нього.
Створення головного файлу програми (main_many.cpp), який міститиме функцію main і функцію яка відкриває діалог головного меню. Головане меню містить 4 розділи: 1 - робота з деревом; 2 - робота з диском; 3 - робота з декількома деревами; 4 - додаткові можливості.
Створення окремих файлів для кожного з вище наведених розділів меню. Створення функцій, які відкривають діалоги розділів для кожного з наведених розділів і занесення цих функцій у файл розділу. Для кожного з розділів головного меню створення функції, прототип якої заноситься у хедер файл і яка буде викликатися функцією main, які будуть викликати функцію відкриття діалогу, а також інші функції даного файлу розділу, які не будуть доступні іншим файлам, сама функція міститься у файлі розділу.
Перший, третій і четвертий файли розділів будуть у основному містити функції діалогів різних пунктів розділів, які будуть оперувати з базовими функціями. Четвертий пункт меню може містити додаткові функції і засоби. Другий пункт меню міститиме функції для збереження даних дерева на диск і формування дерева при зчитуванні цих даних.
Створення функцій для балансування червоно-чорних дерев і занесення їх у новий файл програми (Balanse_Fun.cpp). Підключення функцій балансування до базових функцій.
3.2 Алгоритми основних функцій
Оскільки основними і найскладнішими функціями програми, окрім функцій балансування являються, функції додавання, віднімання і пошуку елементів, буде описаний їх алгоритм роботи. Інші функції програми не являються складними у реалізації, тому їхні алгоритми наводитися не будуть.
3.2.1 Алгоритм пошуку вузла
Алгоритм пошуку вузла не являється складним у реалізації, але він застосовується у інших алгоритмах наведених нижче, тому для спрощення цих алгоритмів у них буде посилання на даний алгоритм. Пошук здійснюється за ключем.
Крок 1
Пошук починається з кореня, поточний вузол корінь.
Крок 2
Якщо поточний вузол листок (його адреса NULL), шуканий вузол не існує, завершуємо виконання.
Крок 3
Якщо поточний вузол має ключ рівний шуканому ключу, шуканий вузол знайдено, завершуємо виконання.
Крок 4
Якщо ключ поточного вузла менший за ключ нового, робимо поточним лівий нащадок вузла, інакше правий. Переходимо до кроку 2.
3.2.2 Алгоритм додавання вузла
Крок 1
Пошук починається з кореня, поточний вузол корінь.
Крок 2
Якщо поточний вузол листок (його адреса NULL), виділяємо пам'ять під новий вузол, записуємо ключ і дані у нього, ініціалізуємо його нащадків листками, записуємо його за поточним листком (через приєднання адреси нового вузла до батька поточного листка). Завершуємо виконання.
Крок 3
Якщо поточний вузол має ключ рівний ключу нового вузла, ключ вже існує, завершуємо виконання (у цьому випадку також можна виконувати інші дії, наприклад заміна даних вузла на нову дані, чи їх додавання до старих даних).
Крок 4
Якщо ключ поточного вузла менший за ключ нового, робимо поточним лівий нащадок вузла, інакше правий. Переходимо до кроку 2.