Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
адреси та вказівники.doc
Скачиваний:
3
Добавлен:
27.08.2019
Размер:
1.15 Mб
Скачать

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.

Реалізуємо такий алгоритм:

  1. Порожній список залишається без змін.

  1. Якщо на задане значення вказує поле в голові списку, вилу­чимо його за допомогою процедури delElem.

  1. Якщо на задане значення поле у першому елементі не вка­зує, то перемістимося по зв'язках списку до елемента А, наступ­ний за яким вказує на задане значення. У цій ситуації поле 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).