Компонентный Паскаль/Связанный список: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 57:
Вставку нового элемента в список рационально (но не обязательно) реализовать в форме метода объекта. Представленный вариант ниже вставляет новый элемент только в конец списка. Для включения элемента в произвольное место, необходимо в объект TDblList свойство "cur"("current", "текущий"). Оно как раз и будет указателем на то место, куда вставлять. Предлагается такой вариант списка выполнить самостоятельно.
<source lang="oberon2">
PROCEDURE (l: TDblList)Insert(v:INTEGER), NEW;
VAR
el, el1 : POINTER TO TDblElem;
BEGIN
NEW(el);
IF l.len=0 THEN (* если список пустой *)
l.first:=el; (* назначить первый элемент *)
l.end:=el; (* назначить его же последним *)
l.end:=el
el.forward:=NIL; (* ссылки никда не показывают *)
ELSE
el.backward:=NIL;
el1:=l.end; (* сохранение бывшего последнего элемента *)
el.value:=v; (* присвоить значение из параметров *)
l.end:=el; (* присвоение нового элемента *)
el.first:=TRUE; (* установить флаги элемента *)
el1.forward:=el; (* создание перекрёстных ссылок *)
el.backwardlast:=el1;TRUE
ELSE
el.value:=v;
el1:=l.end; (* сохранение бывшего последнего элемента *)
END;
el1.forward:=el; (* создание перекрёстных ссылок *)
INC(l.len);
el1.last:=FALSE; (* больше не последний *)
END Insert;
l.end:=el; (* присвоение нового оследнего элемента *)
el.backward:=el1; (* показать на предыдущий *)
el.forward:=NIL; (* впереди ничего нет *)
el.value:=v; (* присвоить значение из параметра *)
el.first:=FALSE; (* выставить флаги *)
el.valuelast:=vTRUE;
END;
INC(l.len);
END Insert;
</source>
Работа с указателями в Компонентном Паскале упрощена до предела<ref name="указ">Традиционно считается, что работа с указателями сложна. На самом деле это не так сложно, если работать со строго типизированными данными. См. {{w|Указатель (тип данных)}}.</ref>. Если в предыдущих вариантах Паскаля (или даже во вполне современном FreePascal) использовалась специальная семантика для работы с указателями, то сейчас она изъята из языка, как излишняя. Ведь тип переменной известен точно<ref name="питон">Кроме Компонентного Паскаля, такая же простая работа с указателями присутствует в python. Но python -- язык динамический, а значит более медленный чем КП (примерно в 25-28 раз).</ref>. Во входных параметрах метода указана переменная "v". Она вместе с созданием нового элемента присваивает значение новому элементу.