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




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


inline ilist_item*

ilist::

next_iter()

{

    ilist_item *next = _current

                       ? _current = _current->next()

                       : _current;

    return next;

}

Если элемент, на который указывает _current, удален, могут возникнуть проблемы. Их преодолевают модификацией кода функций remove() и remove_front(): они должны проверять значение _current. Если он указывает на удаляемый элемент, функции изменят его так, чтобы он адресовал следующий элемент либо был равен 0, когда удаляемый элемент – последний в списке или список стал пустым. Модифицированная remove_front() выглядит так:

inline void

ilist::remove_front()

{

    if ( _at_front ) {

        ilist_item *ptr = _at_front;

        _at_front = _at_front->next();

        // _current не должен указывать на удаленный элемент

        if ( _current == ptr )

            _current = _at_front;

        bump_down_size();

        delete ptr;

    }

}

Вот модифицированный фрагмент кода remove():

while ( plist ) {

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

    {

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

        if ( _current == plist )

            _current = prev->next();

Что произойдет, если элемент будет вставлен перед тем, на который указывает _current? Значение _current не изменяется. Пользователь должен начать проход по списку с помощью вызова init_iter(), чтобы новый элемент попал в число перебираемых. При инициализации списка другим и при присваивании значение _current не копируется, а сбрасывается в 0.

Тестовая программа для проверки работы копирующего конструктора и оператора присваивания выглядит так::

#include <iostream>

#include "ilist.h"

int main()

{

    ilist mylist;

    for ( int ix = 0; ix < 10; ++ix ) {

        mylist.insert_front( ix );

        mylist.insert_end( ix );

    }

    cout << "\n" << "Применение init_iter() и next_iter() "

         << "для обхода всех элементов списка:\n";




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