С++ для начинающих



         

Пример связанного списка - часть 5


В общем случае желательно избегать аварийного завершения программы: в такой ситуации мы заставляем пользователя беспомощно сидеть и ждать, пока служба поддержки обнаружит и исправит ошибку.

Если мы не можем продолжать выполнение там, где обнаружена ошибка, лучшим решением будет возбуждение исключения: оно передает управление вызвавшей программе в надежде, что та сумеет выйти из положения.

Мы же поступим совсем другим способом: рассмотрим передачу нулевого указателя как запрос на вставку элемента перед первым в списке:

if ( ! ptr )

    insert_front( value );

Второй изъян в нашей версии можно назвать философским. Мы реализовали size() и _size как пробный вариант, который может впоследствии измениться. Если мы преобразуем функции size() таким образом, что она будет просто пересчитывать элементы списка, член _size перестанет быть нужным. Написав:

++_size;

мы тесно связали реализацию insert() с текущей конструкцией алгоритма пересчета элементов списка. Если мы изменим алгоритм, нам придется переписывать эту функцию, как и insert_front(), insert_end() и все операции удаления из списка. Вместо того чтобы распространять детали текущей реализации на разные функции класса, лучше инкапсулировать их в паре:

inline void ilist::bump_up_size()   { ++_size; }

inline void ilist::bump_down_size() { --_size; }

Поскольку мы объявили эти функции встроенными, эффективность не пострадала. Вот окончательный вариант insert():

inline void

ilist::

insert( ilist_item *ptr, int value )

if (       !ptr )

    insert_front( value );

else       {

    bump_up_size();

    new ilist_item( value, ptr );

    }

}

Реализация функций insert_front() и insert_end() достаточно очевидна. В каждой из них мы должны предусмотреть случай, когда список пуст.

inline void

ilist::

insert_front( int value )

{

    ilist_item *ptr = new ilist_item( value );

    if ( !_at_front )

        _at_front = _at_end = ptr;

    else {

        ptr->next( _at_front );

        _at_front = ptr;




Содержание  Назад  Вперед