|
Программирование >> Инициализация объектов класса, структура
Последние две операции, которые мы хотим реализовать, - конкатенация двух списков (добавление одного списка в конец другого) и инверсия (изменение порядка элементов на противоположный). Первый вариант concat() содержит ошибку. Сможете ли вы ее void ilist::concat( const ilist &i1 ) { if ( ! at end ) at front = i1. at front; else at end->next( i1. at front ); at end = i1. at end; найти? Проблема состоит в том, что теперь два объекта ilist содержат последовательность одних и тех же элементов. Изменение одного из списков, например вызов операций insert() и remove() , отражается на другом, приводя его в рассогласованное состояние. Простейший способ обойти эту проблему - скопировать каждый элемент второго списка. Сделаем это при помощи функции insert end() : Результат работы программы: void ilist:: concat( const ilist &i1 ) i1ist item *ptr = i1. at front; while ( ptr ) { insert end( ptr->value() ); ptr = ptr->next(); void ilist:: reverse() { ilist item *ptr = at front; ilist item *prev = 0; at front = at end; at end = ptr; while ( ptr != at front ) ilist item *tmp = ptr->next(); ptr->next( prev ); prev = ptr; ptr = tmp; at front->next( prev ); Вот реализация функции reverse() : Тестовая программа для проверки этих операций выглядит так: #include <iostream> #include ilist.h int main() { ilist mylist; for ( int ix = 0; ix < 10; ++ix ) { mylist.insert front( ix ); } mylist.display(); cout << \n << инвертирование списка\n ; mylist.reverse(); mylist.display(); ilist mylist too; mylist too.insert end(0); mylist too.insert end(1); mylist too.insert end(1); mylist too.insert end(2); mylist too.insert end(3); mylist too.insert end(5); cout << \n << mylist too:\n ; mylist too.display(); mylist.concat( mylist too ); cout << \n << mylist после concat с mylist too:\n ; mylist.disp1ay(); Результат работы программы: ( 10 ) ( 9 8 7 6 5 4 3 2 1 0 ) инвертирование списка ( 10 ) ( 0 1 2 3 4 5 6 7 8 9 ) mylist too: ( 6 )( 0 1 1 2 3 5 ) mylist после concat с mylist too: ( 16 ) ( 0 1 2 3 4 5 6 7 8 9 0 1 1 2 3 5 ) С одной стороны, задачу можно считать выполненной: мы не только реализовали все запланированные функции, но и проверили их работоспособность. С другой стороны, мы не обеспечили всех операций, которые необходимы для практического использования списка. Одним из главных недостатков является то, что у пользователя нет способа перебирать элементы списка и он не может обойти это ограничение, поскольку реализация от него скрыта. Другим недостатком является отсутствие поддержки операций инициализации одного списка другим и присваивания одного списка другому. М1 сознательно не стали их реализовывать в первой версии, но теперь начнем улучшать наш класс. Для реализации первой операции инициализации необходимо определить копирующий конструктор. Поведение такого конструктора, построенного компилятором по умолчанию, совершенно неправильно для нашего класса (как, собственно, и для любого класса, содержащего указатель в качестве члена), именно поэтому мы с самого начала
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |