| 
| 
 | Вопрос # 2 358/ вопрос открыт / | 
 |  Здравствуйте! Подскажите пожайлуста, как написать процедуры удаления элемента списка с определенным порядковым номером.Номер вводиться пользователем. Мой вариант в приложении не работает....почему? Приложение:Переключить в обычный режим TypeL1=^elem;elem=record  D:real;  link:l1;  end;var  Form1: TForm1;  f1,f2:L1;  Pn,P:L1;   implementation {$R *.dfm}   p1:L1;beginp1:=f1;i:=1;Label1.Caption:='';while p1<>nil do  begin  label1.Caption:=label1.Caption+#13+floattostr(p1.D);  p1:=p1^.link;  i:=i+1;  end;end;   If f1=nil then  beginRandomize;new(f1);f1^.D:=random(9)/10;f1^.link:=nil;p:=f1;  end else begin new(f2);f2^.D:=random(9)/10;f2^.link:=nil;p.link:=f2;P:=f2;  end;end; procedure TForm1.FormActivate(Sender: TObject);beginRandomize;f1:=nil;end;          i:integer;begindel:=f1;i:=1 ;While del<>nil doIf del=k then beginprev^.link:=nil;del.link:=f2;P:=prev.link;end;   end; end.
|  |   Вопрос задала: Milady (статус: Посетитель)Вопрос отправлен: 28 января 2009, 10:45
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Milady!Почему не удаляет? Потому что есть как минимум парочка логических ошибок. Рассмотрим подробнее
 
 procedure TForm1.Button3Click(Sender: TObject);  // процедура удаления элемента
var k:l1;   //номер удаляемого элемента                <<<<<< Точно номер??? Может указатель на нужный элемент?
    del:l1; //текущее значение
     prev:L1; //предыдущее значение
     i:integer;
begin
del:=f1;
i:=1 ;
While del<>nil do
If del=k then begin //k то мы используем, а где его инициализация? там неопределённое значение.
prev^.link:=nil; //м, интересный ход, а куда этот prev собственно указывает? Это называется "расстрел памяти".
del.link:=f2; //оу, а это откуда и зачем???
P:=prev.link;//ещё один двойной... правда делфи всё таки это поймёт как prev^.link....
end;
end;Ок, попробуем переписать. судя по коду - f1 - это голова списка. пусть k - это номер удаляемого элемента
 var curr, prev, del:l1;
k:integer;
i:integer;
begin
  k := 3; //ввод номера удаляемого элемента.
  curr := f1;
  prev := nil;
  i := 0;
  while curr <> nil do begin
    inc(i);
    if i = k then begin
      del := curr;
      if prev = nil//Удаляем голову
        f1 :=curr
      else //удаляем где то в середине
        prev^.link := curr^.link;
      dispose(del);
     break;//Выходим с цикла
    end;
    prev := curr;
    curr := curr^.link;
  end;
end;Вот где то так. Хотя в вузе могут дать и другой алгоритм поиска-удаления... Есть как минимум еще пара способов сделать это.
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 28 января 2009, 12:11
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 28 января 2009, 13:19; участников в обсуждении: 2. 
|   | Milady (статус: Посетитель), 28 января 2009, 12:55 [#1]:А возможно ли удалить первый нулевой элемент, если он есть? |  
|   | Вадим К (статус: Академик), 28 января 2009, 13:19 [#2]:в моем примере я их занумеровал с единицы. Поэтому удалить нулевой нельзя - его нет просто. Но если хочется, что бы он был, нужно просто перенести  inc(i); в конец цикла. и всё.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |