
- •Лекція 1. Структури даних. Основні визначення та поняття
- •1.1. Термінологія
- •1.2. Типи даних
- •1.3. Рівні організації даних
- •1.4. Представлення даних
- •1.5. Класифікація структур даних
- •1.6. Основні операції над структурами даних
- •1.7. Документування даних
- •Лекція 2. Алгоритми. Складність алгоритмів.
- •2.1. Зображення алгоритмів
- •2.2. Складність алгоритмів
- •2.3. Класи алгоритмів
- •2.4. Документація алгоритмів
- •Лекція 3. Методи сортування .
- •3.1. Задача сортування
- •3.2.Метод простої вибірки.
- •3.3. Метод бульбашки.
- •3.4.Швидкий метод сортування
- •Лекція 4 методи сортування (продовження)
- •4.5. Сортування включенням
- •4.6. Сортування розподілом
- •4.7. Сортування злиттям або об’єднанням
- •4.8. Сортування підрахунком
- •Лекція 5 нелінійні структури даних
- •5.1. Дерева
- •5.1.1. Бінарні дерева
- •5.1.2. Алгоритм обходу дерева
- •5.1.3. Зображення в пам‘яті комп‘ютера графоподібних структур
- •Лекція 6 методи сортування на деревах
- •6.1. Сортування на деревах
- •6.1.2. Пірамідальне сортування.
- •Питання до першого модуля
- •Тема 1. Основні визначення та поняття. Термінологія. Класифікація структур даних. Основні операції над структурами даних.
- •Тема 2. Поняття алоритму. Зображення алгоритмів. Алгоритмічна складність. Поліноміальна та неполіноміальна складність алгоритмів..
- •Тема 3-4. Алгоритми сортування
- •Тема 5-6. Дерева. Основні визначення та поняття. Бінарні дерева. Зображення в пам‘яті еом графоподібних структур. Алгоритми обходу дерев.Висхідні, нисхідні, змішані алгоритми обходу дерев.
- •Лекція 7. Лінійні структури даних. Стеки, черги і деки.
- •7.1. Стеки
- •7.1.1. Реалізація стеку на базі масиву
- •7.2. Черги
- •7.2.1. Використання черги в програмуванні
- •7.2.2. Реалізація черги на базі масиву
- •7.3. Деки
- •Лекція 8. Лінійні структури даних.
- •8.1. Лінійні списки . Основні визначення та поняття
- •8.2. Однонаправлені списки
- •8.3. Двонаправлені списки
- •8.4. Циклічні списки
- •Лекція 9. Масиви, множини, кортежі
- •9.1. Масиви
- •9.2. Множини I кортежі
- •9.2.1. Реалізація множини
- •9.3. Зберігання множин і масивів
- •9.4. Зберігання розріджених матриць
- •Лекція 10. Нелінійні структури даних
- •10.1. Таблиці
- •10.1.1. Зображення таблиць
- •Лекція 11. Нелінійні структури даних
- •11.1. Спискові структури
- •11.1.1. Ієрархічні списки
- •11.1.2. Організація спискових структур
- •11.2. Сіткові структури
- •Лекція 12 пошук даних.
- •12.1. Послідовний пошук
- •12.2. Двійковий пошук
- •12.2.1. Дерева порівнянь на векторній пам‘яті.
- •12.3. Прямий пошук стрічки
- •12.4. Алгоритм Кнута, Моріса і Прата пошуку в стрічці.
- •12.5. Алгоритм Бойера - Мура пошуку в стрічці
- •12.6. Алгоритми з поверненням
- •Лекція 13 пошук у таблицях
- •13.1. Пошук у таблицях з обчислюваними адресами
- •13.2. Пошук у таблицях з прямим доступом
- •13.3. Пошук у Хеш-таблицях
- •Питання до другого модуля
- •Тема 9 Лінійні списки. Основні визначення та поняття. Однонаправлені списки. Двонаправлені списки. Циклічні списки. Організація списків.
- •Тема 10 Масиви. Множини I кортежі. Зберігання множин і масивів. Зберігання розріджених матриць. Операції з масивами, множинами та кортежами
8.3. Двонаправлені списки
Двонаправлені списки це такі списки, які дозволяють рухатися вперед і назад при перегляді його елементів. Вони зображуються у вигляді ланцюга, кожна ділянка якого містить вказівники на наступний і попередній елементи.
На рис.8.5 зображено структуру заголовної (рис.8.5,а) і внутрішньої (рис.8.5,б) ділянок, а також самого двонаправленого списку (рис.8.5,в). Кожна ділянка такого списку складається з чотирьох значень (рис.8.5,б), а саме: значення самого елемента даних і довідки стандартного вигляду з трьох значень - довжини ділянки, вказівників на наступну і попередню ділянки. В загальному випадку довжина кожної ділянки може бути різною. Заголовна ділянка також складається з чотирьох значень, але її довжина відома і рівна чотирьом, оскільки записом її елемента є вказівник, а всі вказівники мають однакову довжину (рис.8.5,а).
Рис. 8.5. Зображення двонаправленого списку і його ділянок
Очевидно, що операції включення-виключення запису в даному випадку аналогічні до попередніх і також зводяться до коректування зв‘язків між ділянками. Однак операція включення запису в двонаправлений список буде значно складнішою від операції виключення запису з нього, оскільки в першій операції необхідно прочитувати дві ділянки, а в другій - тільки ту, яка виключається. Попередній запис потрібний для коректування зв‘язку на наступний елемент, але цей запис не треба читати, знайдемо його у ділянці, яка виключається. Тому можна записати туди нову адресу без читання самої ділянки.
Двонаправлений список також відображується в одномірний масив, починаючи зі стандартної заголовної ділянки, яка має в масиві індекси 0, 1, 2, 3.
8.4. Циклічні списки
Циклічні, або кільцеві, списки - найпоширеніша різновидність двонаправлених списків. У такому списку остання ділянка посилається на заголовну як на наступну, а ця, в свою чергу, посилається на останню ділянку як на попередню. Така організація спрощує процедуру пошуку або перебору записів з довільного місця з автоматичним переходом від кінця на початок, і навпаки. Бувають також однозв‘язні кільцеві списки, в яких остання ділянка посилається на заголовну як на наступну. На рис.8.6 зображено циклічний двозв‘язаний список.
Рис.8.6. Циклічний список
Операція включення в кільцевий двозв‘язаний список подібна до попередніх. Наприклад, нехай потрібно встановити ділянку з новим записом після ділянки з індексом і. Нова ділянка розміщується на вільному місці пам‘яті і включається у список шляхом коректування вказівників в ділянці з індексом і , а також у тій ділянці, яка раніше була після неї.
Операція виключення ділянки із кільцевого двозв‘язного списку також зводиться до коректування двох посилань - у "сусіда ліворуч" змінюється вказівник на наступну ділянку, а у "сусіда праворуч" - вказівник на попередню ділянку.
Циклічний двозв‘язний список можна відобразити у одномірний масив аналогічно лінійному списку. У такому випадку процедури включення-виключення елементів зводяться до обчислення індексів вказівників, як і в лінійному списку, і заміни вмістимого елементів масиву з цими індексами. Якщо тіло елемента списку являв собою рядок символів або бітів, а вказівники - цілі числа, то не в кожній мові програмування таке відображення можливе. Тому, наприклад, простіше відображувати списки у два масиви - один для тіла елемента, другий - для довідкової частини.
Частіше, однак, елементи списку не розташовують у якому-небудь масиві, а просто розміщають кожний окремо в оперативній пам'яті, виділеній даній задачі. Зазвичай елементи списку розміщаються в динамічній пам'яті. У якості вказівників у цьому випадку використовують адреси елементів в оперативній пам'яті.
Голова списку зберігає вказівник на перший і останній елементи списку. Оскільки список зациклений у кільце, то наступним за головою списку буде його перший елемент, а попереднім - останній елемент. Голова списку зберігає тільки вказівник й не зберігає ніякого елемента. Це як би порожня комірка, у якій не можна нічого покласти і яка використовується тільки для того, щоб зберігати адреси наступного й попереднього елементів списку, тобто першого й останнього. Коли список порожній, голова списку зациклена сама на себе.
Перевага вказівникової реалізації списку полягає в тому, що процедури додавання й видалення елементів не приводять до масових операцій.