
- •Теоретичні відомості
- •Зв'язні списки
- •Однозв'язні списки
- •Кільцевий однозв'язний список
- •Найпростіші операції, що здійснюються над однозв'язними списками
- •Двозв’язнй список
- •Кільцевий двозв’язний список
- •Операції над двозв’язними списками:
- •Реалізація стеків за допомогою однозв'язних списків
- •Однозв'язний список, як самостійна структура даних
- •Вставка і видалення елементів із списку
- •Приклади типових операцій над списками
- •Елементи заголовків в списках
- •Нелінійні зв'язані структури
- •Варіанти завдань
- •Рекомендована література
- •Контрольні запитання
Лабораторна робота №7
Тема. Спискові структури даних
Мета: дослідити та вивчити спискові структури даних.
Професійна спрямованість: дана лабораторна робота є складовою частиною професійної підготовки фахівця з інформатики до роботи.
Теоретичні питання (план)
Лінійний однозв’язний та двозв’язний список.
Кільцеві структури.
Операції над списками.
Приклад організації і представлення лінійних зв’язних списків у пам’яті комп’ютера.
Хід виконання роботи
Ознайомтеся з основними теоретичними відомостями.
Згідно номеру свого варіанту оберіть умову задачі.
Побудувати алгоритм розв’язання задачі.
Провести аналіз складності алгоритму.
Теоретичні відомості
Динамічні структури даних мають 2 особливості:
Наперед не визначено кількість елементів в структурі.
Елементи динамічних структур не мають жорсткої лінійної впорядкованості. Вони можуть бути розкиданий по пам'яті.
Щоб зв'язати елементи динамічних структур між собою до складу елементів крім інформаційних полів входять поля покажчиків (зв'язок з іншими елементами структури).
P1 і P2 це покажчики, що містять адреси елементів, з якими вони зв'язані. Покажчики містять номер слота.
Зв'язні списки
Найпоширенішими динамічними структурами є зв'язані списки. З погляду логічного представлення розрізняють лінійні і нелінійні списки.
В лінійних списках зв'язки строго впорядковані: покажчик попереднього елемента містить адресу наступного елемента або навпаки.
До лінійних списків відносяться однозв'язні і двозв’язні списки. До нелінійних – багатозв'язні.
Елемент списку в загальному випадку є полем запису і одного або декількох покажчиків.
Однозв'язні списки
Елемент однозв'язного списку містить два поля: інформаційне поле (INFO) і поле покажчика (PTR).
Особливістю покажчика є те, що він дає тільки адресу наступного елемента списку. Поле покажчика останнього елемента в списку є порожнім (NIL). LST – покажчик на початок списку. Список може бути порожнім, тоді LST буде рівний NIL.
Доступ до елемента списку здійснюється тільки від його початку, тобто зворотного зв'язку в цьому списку немає.
Кільцевий однозв'язний список
Кільцевий однозв'язний список виходить із звичайного однозв'язного списку шляхом привласнення покажчику останнього елемента списку значення покажчика початку списку.
Найпростіші операції, що здійснюються над однозв'язними списками
Вставка на початок однозв'язного списку.
Треба вставити в початок однозв'язного списку елемент з інформаційним полем D. Для цього необхідно згенерувати порожній елемент (P=GetNode). Інформаційному полю цього елемента привласнити значення D (INFO(P)=D), значенню покажчика на цей елемент привласнити значення покажчика на початок списку (Ptr(P)= Lst), значенню покажчика початку списку привласнити значення покажчика P (Lst = P).
Реалізація на Паскалі:
type
PNode = ^TNode;
TNode = record
Info: Integer; {тип елементів списку – може бути будь-яким}
Next: PNode;
end;
var
Lst: PNode; {покажчик на початок списку}
P: PNode;
Вставка в початок
New(P); {створення нового елемента}
P^.Info:=D;
P^.Next:=Lst; {P указує на початок списку, але Lst не указує на P – новий початок}
Lst:=P; {Lst указує на новий початок списку}
Видалення елемента з початку однозв'язного списку.
Треба видалити перший елемент списку, але запам'ятати інформацію, що міститься в полі Info цього елемента. Для цього введемо покажчик P, який указуватиме на елемент, що видаляється (P = Lst). В змінну X занесемо значення інформаційного поля Info елемента, що видаляється (X=Info(P)). Значенню покажчика на початок списку привласнимо значення покажчика наступного за тим, що видаляється елемента (Lst = Ptr(P)). Видалимо елемент (FreeNode(P)).
Реалізація на Паскалі:
Видалення з початку
P:=Lst;
X:=P^.Info;
Lst:=P^.Next;
Dispose(P); {Видаляє елемент з динамічної пам'яті}