Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 358

/ вопрос открыт /

Здравствуйте! Подскажите пожайлуста, как написать процедуры удаления элемента списка с определенным порядковым номером.Номер вводиться пользователем. Мой вариант в приложении не работает....почему?

Приложение:
  1. Type
  2. L1=^elem;
  3. elem=record
  4. D:real;
  5. link:l1;
  6. end;
  7. var
  8. Form1: TForm1;
  9. f1,f2:L1;
  10. Pn,P:L1;
  11.  
  12.  
  13.  
  14. implementation
  15.  
  16. {$R *.dfm}
  17.  
  18.  
  19.  
  20. p1:L1;
  21. begin
  22. p1:=f1;
  23. i:=1;
  24. Label1.Caption:='';
  25. while p1<>nil do
  26. begin
  27. label1.Caption:=label1.Caption+#13+floattostr(p1.D);
  28. p1:=p1^.link;
  29. i:=i+1;
  30. end;
  31. end;
  32.  
  33.  
  34.  
  35. If f1=nil then begin
  36. Randomize;
  37. new(f1);
  38. f1^.D:=random(9)/10;
  39. f1^.link:=nil;
  40. p:=f1;
  41. end else begin
  42.  
  43. new(f2);
  44. f2^.D:=random(9)/10;
  45. f2^.link:=nil;
  46. p.link:=f2;
  47. P:=f2;
  48.  
  49. end;
  50. end;
  51.  
  52. procedure TForm1.FormActivate(Sender: TObject);
  53. begin
  54. Randomize;
  55. f1:=nil;
  56. end;
  57.  
  58.  
  59.  
  60.  
  61.  
  62. i:integer;
  63. begin
  64. del:=f1;
  65. i:=1 ;
  66. While del<>nil do
  67. If del=k then begin
  68. prev^.link:=nil;
  69. del.link:=f2;
  70. P:=prev.link;
  71. end;
  72.  
  73.  
  74.  
  75. end;
  76.  
  77. end.


Milady Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: 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

Milady (статус: Посетитель), 28 января 2009, 12:55 [#1]:

А возможно ли удалить первый нулевой элемент, если он есть?
Вадим К

Вадим К (статус: Академик), 28 января 2009, 13:19 [#2]:

в моем примере я их занумеровал с единицы. Поэтому удалить нулевой нельзя - его нет просто.
Но если хочется, что бы он был, нужно просто перенести inc(i); в конец цикла. и всё.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 сентября 2020, 04:45
Выполнено за 0.02 сек.
Рейтинг@Mail.ru