/* AccountLinkedList — поддерживает связанный */
/* список объектов Account */
#include "AccountLinkedList.h"
namespace Lists
{
/* addNode — добавляет узел в начало текущего связанного списка */
void AccountLinkedList::addNode( Node* pNode )
{
pNode -> pNext = pHead ;
pHead = pNode ;
}
}
Задача, решаемая программой BUDGET, очень проста. Тем не менее сравнение разных версий этой программы даёт вам представление об отличии чисто функционального программирования ( BUDGET1 ) от объектно-основанного ( BUDGET2 ) и объектно-ориентированного программирования ( BUDGET3 ).
Основная проблема программы BUDGET3 в том, что связанный список, который в ней реализован, в состоянии работать только с классом Account и никаким другим. Проделав такую работу по созданию связанного списка, вы, вероятно, захотите использовать его и в других программах — например, для хранения информации о студентах.
Программа BUDGET4 расширяет рамки применения класса LinkedList . Чтобы разобраться в том, как она это делает, вы должны сперва ознакомиться с материалом главы 27.
_________________
365 стр. Глава 31. Программа BUDGET
Программа BUDGET имитирует работу банка, позволяя вкладывать и снимать деньги со счёта. Пользователь вводит последовательность банковских счетов, причём для каждого счёта вводится серия вкладов на счёт и снятия денег со счёта. После того как будут введены все счета и все транзакции, программа выводит состояние всех счетов ( а также общий баланс по всем счетам ). В программах BUDGET2 и BUDGET3 имитируются два вида счетов — чековый и сберегательный. Чековый счёт отличается тем, что если на нём остаётся меньше 500 долларов, то за каждый обработанный чек удерживается 20 центов. Первое снятие со сберегательного счёта выполняется бесплатно, а каждое последующее обходится в 5 долларов, независимо от состояния счёта. Программа BUDGET2 использует для решения поставленной задачи функции, a BUDGET3 — объектно-ориентированные концепции из четвёртой части книги.
Кроме того, программа BUDGET3 использует для хранения счетов связанный список, что позволяет снять ограничение на количество обрабатываемых счетов, налагаемое в первых двух версиях использованием массивов. К сожалению, представленный в программе класс AccountLinkedList недостаточно гибок из-за привязки к классу Account .
Программа BUDGET4 использует шаблоны, которые позволяют убрать ограничения, состоящие в привязке списка к конкретному типу хранимых данных.

«Шаблонам посвящён материал главы 27, "Шаблоны С++".»
[ Помни! ]
Реализация связанного списка в виде шаблона класса...366
Приведённый далее шаблон класса LinkedList выглядит практически идентично классу AccountLinkedList из программы BUDGET3, если заменить класс Node обобщённым классом Т .
/* LinkedList — связанный список произвольных объектов */
#ifndef _ACCOUNTLINKEDLIST_
#define _ACCOUNTLINKEDLIST_
/* Предварительное объявление класса LinkedList */
template < class T > class LinkedList;
/* Node — узел связанного списка; каждый */
/* узел указывает на объект Т */
template < class T > class Node
{
public:
Node(LinkedList< T >* pL, T* pT)
{
pList = pL;
pNext = 0;
pObject = pT;
}
Node< T >* next( ) { return pNext; }
Node* next(Node< T >* pN) { pNext = pN;
return pNext; }
T* current( ) { return pObject; }
_________________
366 стр. Часть 6. Великолепная десятка
protected:
LinkedList< T >* pList;
Node< T >* pNext;
T* pObject;
};
/* LinkedList — связанный список объектов Node */
template < class T > class LinkedList
{
public :
LinkedList< T >( ) { pFirst = 0 ; }
Node< T >* firstNode( ) { return pFirst ; }
Node< T >* lastNode( )
{
/* Если список пуст, возвращает 0 */
if ( pFirst == 0 )
{
return 0 ;
}
/* В противном случае ищем последний элемент списка */
Node< T >* pN = pFirst ;
while ( true )
{
Node< T >* pNext = pN -> next( ) ;
if ( pNext == 0 )
{
break ;
}
pN = pNext ;
}
return pN ;
}
void addNode( Node< T >* pNode )
{
Node< T >* pN = lastNode( ) ;
if ( pN == 0 )
{
pFirst = pNode ;
}
else
{
pN -> next( pNode ) ;
}
}
protected :
Node< T >* pFirst ;
Читать дальше