// Symmetrically linked list implementation
// By: Nick Cash
// Coded for Computer Science III

// Test all functions belonging to the cList class

#include <iostream>

using namespace std;

int main ( void )
{
 cList<int> list;

 list.PushFront(7);
 list.PushFront(6);
 list.PushFront(5);
 list.PushBack(8);
 list.PushBack(5);
 
 // list should be 5,6,7,8,5
 cout << "\nOriginal list:";
 list.Print();
 cout << "\nSize:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;

 cout << "\nReversing...";
 list.Reverse();
 list.Print();
 cout << "\nSize:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;

 cout << "\nReversing again...";
 list.Reverse();
 list.Print();
 cout << "\nSize:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;

 cout << "\nPerforming traversal and inserting 9 after 8";
 for ( cList<int>::Element* iter = list.GetStart(); iter; iter = iter->GetNext() )
 {
   cout << "\nData -> " << iter->data;
   
   if ( iter->data == 8 )
   {
     cList<int>::Element* x = new cList<int>::Element;
     
     x->data = 9;
     
     list.Insert( x, iter->GetNext() );
   }
 }
 
 cout << "\n\nPerforming reverse traversal:";
 for ( cList<int>::Element* iter = list.GetEnd(); iter; iter = iter->GetPrev() )
 {
   cout << "\nData -> " << iter->data;
 }
 
 cout << "\n\nPopping front...";
 list.PopFront();
 list.Print();
 cout << "\nSize:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;
 cout << "\nReadding 5...";
 list.PushFront(5);
 list.Print();
 cout << endl << endl;

 cout << "\nPopping back...";
 list.PopBack();
 list.Print();
 cout << "\nSize:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;
 cout << "\nReadding 5...";
 list.PushBack(5);
 list.Print();
 cout << endl << endl;
 
 cout << "\nDeleting 7...\n\n";
 list.Delete(7);
 cout << "\nNew list:";
 list.Print();
 cout << "\nSize:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;

 cout << "\n\nErasing 5...\n\n";
 list.Erase(5);
 cout << "\nNew list:";
 list.Print();
 cout << "\nSize:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;
 
 cout << "\n\nClearing list...\n\n";
 list.Clear();
 cout << "Size:  " << list.Size() << endl;
 cout << "Empty: " << (list.Empty() ? "Yes" : "No") << endl;

 cin.get();

 return EXIT_SUCCESS;
}