
- •Теоретичні відомості
- •Зв'язні списки
- •Однозв'язні списки
- •Кільцевий однозв'язний список
- •Найпростіші операції, що здійснюються над однозв'язними списками
- •Двозв’язнй список
- •Кільцевий двозв’язний список
- •Операції над двозв’язними списками:
- •Реалізація стеків за допомогою однозв'язних списків
- •Однозв'язний список, як самостійна структура даних
- •Вставка і видалення елементів із списку
- •Приклади типових операцій над списками
- •Елементи заголовків в списках
- •Нелінійні зв'язані структури
- •Варіанти завдань
- •Рекомендована література
- •Контрольні запитання
Однозв'язний список, як самостійна структура даних
Проглядання однозв'язного списку може проводитися тільки послідовно, починаючи з початку списку. Якщо необхідно проглянути попередній елемент, то треба знову повертатися до початку списку. Це – недолік однозв'язних списків в порівнянні із статичними структурами типу масиву. Спискова структура проявляє свої достоїнства, коли число елементів списку велике, а вставку або видалення необхідно провести усередині списку.
Приклад:
Необхідно вставити в існуючий масив елемент X між 5 і 6 елементами.
Для проведення даної операції в масиві потрібно “опустити” всі елементи, починаючи з X6 – збільшити їх індекси на одиницю. В результаті вставки одержуємо наступний масив:
Вставка і видалення елементів із списку
Визначаємо елемент, після якого необхідно вставити елемент в список. Вставка проводиться за допомогою процедури InsAfter(Q, X), а видалення – DelAfter(Q, X).
При цьому робочий покажчик P указуватиме на елемент, після якого необхідно провести вставку або видалення.
Приклад:
Нехай необхідно вставити новий елемент з інформаційним полем X після елемента, на який указує робочий покажчик P.
Для цього:
1) Необхідно згенерувати новий елемент.
Q = GetNode
2) Інформаційному полю цього елемента привласнити значення X.
Info(Q)= X
3) Вставити отриманий елемент.
Ptr(Q)= Ptr(P)
Ptr(P)= Q
Це і є процедура InsAfter(Q, X).
Нехай необхідно видалити елемент списку, який слідує після елемента, на який указує робочий покажчик P.
Для цього:
Привласнюємо Q значення покажчика на елемент, що видаляється.
Q = Ptr(P)
2) В змінну X зберігаємо значення інформаційного поля елемента, що видаляється.
X = Info(Q)
3) Міняємо значення покажчика на елемент, що видаляється, на значення покажчика на наступний елемент і проводимо видалення .
Ptr(P)= Ptr(Q)
FreeNode(Q)
Це і є процедура DelAfter(P, X).
На мові Паскаль вищеописані процедури виглядатимуть таким чином:
procedure InsAfter(var Q: PNode; X: Integer);
var
Q: PNode;
begin
New(Q);
Q^.Info:=X;
Q^.Next:=P^.Next;
P^.Next:=Q;
procedure DelAfter(var Q: PNode; var X: Integer);
var
Q: PNode;
begin
Q:=P^.Next;
P^.Next:=Q^.Next;
X:=Q^.Info;
Dispose(Q);
end;
Приклади типових операцій над списками
Задача 1.
Вимагається проглянути список і видалити елементи, у яких інформаційні поля дорівнюють 4.
Позначимо P – робочий покажчик, на початку процедури P = Lst. Введемо також покажчик Q, який відстає на один елемент від P. Коли покажчик P знайде елемент, останній буде видалений щодо покажчика Q як наступний елемент.
Q = Nil
P = Lst
While P <> Nil do
If Info(P)= 4 then
If Q = Nil then
Pop(Lst)
FreeNode(P)
P = Lst
Else
DelAfter(Q, X)
EndIf
Else
Q = P
P = Ptr(P)
EndIf
EndWhile
Задача 2.
Дано впорядкований за збільшенням Info – полів список. Необхідно вставити в цей список елемент із значенням X, не порушивши впорядкованості списку.
Нехай X = 16. Початкова умова: Q = Nil, P = Lst. Вставка елемента повинна відбутися між 3 і 4 елементом.
Q =Nil
P = Lst
While (P <> Nil) and (X > Info(P)) do
Q = P
P = Ptr(P)
EndWhile
if Q = Nil then
Push(Lst, X)
EndIf
InsAfter(Q, X)
Реалізація прикладів на мові Паскаль:
Задача 1:
Q:=nil;
P:=Lst;
While P <> nil do
If P^.Info = 4 then
begin
If Q = nil then
begin
Pop(Lst);
P:=Lst;
end
Else Delafter(Q,X);
End;
Else
begin
Q:=P;
P:=P^.Next;
end;
end;
Задача 2:
Q:=nil;
P:=Lst;
While (P <> nil) and (X > P^.Info) do
begin
Q:=P;
P:=P^.Next;
end;
{Тут відбувається вставка}
If Q = nil then Push(Lst, X);
InsAfter(Q, X);
End;