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 ) {
_at_end = prev;
return elem_cnt;
}
}
else {
prev = plist;
plist = plist-next();
}
return elem_cnt;
}
Следующая программа проверяет работу операций в четырех случаях: когда удаляемые элементы расположены в конце списка, удаляются все элементы, таких элементов нет или они находятся и в начале, и в конце списка.
#include iostream
#include "ilist.h"
int main()
{
ilist mylist;
cout "\n-----------------------------------------------\n"
"тест #1: - элементы в конце\n"
"-----------------------------------------------\n";
mylist.insert_front( 1 ); mylist.insert_front( 1 );
mylist.insert_front( 1 );
my1ist.insert_front( 2 ); mylist.insert_front( 3 );
my1ist.insert_front( 4 );
mylist.display();
int elem_cnt = mylist.remove( 1 );
cout "\n" "Удалено " elem_cnt
" элемент(ов) со значением 1\n";
mylist.display();
mylist.remove_all();
cout "\n-----------------------------------------------\n"
"тест #2: - элементы в начале\n"
"-----------------------------------------------\n";
mylist.insert_front( 1 ); mylist.insert_front( 1 );
mylist.insert_front( 1 );
mylist.display();
elem_cnt = mylist.remove( 1 );
cout "\n" "Удалено " elem_cnt
" элемент(ов) со значением 1\n";
mylist.display();
mylist.remove_all () ;
cout "\n-----------------------------------------------\n"
"тест #3: - элементов нет в списке\n"
"-----------------------------------------------\n";
mylist.insert_front( 0 ); mylist.insert_front( 2 );
mylist.insert_front( 4 );
mylist.display();
elem_cnt = mylist.remove( 1 );
cout "\n" "Удалено " elem_cnt
" элемент(ов) со значением 1\n";
mylist.display();
mylist.remove_all () ;
cout "\n-----------------------------------------------\n"
"тест #4: - элементы в конце и в начале\n"
"-----------------------------------------------\n";
my1ist.insert_front( 1 ); mylist.insert_front( 1 );