Читать «С++ для "чайников" .» онлайн - страница 245
Стефан Рэнди Дэвис
Метод displayResults( ) модифицирован для работы со связанным списком. В качестве аргумента этой функции передаётся связанный список, из которого функция считывает информацию. Цикл for начинается с первого объекта в списке, который возвращает вызов Node::firstNode( ). Переход к следующему объекту в списке осуществляется при помощи функции nextNode( ). Цикл завершает свою работу, когда вызов nextNode( ) возвращает 0.
Вывод на экран этой версии программы идентичен выводу предыдущей программы BUDGET2 с той разницей, что итоговая информация о счетах выводится в обратном порядке. Это связано с тем, что новые счета добавляются в начало списка.
Классы связанных списков...363
Связанный список создаётся при помощи двух классов — AccountLinkedList и Node, которые определены в заголовочном файле AccountLinkedList.h.
/* AccountLinkedList — поддерживает связанный */
/* список объектов Account */
#ifndef _ACCOUNTLINKEDLIST_
#define _ACCOUNTLINKEDLIST_
_________________
363 стр. . Программа BUDGET
/* Данное предварительное объявление — неприятное следствие того, что Account не является частью пространства имён Lists. Этой неприятности мы сумеем избежать в следующей версии программы */
class Account ;
namespace Lists
{
/* Предварительное объявление классов */
class AccountLinkedList ;
class Node ;
/* LinkedList — связанный список объектов Node */
class AccountLinkedList
{
public :
AccountLinkedList( ) { pHead = 0 ; }
void addNode( Node* pNode ) ;
Node* firstNode( ) { return pHead ; }
protected :
Node* pHead ;
} ;
/* Node — узел в связанном списке, указывающий на объект Account */
class Node
{
friend class AccountLinkedList ;
public :
Node( AccountLinkedList* pL , Account* pAcc )
{
pList = pL ;
pNext = 0 ;
pAccount = pAcc ;
pL -> addNode( this ) ;
}
static Node* firstNode( AccountLinkedList* pList )
{
return pList -> firstNode( ) ;
}
Node* nextNode( ) { return pNext ; }
Account* currentAccount( ) { return pAccount ; }
protected :
AccountLinkedList* pList ;
Node* pNext ;
Account* pAccount ;
} ;
}
#endif
_________________
364 стр. . Великолепная десятка
Я поместил оба класса — и AccountLinkedList, и Node — в пространство имён Lists для того, чтобы отделить их от класса Account. Класс AccountLinkedList содержит только заголовочный указатель связанного списка объектов Node.
«Заголовочный указатель — это указатель на первый элемент списка.»
[]
Основная работа выполняется в классе Node. Каждый узел Node указывает на следующий в списке объект при помощи члена pNext. Кроме того, узел также указывает на объект Account при помощи указателя pAccount. Указатель pList указывает на связанный список, которому принадлежит данный узел.