- •Адреси та вказівники
- •Вільна пам'ять
- •Динамічні масиви
- •Поняття динамічного лінійного списку
- •If not (s належить sqs) then
- •V : string;
- •Створення та обробка списку
- •Var p : pElem; begin
- •Var f:text; {вхідний текст}
- •If not isIn(s,h) {якщо рядка в списку немає}
- •Var sqs:pElem; {вказівник на голову списку}
- •Вилучення елемента списку
- •Var p:pElem; {допоміжний вказівник}
- •Var p:pElem; {допоміжний вказівник}
Var sqs:pElem; {вказівник на голову списку}
begin
createList(sqs);
writeList(sqs);
end.
Вилучення елемента списку
Розглянемо два випадки вилучення елементів зв'язаного списку — вилучення голови та вилучення елемента, який представляє задане значення.
Вилучення «голови»
Нехай вказівник h встановлено на голову списку. Якщо список порожній, значенням h є nil, тому дій з вилучення немає. Інакше встановимо на голову допоміжний вказівник р, перемістимо h на наступний елемент списку (якщо він є) й після цього звільнимо пам'ять з-під старої голови. При цьому спочатку треба звільнити пам'ять, яку займає рядок.
procedure delElem(var h:PElem);
Var p:pElem; {допоміжний вказівник}
begin
if h< >nil then begin
p:=h; {допоміжний вказівник на голову}
h:=h^.next; {головою буде наступний}
dispose(р^.pval); {звільнити пам'ять рядка} dispose(р) {звільнити пам'ять елемента}
end
end;
За допомогою цієї процедури неважко знищити весь список.
procedure delList(var h:PElem);
begin
while h< >nil do delElem(h) ;
end;
Вилучення елемента, який представляє задане значення
Розглянемо цю операцію на такому прикладі. Нехай елементи
списку зберігають вказівники на рядки; вилучити елемент, який
вказує на рядок, рівний заданому рядку s.
Реалізуємо такий алгоритм:
Порожній список залишається без змін.
Якщо на задане значення вказує поле в голові списку, вилучимо його за допомогою процедури delElem.
Якщо на задане значення поле у першому елементі не вказує, то перемістимося по зв'язках списку до елемента А, наступний за яким вказує на задане значення. У цій ситуації поле next в елементі А можна розглядати як вказівник на голову списку, яку треба вилучити. Тому застосуємо процедуру delElem до цього поля.
procedure delByVal(s:string; var h:PElem);
Var p:pElem; {допоміжний вказівник}
begin
if h< >nil then
if h^.pval^=s
then delElem(h)
else begin {Пошук елемента А,}
{наступний за яким вказує на s}
р: =h ;
while (р^ . next< >nil) and
(p^ . next^ .pval^ < >s) do p:=p^.next;
if p^.next< >nil {елемент А знайдено}
then delElem(p^.next);
end
end;
Можна додати цю процедуру до модуля uLString і використати, наприклад, для такої задачі: прочитати з текстового файла список прізвищ, вилучити з нього прізвища, які задано на клавіатурі, й записати решту в новий текстовий файл (для цього ще треба трохи модифікувати процедуру writeList).