
- •Розділ 3.
- •3.1. Визначення абстрактного типу даних
- •Хоча терміни тип даних, структура даних і абстрактний тип даних звучать схоже, але
- •Базовим будівельним блоком структури даних є комірка, яка призначена для зберігання значення певного
- •Способи агрегації комірок для створення структур даних:
- •3.2. АТД "Список"
- •Приклад. Здійснюється реєстрація автомобілів, які прибувають на автостоянку та залишають її. Потрібно зберігати
- •Лінійні зв’язні списки – це ефективна структура даних для моделювання ситуацій, в яких
- •Зв'язні лінійні списки поділяють на такі різновиди:
- •Реалізація списків за допомогою масивів
- •перший елемент другий елемент
- •Реалізація списків за допомогою покажчиків
- •Зображення однозв'язного лінійного списку
- •Приклад. Оголошення типу компонента однозв'язного лінійного списку. Для роботи з таким списком потрібні
- •Приклади, що ілюструють реалізації АТД “Список”:
- •Порівняння реалізацій АТД “Список”
- •1.Реалізація списків за допомогою масивів вимагає вказівки максимального розміру списку до початку виконання
- •3.Якщо необхідно вставляти або видаляти елементи, положення яких вказане з допомогою якоїсь змінної-курсору,
- •3.3. Стек
- •Стек — це один із різновидів однозв'язного лінійного списку, доступ до елементів якого
- •Для роботи зі стеком використовують зазвичай п’ять дій:
- •Реалізація списків за допомогою покажчиків
- •Алгоритм вставки елемента до стеку
- •Алгоритм видалення елемента зі стеку
- •Реалізація списків за допомогою масивів
- •перший елемент другий елемент
- •Приклади, що ілюструють реалізації АТД “Стек”:
- •3.4. Черга
- •Черга, як і стек, — це один із різновидів однозв'язного лінійного списку.
- •Реалізація черг за допомогою покажчиків
- •Алгоритм вставки елемента до черги
- •Реалізація черг за допомогою циклічних масивів
- •черга
- •Приклади, що ілюструють реалізації АТД “Черга”:
- •3.5. Однозв'язний лінійний список
- •Стек і черга є лінійними списками, множина допустимих операцій над якими обмежена операціями
- •Всі можливі варіанти застосування операцій вставки та видалення елементів у списку:
- •Додавання елемента в кінець списку виконується за алгоритмом додавання елемента до черги, а
- •Алгоритм вставки елемента всередину списку
- •Алгоритм видалення елемента зсередини списку
- •Алгоритм видалення елемента з кінця списку
- •Приклад. Алгоритм роботи з алфавітним переліком слів.
- •4.Якщо натиснута клавіша D, видалити елемент зі списку.
- •Приклади, що ілюструють реалізації АТД “Однозв'язний лінійний список”:
- •3.6. Двозв'язний лінійний список
- •Часто виникає необхідність організувати ефективне пересування по списку як в прямому, так і
- •3.7. Відображення
- •Відображення - це функція, визначена на множині елементів одного типу (області визначення), що
- •Перелік операторів, які можна виконати над відображенням М.
- •Реалізація відображень за допомогою масивів
- •Реалізація відображень за допомогою списків
- •3.8. Рекурсія
- •В математиці та програмуванні рекурсія – це метод визначення або вираження функції, процедури,
- •Стеки знаходять важливе застосування при реалізації рекурсивних процедур в мовах програмування. Організація виконання
- •Приклад. Одним із найпростіших прикладів рекурсії може стати функція обчислення факторіала.
- •В рекурсивних підпрограмах можна виділити два процеси: рекурсивне занурення підпрограми у себе, що
- •Рекурсивне обчислення факторіала
- •Від глибини рекурсії значною мірою залежить час виконання програми та об'єм потрібної стекової
- •Стан оперативної пам'яті під час рекурсивного обчислення факторіала

