my1ist.insert_front( 1 );
my1ist.insert_front( 0 ); mylist.insert_front( 2 );
my1ist.insert_front( 4 );
mylist.insert_front( 1 ); my1ist.insert_front( 1 );
mylist.insert_front( 1 );
mylist.display() ;
elem_cnt = mylist.remove( 1 );
cout "\n" "Удалено " elem_cnt
" элемент(ов) со значением 1\n";
mylist.display();
}
Результат работы программы:
-----------------------------------------------
тест #1: - элементы в конце
-----------------------------------------------
( 6 )( 4 3 2 1 1 1 )
Удалено 3 элемент(ов) со значением 1
( 3 )( 4 3 2 )
-----------------------------------------------
тест #2: - элементы в начале
-----------------------------------------------
( 3 )( 1 1 1 )
Удалено 3 элемент(ов) со значением 1
( 0 )( )
-----------------------------------------------
тест #3: - элементов нет в списке
-----------------------------------------------
( 3 )( 4 2 0 )
Удалено 0 элемент(ов) со значением 1
( 3 )( 4 2 0 )
-----------------------------------------------
тест #4: - элементы в конце и в начале
-----------------------------------------------
(9 )( 1 1 1 4 2 0 1 1 1 )
Удалено 6 элемент(ов) со значением 1
( 3 )( 4 2 0 )
Последние две операции, которые мы хотим реализовать, – конкатенация двух списков (добавление одного списка в конец другого) и инверсия (изменение порядка элементов на противоположный). Первый вариант 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();
}
}
Вот реализация функции reverse():
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 );
}
Тестовая программа для проверки этих операций выглядит так:
#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: