714_____________________________________________Глава 12

if(PO == NULL) PO = Pnew; // PO — указатель на первую структуру
else Pold->pr = Pnew;     // указатель на очередную структуру
Pold = Pnew;

Если список еще не начат (PO = NULL), то указателю PO присваивается ссыл-
ка на вновь размещенную структуру (Pnew). В противном случае ссылка на новую
структуру присваивается полю рг предыдущей структуры в списке (Pold). Таким
образом новая структура включается в общий список. Полю рг этой структуры
присваивается значение NULL. Это является признаком того, что данная структу-
ра является последней в списке.

Сформировав список в памяти далее легко его просматривать, проходя в цик-
ле по указателям. Например:

Pnew = PO;

while(Pnew != NULL)

<
ShowMessage(Pnew->Fam + " " + Pnew->Nam + " " + Pnew->Par) ;

Pnew = Pnew->pr;         // переход к новой структуре

)

Легко также делать в списке перестановки структур, их удаление и т.п. Для
всех этих операций не надо ничего перемещать в памяти. Достаточно только изме-
нять соответствующие ссылки в полях рг.

Раньше подобные списки широко использовались для создания в памяти сте-
ков, очередей и других упорядоченных списков. Однако, в C++Builder введены
специальные типы данных TList и TStringList, которые ведут подобные списки и
имеют множество удобных методов для управления ими. Изучите эти типы, рас-
смотренные в главе 15.

12.11.3 Структуры в стиле C++

Все, что рассмотрено в предыдущих разделах, относится как к языку С, так и
к C++. Но в C++ понятие структуры существенно расширено и приближено к по-
нятию класса (см. раздел 12.13).

В частности, в структурах кроме рассмотренных ранее данных-элементов раз-
решается описывать функции-элементы. Рассмотрим это на примере использован-
ной в предыдущих разделах структуры TPers. Давайте введем в эту структуру
функцию-элемент Show, отображающую информацию, хранящуюся в структуре:

struct TPers {

AnsiString Fam,Nam,Par;

unsigned   Year;

bool       Sex;

AnsiString Dep;

TPers * pr;

void Show()
{

ShowMessage("Сотрудник отдела \""+Dep+"\" "+Fam+" "+Nam+" "+
Par+", "+IntToStr(Year)+" г.р., пол "+
(Sex ? "мужской" : "женский"));

Функция Show отображает информацию вида: «Сотрудник отдела «Бухгалте-
рия» Иванов Иван Иванович, 1960 г.р., пол мужской».

Обращение к этой функции-элементу производится через переменную струк-
туру операцией точка или через указатель на переменную операцией стрелка. На-
пример:

Pers.Show() ;

Pnew->Show();