Программный модуль, реализующий операции
Разрушение списка
Рис. 28. Исключение узла, на который предварительно установлен указатель
Операция разрушения списка реализуется в процессе прохода по списку так, что элементы хранения всех узлов списка, начиная с первого, последовательно исключаются из списка и возвращаются в кучу. В результате выполнения операции разрушения список становится пустым, т.е. значение указателя на первый узел равно NIL. Для разрушения списка недостаточно просто присвоить NIL указателю на его первый узел (как иногда ошибочно полагают), т.к. в этом случае память, занятая элементами хранения узлов списка, в действительности не освобождается и в кучу не возвращается.
Uses Crt; | ||||||
Type PList = ^ List; | { описание элемента хранения узла списка и } | |||||
List = record | { указателя на узел списка } | |||||
info: word; link: plist; | ||||||
end; | ||||||
var f: PList; cod,n: byte; sum: word; | ||||||
Procedure Create1(var first: PList; n: byte); var p: PList; i: byte; begin first:=nil; | { first – указатель на первый узел списка } { n – количество узлов в списке } { создание пустого списка } | |||||
for i:=1 to n do begin | ||||||
new(p); | { создание узла списка } | |||||
write(‘Значение инф. поля‘, i, ‘-го элемента списка = ‘); | ||||||
readln(p^.info); | { заполнение информационного поля узла } | |||||
p^.link:=first; | { установка связи между вставленным узлом и списком } | |||||
first:=p; | { новое значение указателя на первый узел } | |||||
end; end; | ||||||
Procedure Print(first: PList); | { просмотр информац. полей узлов списка } | |||||
var p: PList; i: byte; | ||||||
begin i:=0; | ||||||
while (p <> nil) do begin | ||||||
inc(i); | ||||||
writeln(‘Информационное поле ‘, i, ‘-го элемента списка = ‘, p^.info); | ||||||
p:=p^.link; | ||||||
end; | ||||||
end; | ||||||
Procedure Work(first: PList; var s: word); | { суммирование значений информ. } | |||||
var p: PList; | { полей узлов списка } | |||||
begin s:=0; | ||||||
while (p <> nil) do begin | ||||||
s:=s+p^.info; p:=p^.link; | ||||||
end; | ||||||
end; | ||||||
Procedure Destroy(var first: PList); | { разрушение списка } | |||||
begin | ||||||
... | ||||||
end; | ||||||
Procedure Message; | { вспомогательная процедура } | |||||
begin | ||||||
writeln(‘Список пуст‘); write(‘Нажмите любую клавишу‘); readkey | ||||||
end; | ||||||
begin | ||||||
f:=nil; | { первоначально список пуст } | |||||
repeat Clrscr; | ||||||
writeln(‘1-Создание 2-Просмотр 3–Обработка 4–Разрушение 5-Выход‘); | ||||||
write(‘Код действия = ‘); readln(cod); | ||||||
case cod of | ||||||
1: begin | { создание списка } | |||||
write(‘Количество узлов в списке = ‘); readln(n); | ||||||
Сreate(f,n); write(‘Нажмите любую клавишу‘); readkey | ||||||
end; | ||||||
2: begin | { просмотр списка } | |||||
if f=nil then Message | ||||||
else begin | ||||||
Print(f); write(‘Нажмите любую клавишу‘); readkey | ||||||
end; | ||||||
3: begin | { обработка списка } | |||||
if f=nil then Message | ||||||
else begin | ||||||
Work(f,sum); writeln(‘Сумма значений инф. полей = ‘, sum); | ||||||
write(‘Нажмите любую клавишу‘); readkey | ||||||
end; | ||||||
4: begin | { разрушение списка } | |||||
if f=nil then Message | ||||||
else begin | ||||||
Destroy(f); writeln(‘Список разрушен‘); | ||||||
write(‘Нажмите любую клавишу‘); readkey | ||||||
end; | ||||||
5: Destroy(f) | { выход } | |||||
end; | ||||||
until (cod = 5); Clrscr | ||||||
end. | ||||||
|
|
|
|