Создания, обработки, просмотра содержимого списка

Программный модуль, реализующий операции

Разрушение списка

Рис. 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.  
             

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: