_________________
177 стр. Глава 14. Указатели на объекты
/* Проход по связанному списку */
LinkableClass* pL = pHead ;
while ( pL )
{
/* Выполнение некоторых операций */
/* Переход к следующему элементу */
pL = pL -> pNext ;
}
Сначала указатель pL инициализируется адресом первого объекта в списке ( который хранится в переменной pHead ). Затем программа входит в цикл while . Если указатель pL не нулевой, он указывает на некоторый объект LinkableClass . В этом цикле программа может выполнить те или иные действия над объектом, после чего присвоение pL = pL -> pNext "перемещает" указатель к следующему объекту списка. Если указатель становится нулевым, список исчерпан.
Программа LinkedListData...178
Программа LinkedListData использует связанный список для хранения списка объектов, содержащих имена людей. Программу очень легко расширить, добавив, например, номера социального страхования или вес. Просто я старался сделать программу максимально простой.
/* LinkedListData — хранение данных в связанном списке */
#include
#include
#include
#include
using namespace std ;
/* NameDataSet — хранит имя человека ( этот объект можно легко расширить для хранения другой информации ). */
class NameDataSet
{
public :
char szName[ 128 ] ;
/* Указатель на следующую запись в списке */
NameDataSet* pNext ;
} ;
/* Указатель на первую запись списка */
NameDataSet* pHead = 0 ;
/* Добавление нового члена в список */
void add( NameDataSet* pNDS )
{
pNDS -> pNext = pHead ;
/* Заголовок указывает на новую запись */
pHead = pNDS ;
}
/* getData — чтение имени */
NameDataSet* getData( )
{
_________________
178 стр. Часть 3. Введение в классы
// Читаем имя
char nameBuffer [ 128 ] ;
cout << "\nВведите имя:" ;
cin >> nameBuffer ;
/* Если это имя — 'exit'... */
if ( ( stricmp( nameBuffer , "exit" ) == 0 ) )
{
/* ...вернуть нулевое значение */
return 0 ;
}
/* Новая запись для заполнения */
NameDataSet* pNDS = new NameDataSet ;
/* Заполнение поля имени и обнуление указателя */
strncpy( pNDS -> szName , nameBuffer , 128 ) ;
pNDS -> szName[ 127 ] = '\0' ;
pNDS -> pNext = 0 ;
/* Возврат адреса созданного объекта */
return pNDS ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
cout << "Читаем имена студентов\n"
<< "Введите 'exit' для выхода\n" ;
/* Создание объекта NameDataSet */
NameDataSet* pNDS ;
while ( pNDS = getData( ) )
{
/* Добавление в конец списка */
add( pNDS ) ;
}
/* Итерация списка для вывода записей */
cout << "Записи:\n" ;
pNDS = pHead ;
while ( pNDS )
{
/* Вывод текущей записи */
cout << pNDS -> szName << "\n" ;
/* Получение следующей записи */
pNDS = pNDS -> pNext ;
}
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}

Несмотря на внушительную длину, программа LinkedListData относительно проста. Функция main( ) начинается с вызова функции getData( ) , которая считывает элемент NameDataSet с клавиатуры. Если пользователь вводит строку " exit ", getData( ) возвращает нуль. Функция main( ) вызывает функцию add( ) , чтобы добавить элемент, который вернула getData( ) , в конец связанного списка.
_________________
179 стр. Глава 14. Указатели на объекты
Если от пользователя больше не поступает элементов NameDataSet , функция main( ) выводит на экран все элементы списка, используя функцию displayData( ) .
Функция getData( ) выделяет из кучи пустой объект класса NameDataSet . После этого getData( ) ожидает ввода имени для записи его в соответствующее поле нового объекта. Если пользователь вводит в поле имени строку "exit" , функция уничтожает последний созданный объект и возвращает 0 . В противном случае getData( ) считывает фамилию и номер социального страхования, после чего обнуляет указатель pNext и передаёт управление вызывающей функции.

«Никогда не оставляйте связывающие указатели не проинициализированными! Старая поговорка программистов гласит: "Не уверен — обнули".»
Читать дальше