Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс 2_ Лекция_1_Ссылочные типы в ТП.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
86.53 Кб
Скачать

Список после удаления звена с элементом с

Удаляемое звено теперь можно уничтожить, освобождая занимаемый им участок памяти для других целей.

Алгоритм:

Надо изменить одну ссылку p^.sled:=p^.sled^.sled;

В процедуре нужна локальная ссылка g для удаления ненужного звена

Procedure del(p:ss);

var g:ss;

Begin

g:=p^.sled;

p^.sled:=p^.sled^.sled;

dispose(g);

End;

Пример 7. Процедура вставки нового звена в список

Напишем процедуру, добавляющую к списку новое звено g с элементом m после звена, на которое указывает ссылка р.

Операция вставки нового звена требует изменения двух ссылок, геометрически – двух стрелок:

Список до вставки звена с элементом m

Список после вставки звена с элементом m

Алгоритм:

Необходимо определить две новые ссылки g^.sled и p^.sled

Чтобы вставить в список новое звено на первое место, достаточно в качестве ссылки р взять ссылку на заглавное звено

Procedure vstavka(p:ss;m:integer);

var g:ss; Begin

new(g);

g^.inf:=m;

g^.sled:=p^.sled;

p^.sled:=g;

End;

Пример 8. Процедура поиска звена в списке

Необходимо найти звено с заданным элементом. Результатом поиска будет ссылка rp на найденное звено с элементом m или пустая ссылка (rp=nil).

Алгоритм:

Необходимо организовать просмотр элементов списка (р – ссылка на звено с которого начинается просмотр, текущая ссылка). Просмотр следует закончить, когда найден нужный элемент p^.inf=m или просмотрен весь список p=nil

Рrocedure poisk(m:integer;p:ss; var rp:ss);

Begin

while (p^.inf<>m) and (p<>nil) do

p:=p^.sled;

rp:=p;

End;

Пример 9. Сформировать список натуральных чисел. Вывести список и количество элементов списка. Вставить в список нулевой элемент после элемента, равного 4. Если в списке нет элемента, равного 4, то удалить из списка второй элемент.

program spisok;

uses crt;

type

ss=^zveno;

zveno=record

inf:integer;

sled:ss

end;

var p,f,u:ss; i,m:integer;

Procedure form;

var s:integer;

Begin

New(u); p:=u; u^.inf:=0; u^.sled:=nil;

Writeln('input chislo');

Readln(s);

While s<>0 do

begin new (p^.sled);p:=p^.sled; p^.inf:=s; p^.sled:=nil;

inc(u^.inf); readln(s);

end; writeln

End;

Procedure print;

begin

writeln(' spisok');

p:=u^.sled;

while p<>nil do

begin write(p^.inf,' ');

p:=p^.sled

end;

writeln;

end;

Procedure vstavka(p:ss;m:integer);

var g:ss;

begin

new(g);

g^.inf:=m;

g^.sled:=p^.sled;

p^.sled:=g;

inc(u^.inf);

end;

Procedure del(p:ss);

var g:ss;

begin

g:=p^.sled;

p^.sled:=p^.sled^.sled;

dispose(g);

dec(u^.inf);

end;

Procedure poisk(m:integer;p:ss; var rp:ss);

begin

while (p^.inf<>m) and (p<>nil) do

p:=p^.sled;

rp:=p;

end;

BEGIN clrscr;

form;

print; writeln('kol-vo=', u^.inf);

p:=u^.sled;

poisk(4,p,f);

if f<>nil then vstavka(f,0) else del(s^.sled);

print; writeln('kol-vo=', u^.inf);

readln;

END.

6