- Код: Выделить всё
type
list = ^node;
node = record
elem: integer;
next: list;
end;
Пусть у нас есть список, L - ссылка на его голову. Я хочу удалить последний элемент списка. Вообще всегда это делается так:
- Код: Выделить всё
if L^.next = nil then begin
dispose(L);
L := nil;
end
else begin
p := L; {p - переменная ссылочного типа, которую необходимо описать в блоке var}
while p^.next^.next <> nil do
p := p^.next;
dispose(p^.next);
p^.next := nil;
end;
Вопрос вот в чем: почему нельзя просто присвоить p := L и пока p^.next <> nil присваивать p := p^.next; Затем просто dispose(p); p := nil. Так не работает, проверял, но не понимаю, почему. И еще непонятно следующее: почему в таком случае работает рекурсивная процедура по удалению последнего элемента списка:
- Код: Выделить всё
procedure DelLast(var p: list);
begin
if p^.next = nil then
begin
dispose(p);
p := nil;
end
else
DelLast(p^.next);
end;
В эту процедуру же мы передаем список по ссылке, то есть этот способ удаления вроде бы аналогичен способу, описанному выше, который, в свою очередь, не работает. Как так? Буду рад помощи, заранее спасибо!