Алгоритм вставки елемента до черги
1. Виділити пам'ять для нового елемента черги:
new(current);
2. Ввести дані до нового елемента: readln(current^.data);
3.Вважати новий елемент останнім у черзі: current^.next:=nil;
4.Якщо черга порожня, то ініціалізувати її вершину: head:=current;
5.Якщо черга не порожня, то зв'язати останній елемент черги із новоутвореним: last^.next:=current;
6.Вважати новий елемент черги останнім: last:=current;
head |
data |
next |
data next |
|
current |
data? next=ni? l |
|
||
|
|
current |
data next=nil |
|
|
|
|
last |
|
|
|
|
|
Елементи з черги видаляються за тим самим алгоритмом, що і зі стеку.

Реалізація черг за допомогою циклічних масивів
Реалізацію списків за допомогою масивів, яка розглядалася раніше, можна застосувати для черг, але в даному випадку це не раціонально. Дійсно, за допомогою покажчика на останній елемент черги можна виконати додавання елемента за фіксоване число кроків (незалежне від довжини черги) але оператор видалення елемента, який видаляє перший елемент, вимагає переміщення всіх елементів черги на одну позицію в масиві.
Щоб уникнути цих обчислювальних витрат, скористаємося іншим підходом. Представимо масив у вигляді циклічної структури, де перший запис масиву слідує за останнім

черга
При такому представленні черги оператори додавання і видалення елемента виконуються за фіксований час, незалежний від довжини черги.

Приклади, що ілюструють реалізації АТД “Черга”:
–реалізація за допомогою покажчиків (с.316-319 [4])
–ще одна реалізація за допомогою покажчиків (с.62-63 [1])
–реалізація за допомогою масивів (с.63-66 [1]).

3.5. Однозв'язний лінійний список
Література для самостійного читання:
с. 66-60 [1], с. 319-325 [4]

Стек і черга є лінійними списками, множина допустимих операцій над якими обмежена операціями над першим або останнім елементом. Розглянемо списки, над якими припустимі довільні дії.
Найбільш ефективно у спискових структурах реалізуються операції вставки та видалення елементів, оскільки вони, на відміну від операцій видалення та вставки елементів масиву, не потребують зсуву групи елементів.

Всі можливі варіанти застосування операцій вставки та видалення елементів у списку:
створення списку, тобто внесення першого елемента до списку;
додавання елемента в кінець списку;
додавання елемента на початок списку;
вставка елемента в середину списку;
видалення елемента з початку списку;
видалення елемента з кінця списку;
видалення елемента з середини списку.
Узагальному випадку для роботи з однозв'язним лінійним списком потрібні такі покажчики: покажчик head на початок списку; покажчик current на поточний елемент списку; покажчик previous на елемент, розташований перед поточним; покажчик newptr на елемент, що додається до списку, та покажчик last на кінець списку. У розв'язаннях конкретних задач можуть використовуватися не всі покажчики.

Додавання елемента в кінець списку виконується за алгоритмом додавання елемента до черги, а на початок списку — за алгоритмом додавання елемента до стеку. Операція видалення елемента з початку списку здійснюється за алгоритмом видалення елемента зі стеку або з черги.
Запишемо алгоритми решти операцій, припускаючи, що при додаванні елемента для нього вже була створена динамічна змінна newptr^ та було введене значення у його поле data.
Алгоритм створення одноелементного списку
1.Ініціалізувати початок списку: head:=newptr;
2.Ініціалізувати кінець списку: last:=newptr;
3.Записати ознаку того, що перший елемент є останнім: head^.next:=nil;

Алгоритм вставки елемента всередину списку
Вважаємо, що новий елемент має бути вставлений між елементами previous^ і current^.
1. Новий елемент вважати наступним для previous^: previous^.next:= newptr;
2. Для нового елемента вважати наступним current^:
newptr^.next:= current; previous current
head |
data next |
data next |
newptr data next=? current current
data
next
data
nil

Алгоритм видалення елемента зсередини списку
Вважаємо, що має бути видалений елемент current^, розташований безпосередньо за елементом previous^ .
1. Вважати, що за елементом previous^ буде розташований той елемент, що раніше знаходився за елементом current^:
previous^.next:=current^.next;
2. Звільнити пам'ять із-під елемента current^:
Dispose(current);
|
|
|
|
previous |
|
current |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
head |
data |
next |
|
|
data |
next |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
current |
|
data? |
|
|
next? |
|
|
data |
nil |
||||
|
|
|
|
|
|
|