Должно быть удаление из середины списка, а не только из начала
Код
program sortspisok;
uses crt;
type
p_sort=^sspis;
sspis=record
nomer:string[20];
next:p_sort;
end;
var
head:p_sort; {указатель на первый элемент списка}
cur:p_sort; {текущий элемент списка}
p:p_sort; {элемент, после которого вставляем новый узел}
del:p_sort;
nomer:string[20]; {элемент ввод с клавиатуры}
node: p_sort; {новый узел списка}
c: char;
f: string;
n: byte;
begin
repeat
clrscr;
writeln ('сортированный список');
writeln ('');
writeln (' a - добавить элемент');
writeln (' d - удалить элемент');
writeln (' f - найти');
writeln (' e - выйти');
writeln;
writeln ('======');
if head = nil
then writeln ('<>')
else begin
cur := head;
repeat
writeln (cur^.nomer);
cur:=cur^.next;
until cur = nil;
end;
writeln ('======');
c := readkey;
{выход}
if c = 'e' then exit;
{удаление}
if c = 'd' then
if not (head = nil) then
begin
write ('удаление элемента : ');
readln (f);
cur := head;
del := nil;
repeat
if (cur^.nomer = f) then
begin
del :=cur^.next;
cur^:=del^;
del^.next:=nil;
{ dispose (del);}
{ del:=NIL;}
end;
{ cur^.next := cur^.next^.next;}
{ keypressed;} until cur<>nil;
end;
{поиск}
if c = 'f' then
begin
write ('найти элемент : ');
readln (f);
cur := head;
n := 0;
repeat
if cur^.nomer = f
then writeln ('..элемент №', n, ' = ', f);
cur := cur^.next;
inc (n);
until cur = nil;
repeat until keypressed; end;
{добавление }
if c = 'a' then
begin
write('элемент ');
readln(nomer);
if length (nomer)<>0 then begin
{введена строка символов}
new(node); {создадим новый элемент списка}
node^.nomer:=nomer;
node^.next:=NIL;
{ищем место для вставки нового элемента}
cur:=head;
p:=NIL;
{будем сравнивать введенное значение со значением текущего узла}
while(nomer>cur^.nomer) and (cur<>NIL) do
begin
{введенное значение больше текущего}
p:=cur;
cur:=cur^.next; {к следующему узлу}
end;
if p = NIL then
begin
{узел в начало списка}
node^.next:=head;
head:=node;
end
else
begin
node^.next:=p^.next;
p^.next:=node;
end;
end;
end;
until length(nomer)=0; { элемент не введен, нажата клавиша < Enter > }
{ распечатаем введенный список }
cur:=head;
{ writeln('Сортированный список ');
while cur<>NIL do begin
writeln(cur^.nomer);
cur:=cur^.next; end;}
readln;
end.