Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_ rob_7_alg.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
137.22 Кб
Скачать

Однозв'язний список, як самостійна структура даних

Проглядання однозв'язного списку може проводитися тільки послідовно, починаючи з початку списку. Якщо необхідно проглянути попередній елемент, то треба знову повертатися до початку списку. Це – недолік однозв'язних списків в порівнянні із статичними структурами типу масиву. Спискова структура проявляє свої достоїнства, коли число елементів списку велике, а вставку або видалення необхідно провести усередині списку.

Приклад:

Необхідно вставити в існуючий масив елемент 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.

Для цього:

  1. Привласнюємо 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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]