Головной указатель является указателем типа LinkableClass*, и если использовать аналогию с цепочкой детей, держащихся за руки, то можно сказать, что учитель указывает на объект класса "ребёнок" ( любопытно отметить, что сам учитель не является ребёнком — головной указатель не обязательно должен иметь тип LinkableClass ).
«Не забывайте инициализировать указатели значением 0. Указатель, содержащий нуль, так и называется — нулевым. Обычно попытка обращения по адресу 0 вызывает аварийную остановку программы.»
[Атас!]
«Преобразование целочисленного нуля в тип LinkableClass* не обязательно. С++ воспринимает 0 как значение любого типа ( в частности, как "универсальный указатель" ).»
[Советы]
Чтобы увидеть, как связанные списки работают на практике, рассмотрим следующую функцию, которая добавляет переданный ей аргумент в начало списка.
void addHead( LinkableClass* pLC )
{
pLC -> pNext = pHead
pHead = pLC ;
}
Здесь после выполнения первой строки поле pNext указывает на первый член списка, а после второй строки заголовок списка указывает на добавленный элемент, что делает его первым элементом списка.
Другие операции над связанным списком...177
Добавление объекта в начало списка — самая простая операция со связанным списком. Хорошее представление о работе связанного списка даёт процедура прохода по нему до конца списка.
_________________
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 ) ;