
Список после удаления звена с элементом с
Удаляемое звено теперь можно уничтожить, освобождая занимаемый им участок памяти для других целей.
Алгоритм:
Надо изменить одну ссылку 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.