program dinlist1;
type
s_name=string[20];
p_student=^student;
student=record
name:s_name;
next:p_student;
end;
var
head:p_student; { начало списка }
buf:s_name; { буфер для ввода с клавиатуры }
{ добавление в начало списка}
procedure AddToList(var head:p_student;name:s_name);
var
curr:p_student;
begin
new(curr);
curr^.name:=name;
curr^.next:=head;
head:= curr;
end;
{ вывод списка }
procedure PrintList(p:p_student);
var
curr:p_student;
begin
curr:=p;
while curr<>NIL do begin
writeln(curr^.name );
curr:=curr^.next;
end;
end;
{Удаление узла из списка }
function DelNode(var head:p_student;name:s_name):boolean;
var
curr:p_student;
p:p_student;
done:boolean;
begin
p:=NIL;
curr:=head;
done:=FALSE;
while (done=FALSE) and (curr<>NIL) do begin
if curr^.name=name
then begin
if p=NIL
then head:=curr^.next
else p^.next:=curr^.next;
done:=TRUE;
end
else begin
p:=curr;
curr:=curr^.next;
end;
end;
DelNode:=done;
end;
{ основная процедура }
begin
repeat
write('Фамилия-> ');
readln(buf);
if length(buf)<>0
then AddToList(head,buf);
until length(buf)=0;
writeln('** Введенный список **');
PrintList(head);
writeln('** Удаление из списка **');
repeat
write('Фамилия-> ');
readln(buf);
if length(buf)<>0 then
if DelNode(head,buf)
then writeln('Элемент "',buf,'" удален из списка.')
else writeln('Элемента "',buf,'" в списке нет');
until length(buf)=0;
writeln ('** Список после удаления узлов **');
PrintList(head);
end.