|
Вопрос # 2 358/ вопрос открыт / |
|
Здравствуйте! Подскажите пожайлуста, как написать процедуры удаления элемента списка с определенным порядковым номером.Номер вводиться пользователем. Мой вариант в приложении не работает....почему?
Приложение: Переключить в обычный режим- Type
- L1=^elem;
- elem=record
- D:real;
- link:l1;
- end;
- var
- Form1: TForm1;
- f1,f2:L1;
- Pn,P:L1;
-
-
-
- implementation
-
- {$R *.dfm}
-
-
-
- p1:L1;
- begin
- p1:=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 begin
- Randomize;
- 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);
- begin
- Randomize;
- f1:=nil;
- end;
-
-
-
-
-
- i:integer;
- begin
- del:=f1;
- i:=1 ;
- While del<>nil do
- If del=k then begin
- prev^.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); в конец цикла. и всё.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|