Реализация модуля со связанным списком...356

We use cookies. Read the Privacy and Cookie Policy

Основное ограничение, присущее первым двум версиям программы, заключается в том, что они обе используют для хранения счетов массивы фиксированного размера, так что количество счетов, которые эти программы могут обработать, изначально ограничено. Более разумное решение состоит в использовании связанных списков объектов. Проблема лишь в том, что связанные списки ничего не знают о банковских счетах.

Очевидно, что можно разделить концепцию связанных списков на два класса. Этот тип разделения хотя и отличен от рассматриваемого в книге, но не менее важен. Он разносит классы с отношением СОДЕРЖИТ в различные файлы.

«Контейнер ( такой как массив или связанный список ) СОДЕРЖИТ счета.»

[Помни!]

Интерфейс соответствующего класса определён в заголовочном файле AccountLinkedList.h

    /* AccountLinkedList — поддерживает связанный */

    /*                     список объектов Account */

    #ifndef _ACCOUNTLINKEDLIST_

    #define _ACCOUNTLINKEDLIST_

    /* Данное предварительное объявление — неприятное следствие того, что Account не является частью пространства имён */

_________________

356 стр. Часть 6. Великолепная десятка

    /* 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

Файл AccountLinkedList.cpp реализует простой связанный список банковских счетов.

_________________

357 стр. Глава 31. Программа BUDGET 

    /* AccountLinkedList — поддерживает связанный список объектов Account */

    #include "AccountLinkedList.h"

    namespace Lists

    {

        /* addNode — добавляет узел в начало текущего связанного списка */

        void AccountLinkedList::addNode( Node* pNode )

        {

            pNode -> pNext = pHead ;

            pHead = pNode ;

        }

    }

Каждый объект Node связан со своим объектом Account. Указатель Node::pNext указывает на следующий счёт в списке. Объект AccountLinkedList представляет весь связанный список целиком; указатель AccountLinkedList::pHead указывает на первый объект Node в списке. Для простоты функция addNode( ) добавляет объекты Node в начало списка.