
#include <iostream>
#include "dlist.h"


void Print_List( DList< int > & int_list )
{
  for ( int_list.First(); !int_list.Exhausted(); ++int_list ) {
	  std::cout << int_list.Current_Value( ) << " ";
  }
  std::cout << std::endl;
}

void Print_List_Rev( DList< int > & int_list )
{
  for ( int_list.Last(); !int_list.Exhausted(); --int_list ) {
    std::cout << int_list.Current_Value( ) << " ";
  }
  std::cout << std::endl;
}

void
main( )
{
  try{
    DList< int > int_list;
    DList <int> l2;

    int_list.Insert( 5 );
    int_list.Insert( 10 );
    int_list.Insert( 8 );
    
    std::cout << "\nInitial list\n";
    Print_List( int_list );
    l2 = int_list;
	Print_List(l2);
	//DList <int> l3(int_list);
	//Print_List(l3);
    std::cout << "\nResults of  Find(4) " << int_list.Find( 4 ) << std::endl;
    std::cout << "Results of  Find(10) " << int_list.Find( 10 ) << std::endl;
    int_list.Delete( );
    std::cout << "List after deleting 10 (middle element)\n";
    Print_List( int_list );
    
    int_list.Last();
    int_list.Insert( 20 );
    int_list.Insert( 3 );
    std::cout << "\nList after inserting 20 and 3 \n";
    Print_List( int_list );
    
    std::cout << "\nResults of  Find(5) " << int_list.Find( 5 ) << std::endl;
    int_list.Delete( );
    std::cout << " List after deleting 5 (first element)\n";
    Print_List( int_list );
    
    std::cout << "\nResults of  Find(3) " << int_list.Find( 3 ) << std::endl;
    int_list.Delete( );
    std::cout << "\nList after deleting 3 (last element)\n";
    Print_List( int_list );
  }
  catch (DList_error e) { 
    //
    //Error exception handler. We get here if any member routine 
    //of DList within the "try" block above "throws" an exception.
    // 
    std::cerr << "DList error: " << e.type << std::endl;
    exit(1);
  }

}
