Варианты данных процедур, в которых параметр Cmt отсутствует, добавлены в версию 4.11 конструктора.
procedure DataList(NP: integer; X, Y: integer);
procedure ResultList(NP: integer; X, Y: integer);
Процедуры DataList и ResultList предназначены для помещения структуры типа одно- или двусвязный линейный динамический список" в набор исходных или, соответственно, результирующих данных, а также для вывода этой структуры на экран. Параметр NP задает номер указателя (предварительно определенный процедурой SetPointer), который указывает на начало данного списка, т. е. на его первый элемент. Если соответствующий указатель является нулевым, то список считается пустым. Пустой список на экране не отображается.
Непустой динамический список отображается на двух экранных строках; первая строка содержит имена указателей, входящих в задание и связанных с данным списком (они задаются процедурой ShowPointer), во второй строке -- значения элементов списка (точнее, их полей Data целого типа) и виды связи между элементами.
Если память для элемента результирующего списка должна быть выделена программой учащегося, то значение его поля Data на экране обрамляется точками (например, .23.). Если в исходной динамической структуре требуется разрушить один или несколько элементов, то эти элементы выделяются более бледным цветом, а в случае, если программа учащегося не освободит память, занимаемую этими элементами, они будут выделены красным цветом. Наконец, если в списке, преобразованном программой учащегося, элементы располагаются не на требуемых местах, то они заключаются в скобки (например, (23)), а если элемент списка содержит ошибочную ссылку Next, то она помечается двумя красными звездочками (например 46 - **). Красные звездочки указываются в конце списка также в случае, если его длина превышает максимально допустимую. Специальные обозначения используются также для циклических списков (см. пример 3).
Элемент данных типа линейный список" должен содержать не более 14 элементов типа TNode, причем значения их полей Data должны лежать в диапазоне от -9 до 99, поскольку для каждого поля Data отводится по две экранные позиции. Для большей наглядности рекомендуется использовать числа из диапазона 10-99, резервируя однозначные и отрицательные числа для особых элементов (например, барьерного элемента циклического списка -- см. задание Dynamic70). Если значение элемента списка не умещается в поле вывода, то в его последней экранной позиции выводится красная звездочка -- признак ошибки.
Для отображения списка как двусвязного необходимо, чтобы в его элементах были определены поля связи Next и Prev; в этом случае связи между соседними элементами списка обозначаются двойными линиями: =". Если в задании требуется использовать односвязный список, то для его элементов надо определить поле связи Next, а для полей Prev следует указать значение, не связанное с элементами этого списка (например, адрес какой-либо глобальной переменной типа TNode). Связи между элементами односвязных списков обозначаются одинарными линиями: "-".
Вызов процедуры DataList или ResultList приводит к тому, что соответствующий список становится текущей динамической структурой для данного задания. Все последующие вызовы процедур ShowPointer, SetNewNode и SetDisposedNode будут влиять на эту текущую структуру.
procedure DataBinTree(NP, X, Y1, Y2: integer);
procedure ResultBinTree(NP, X, Y1, Y2: integer);
procedure DataTree(NP, X, Y1, Y2: integer);
procedure ResultTree(NP, X, Y1, Y2: integer);
Эти процедуры предназначены для включения в задание бинарных деревьев и деревьев общего вида (называемых также деревьями с произвольным ветвлением) в качестве исходных (DataBinTree и DataTree) или результирующих (ResultBinTree и ResultTree) данных. Для деревьев общего вида используется представление левая дочерняя вершина -- правая сестра" ("left child -- right sibling"). Как и для процедур DataList и ResultList, описанных выше, первым параметром этих процедур является номер указателя типа PNode, ранее определенного с помощью процедуры SetPointer. В данном случае этот указатель должен указывать на корень добавляемого в задание дерева; если он является нулевым указателем, то дерево считается пустым и не отображается на экране. В отличие от процедур, связанных с линейными списками, для отображения дерева можно (и рекомендуется) выделять на экране более двух строк; номера начальной и конечной экранной строки задаются параметрами Y1 и Y2 соответственно. В отличие от других "прокручиваемых" данных (а именно типизированных и текстовых файлов), дерево может не занимать выделенные для него строки по всей ширине: параметр X показывает, начиная с какой позиции экранных строк будет отображаться дерево и связанная с ним информация. Следует отметить, что использовать для других целей можно только левую часть строки, связанной с деревом; все позиции строки, начиная с позиции X, будут использоваться для отображения дерева.
Вызов любой из описываемых процедур приводит к тому, что соответствующее дерево становится текущей динамической структурой для данного задания. Все последующие вызовы процедур ShowPointer, SetNewNode и SetDisposedNode будут влиять на эту текущую структуру.
При отображении дерева используются обозначения, аналогичные тем, которые применяются при отображении линейных динамических структур. В частности, в качестве вершины изображается значение ее поля Data, причем для вывода этого значения выделяются две экранные позиции (если двух позиций недостаточно, например, в случае значения 234, то на второй из выделенных позиций изображается красная звездочка: 2*). В качестве обозначения связей между вершинами используются одинарные и двойные линии (-" и "="); двойные линии, как и для линейных списков, означают, что связь между вершинами является двусторонней (так называемые деревья с обратной связью -- см. пример 6). Обратная связь обеспечивается полем Parent; ее можно использовать только для бинарных деревьев.
Для деревьев предусмотрены два варианта отображения. Первый вариант предназначен для отображения бинарного дерева; он применяется для деревьев, включенных в задание процедурами DataBinTree и ResultBinTree. В этом варианте обе дочерние вершины располагаются ниже родительской вершины (на следующем уровне -- см. примеры 5 и 6). Второй вариант предназначен для отображения дерева общего вида (вершины которого могут содержать более двух дочерних вершин); он применяется для деревьев, включенных в задание процедурами DataTree и ResultTree. В этом варианте вершина, определяемая полем Left вершины P, как обычно, располагается ниже и левее вершины P и задает ее первую (левую) дочернюю вершину, а вершина, определяемая полем Right, моделирует следующую вершину- сестру" вершины P и поэтому располагается на том же уровне, что и вершина P. Такой способ отображения деревьев позволяет, в частности, легко определить глубину дерева общего вида и номер уровня для любой его вершины (см. пример 7).