Помощь - Поиск - Пользователи - Календарь
Полная версия: удаление
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Nikolay
Не получается сделать удаление из списка
Должно быть удаление из середины списка, а не только из начала

Код

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.
volvo
Цитата
Не получается сделать удаление из списка

Замени свой кусок (обработку 'd') на вот это:
if c = 'd' then

if not (head = nil) then begin
write ('удаление элемента: '); readln (f);

if head^.nomer = f then begin
cur := head^.next;
dispose(head);
head := cur;
end
else begin

cur := head;
repeat

if (cur^.next^.nomer = f) then begin
del :=cur^.next;
cur^.next := del^.next;
dispose(del);
del := nil
end
else cur := cur^.next;

until (cur^.next = nil);

end; { else }
end; { if not (head=nil) }

Это первое.

Второе: при добавлении элемента у тебя программа валится (Segmentation Fault). Ошибка здесь:
{ будем сравнивать введенное значение со значением текущего узла }
while(nomer>cur^.nomer) and (cur<>NIL) do ... { <--- Здесь !!! }

Поменяй порядок выполнения условий:
while(cur <> nil) and (nomer>cur^.nomer) do ...

и все будет работать (при невыполнении первого условия второе даже не будет проверяться)

P.S. А вообще, пересмотри структуру программы. Каждое действие: добавление/удаление/поиск вынеси в отдельную процедуру/функцию. Программа сразу станет намного более простой и читабельной, а что самое главное, полученные подпрограммы ты сможешь еще раз использовать в дальнейшем, чтобы не изобретать велосипед заново...
Guest
Спасибо за помощь
всё оказалось проще, чем мне казалось
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.