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



         

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


}

Результат работы программы:

Ok: после insert_front() и insert_end()

(20)( 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 )

Ищем значение 8: нашли? да!

Вставка элемента 1024 после 8

( 21 )( 9 8 1024 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 )

Удалено 2 элемент(ов) со значением 8

( 19 )( 9 1024 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 9 )

Удален первый элемент

( 18 )( 1024 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 9 )

Удалены все элементы

( 0 )( )

Помимо вставки элементов, необходима возможность их удаления. Мы реализуем три таких операции:

void remove_front();

void remove_all ();

int remove( int value );

Вот как выглядит реализация remove_front():

inline void

i1ist::

remove_front()

{

    if ( _at_front ) {

        ilist_item *ptr = _at_front;

        _at_front = _at_front->next();

        bump_down_size() ;

        delete ptr;

    }

}

remove_all() вызывает remove_front() до тех пор, пока все элементы не будут удалены:

void ilist::

remove_all()

{

    while ( _at_front )

        remove_front();

    _size = 0;

    _at_front = _at_end = 0;

}

Общая функция remove() также использует remove_front() для обработки специального случая, когда удаляемый элемент (элементы) находится в начале списка. Для удаления из середины списка используется итерация. У элемента, предшествующего удаляемому, необходимо модифицировать указатель _next. Вот реализация функции:

int ilist::

remove( int value )

{

    ilist_item *plist = _at_front;

    int elem_cnt = 0;

    while ( plist && plist->value() == value )

    {

        plist = plist->next();

        remove_front();

        ++elem_cnt;

    }

    if ( ! plist )

        return elem_cnt;

    ilist_item *prev = plist;

    plist = plist->next();

    while ( plist ) {

    if ( plist->value() == value ) {

        prev->next( plist->next() );

        delete plist;

        ++elem_cnt;

        bump_down_size();

        plist = prev->next();

        if ( ! plist ) {




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