- Код: Выделить всё
- 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;
В эту процедуру же мы передаем список по ссылке, то есть этот способ удаления вроде бы аналогичен способу, описанному выше, который, в свою очередь, не работает. Как так? Буду рад помощи, заранее спасибо!




