Національний університет “Львівська політехніка”
Кафедра ЕОМ
Курсова робота ( частина 2 )
На тему:
“ Динамічні структури даних ”
з дисципліни:
" Програмування"
Вибір варіантів індивідуального завдання:
Вибір АТД: № = [(16) + (1994) + (117) ] % 4 + 1 = 4
Примітка: 1 – стек, 2 – черга, 3- список, 4 – дерево.
Вибір номера завдання:
№ = [(4) + (1994) + (83) ] % 10 + 1 = 2
ЗАВДАННЯ НА КУРСОВУ РОБОТУ
Побудувати бінарне дерево пошуку для послідовності чисел, що вводяться з клавіатури. Реалізувати операції додавання та вилучення вузлів з бінарного дерева пошуку. Виконати обхід дерева у заданому порядку та показати:
послідовність вершин дерева при проходженні його у прямому порядку;
послідовність листків дерева при проходженні його у зворотньому порядку;
послідовність вузлів, що мають тільки одного нащадка при проходженні дерева у симетричному порядку.
Вилучити з дерева всi листки.
2) Глосарій або предметний покажчик підручника складається з впорядкованих по алфавіту основних термінів, кожен з яких супроводжується впорядкованою за зростанням послідовністю номерів сторінок, де він зустрічається, і множиною підтермінів. Підтерміни виводяться на наступних за основним терміном рядках, вони дещо зсунуті вправо відносно основного терміна і впорядковані по алфавіту всередині основного терміна. Кожен підтермін супроводжується впорядкованою за зростанням послідовністю номерів сторінок, де він зустрічається.
Розробити структуру даних для представлення такого предметного покажчика і написати програму для зображення предметного покажчика по вхідних даних, що зберігаються у текстовому файлі.
Кожний вхідний рядок починається або з символу М (основний термін), або з символу S (підтермін). Рядок з символом М містить основний термін, за котрим слідують номери сторінок, на котрих зустрічається основний термін. Рядок з символом S будується аналогічно, за винятком того, що він містить не основний термін, а підтермін. Вхідні рядки з’являються у будь-якому порядку. Єдина умова: кожен підтермін вважається підтерміном найближчого попереднього основного терміна. Для одного основного терміна або підтерміна може бути декілька вхідних рядків (всі номери сторінок, що з’являються для конкретного терміна у будь-якому рядку, повинні бути надруковані разом з цим терміном).
Зміст
1. Теоретична частина 4
2.Завдання 3. Побудова АТД 6
2.1. Постановка задачі 6
2.2. Динаміка вмісту 7
2.3. Результати виконання програми 10
3. Завдання 4. Застосування АТД 11
3.1. Постановка задачі 11
3.2. Алгоритм розв’язання задачі 12
3.2.1. Словесний опис алгоритму 12
3.2.2. Граф-схема алгоритму 12
3.3. Результати виконання програми 15
Висновки 16
Список літератури 17
Додаток А. Текст програми до завдання 3 18
Додаток Б. Текст програми до завдання 4 22
1. Теоретична частина
Переваги динамічних структур даних
Динамічні структури даних, щодо визначення, характеризуються відсутністю фізичної суміжності елементів структури пам'яті, непостійністю і непередбачуваністю розміру структури в процесі її обробки.
Оскільки елементи динамічної структури розташовуються по непередбачуваним адресами пам'яті, адреса елемента такої структури не може бути обчислений з адреси початкового або попереднього елемента. Для встановлення зв'язку між елементами динамічної структури використовуються покажчики, через які встановлюються явні зв'язки між елементами. Таке подання даних у пам'яті називається зв'язковим.
Елемент динамічної структури складається з двох полів:
інформаційного поля або поля даних, в якому містяться ті дані, заради яких і створюється структура; в загальному випадку інформаційне поле саме є інтегрованою структурою-вектором, масивом, записом і т.п.;
полі зв'язок, в якому містяться один або кілька покажчиків, що зв'язує цей елемент з іншими елементами структури.
Коли зв'язне подання даних використовується для розв'язання прикладної задачі, для кінцевого користувача дивись робиться тільки вміст інформаційного поля, а поле зв'язок використовується тільки програмістом-розробником.
Переваги зв'язкового представлення даних:
у можливості забезпечення значної мінливості структур;
розмір структури обмежується тільки розміром пам'яті машини;
при зміні логічної послідовності елементів структури потрібно не переміщення даних в пам'яті, а тільки корекція покажчиків.
Однак існують і недоліки:
робота з покажчиками вимагає, як правило, більш високої кваліфікації від програміста;
на поля зв'язок витрачається додаткова пам'ять;
доступ до елементів зв'язного структури може бути менш ефективним за часом.
Застосування динамічних структур
Останній недолік є найбільш серйозним і саме їм обмежується застосовність зв'язкового представлення даних. Якщо в суміжному поданні даних для обчислення адреси будь-якого елемента нам у всіх випадках достатньо було номера елемента або інформації, що міститься в дескрипторі структури, то для зв'язкового подання адресу елемента не може бути обчислений з вихідних даних.
Дескриптор зв'язного структури містить один або кілька покажчиків, що дозволяють увійти в структуру, далі пошук і необхідного елемента виконується проходженням по ланцюжку покажчиків від елемента до елементу. Тому зв'язне уявлення практично ніколи не застосовується в задачах, де логічна структура даних має вигляд вектора або масиву - з доступом за номером елемента, але часто застосовується в задачах, де логічна структура вимагає іншої вихідної інформації доступу (таблиці, стеки, списки, дерева і т . д.).
Дерево - в інформатиці та програмуванні одна з найпоширеніших структур даних. Формально дерево визначається як скінченна множина Т з одного або більше вузлів (nodes), яка задовольняє наступним вимогам:
існує один відокремлений вузол - корень (root) дерева
інші вузли (за виключенням кореня) розподілені серед m ≥ 0 непересічних множин T1, ..., Tm і кожна з цих множин в свою чергу є деревом. Дерева T1, ..., Tm мають назву піддерев (subtrees) даного кореня.
З цього визначення випливає, що кожний вузлів є в свою чергу коренем деякого піддерева. Кількість піддерев вузла має назву степеня (degree) цього вузла. Вузол степеню нуль називається кінцевим (terminal) або листком (leaf). Не корінь і некінцевий вузол також має назву вершини розгалуження (branch node). Нехай x - довільний вузол дерева з коренем r. Тоді існує єдиний шлях з r до x. Усі вузли на цьому шляху називаються предками (ancestors) x; якщо деякий вузол y є предком x, то x називається нащадком (descendant) y.
2. Завдання 3. Побудова АТД
2.1. Постановка задачі
Побудувати бінарне дерево пошуку для послідовності чисел, що вводяться з клавіатури. Реалізувати операції додавання та вилучення вузлів з бінарного дерева пошуку. Виконати обхід дерева у заданому порядку та показати:
послідовність вершин дерева при проходженні його у прямому порядку;
послідовність листків дерева при проходженні його у зворотньому порядку;
послідовність вузлів, що мають тільки одного нащадка при проходженні дерева у симетричному порядку.
Вилучити з дерева всi листки.
2.2. Динаміка вмісту
2.2.1. Задаємо вхідну послідовність 10 цілих чисел: 24, 20, 16, 30, 36, -20, 14, 28, -30, 22.
2.2.2. Схематичне зображення дерева:
24
Add(24);
Add(20);
Add(16);
Add(30);
Add(36);
Delete(20);
Add(14);
Add(28);
Delete(30);
Add(22);
Реалізація БД пошуку на базі масиву розмірністю 17:
Індекси
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
info
24
20
16
30
36
14
28
22
x
x
x
x
x
x
x
x
father
0
16
1
2
1
3
5
3
0
9
10
11
12
13
14
15
left-son
3
0
6
0
7
0
0
0
0
0
0
0
0
0
0
0
right-son
5
4
8
0
0
0
0
0
10
11
12
13
14
15
16
2
Head = 1;
Free = 9;
3.4. Обхід БД пошуку:
а) послідовність вершин дерева при проходженні його у прямому порядку:
24 16 14 22 36 28
б) послідовність листків дерева при проходженні його у зворотньому порядку:
14 22 28
в) послідовність вузлів, що мають тільки одного нащадка при проходженні дерева у симетричному порядку:
36
3.5 Вилучити з дерева всi листки.
Зображення дерева після виконання операції вилучення всіх листків:
3.3. Результати виконання програми
/
3. Завдання 4. Застосування АТД
3.1 Постановка задачі
Глосарій або предметний покажчик підручника складається з впорядкованих по алфавіту основних термінів, кожен з яких супроводжується впорядкованою за зростанням послідовністю номерів сторінок, де він зустрічається, і множиною підтермінів. Підтерміни виводяться на наступних за основним терміном рядках, вони дещо зсунуті вправо відносно основного терміна і впорядковані по алфавіту всередині основного терміна. Кожен підтермін супроводжується впорядкованою за зростанням послідовністю номерів сторінок, де він зустрічається.
Розробити структуру даних для представлення такого предметного покажчика і написати програму для зображення предметного покажчика по вхідних даних, що зберігаються у текстовому файлі.
Кожний вхідний рядок починається або з символу М (основний термін), або з символу S (підтермін). Рядок з символом М містить основний термін, за котрим слідують номери сторінок, на котрих зустрічається основний термін. Рядок з символом S будується аналогічно, за винятком того, що він містить не основний термін, а підтермін. Вхідні рядки з’являються у будь-якому порядку. Єдина умова: кожен підтермін вважається підтерміном найближчого попереднього основного терміна. Для одного основного терміна або підтерміна може бути декілька вхідних рядків (всі номери сторінок, що з’являються для конкретного терміна у будь-якому рядку, повинні бути надруковані разом з цим терміном).
3.2. Алгоритм розв’язання задачі
3.2.1. Словесний опис алгоритму
Створюю клас Glossary, основою якого є об’єкт класу Tree.
Рівень 1, тобто підвітки кореня дерева, це терміни.
Рівень 2 це підтерміни або сторінки де зустрічаються терміни.
Рівень 3 це сторінки на яких зустрічаються підтерміни.
В класі реалізовано методи для пошуку в глосарії за терміном, а також за терміном і підтерміном.
Реалізовано додавання нових термінів. Також, можна додавати підтерміни до існуючих термінів.
Реалізовано вилучення елементів з глосарію
3.2.2. Граф-схема алгоритму
3.3. Результати виконання програми
/
Вміст вихідного текстового файла:
/
Глосарій після додавання елементів з текстового файла:
/
Вміст вихідного текстового файла:
/
Висновки
Створено програму, яка моделює глосарій книги за допомгою АТД «Дерево». Реалізовано всі необхідні методи та методи, які задані завданням.
Список літератури
Грегори К. Использование Visual С++. Специальное издание. - М.: «Диалектика», 1999.
Мешков А.В., Тихомиров Ю.В. Visual С++ и MFC. Пер. с англ. – 2-е изд. перераб. и доп. – СПб.: БХВ - Петербург, 2002. – 1040 с.
Страуструп Б. Язык программирования С++. Третье издание. - М.: «Издательство Бином», 1999.
Трамбле Ж., Соренсон П. Введение в структуры данных. – М.:Машиностроение, 1982
Уильям Топп, Уильям Форд. Структуры данных в С++. – М.:Бином, 2000 - 700