//---------------------------------------------------------------------------
// 
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------

#include <iostream.h>

template<class T>
List<T>::List(T &v)
{
  first =new Node<T>(v);
}


template<class T>
List<T>::List(const List<T> &r)
{
	Node<T> *p = r.first;
	while(p != 0)
	{
		Add_at_bottom(p ->Data);
		 p=p->next;
	}
}

template<class T>
void List<T>::Add_to_top ( const T &v)
{
	Node<T> *node = new Node<T>(v);

	node->next= first;

	first= node;
}

template<class T>
void List<T>::Add_at_bottom(const T &v)
{
	Node<T> *node =new Node<T>(v);
	Node<T> *tempPtr=first;

        	if ( first==0)
		first = node;

		while( tempPtr->next!= 0 )
            	     {
                      tempPtr=tempPtr->next;
                     }

		tempPtr->next=node;
}

template<class T>
void List<T>::Display()
{
    Node<T> *temp=first;
    int i=1;
        while (temp!=0)
          {
          cout<<"value "<<i++<<" is : "<<temp->Data<<endl;
          temp=temp->next;
          }
}

template<class T>
List<T>::~List()
{
	    Node<T> *p =first;

	while( p!= 0)
	{
		p = p->next;

		delete p;
      	}
}

template<class T>
T &List<T>:: operator[](int index)
const
{
	Node<T> *Temp =first;
	int i=0;
	while(Temp->next !=0)
	{
		i++;
		if(i == index)
			return Temp->Data;

			Temp=Temp->next;
	}
	return first->Data;
}
template<class T>
void List<T>::Remove(T &v)
{

	Node<T>  *Temp =first ;
	Node<T> *Last=first;

	if (Temp->Data == v)
	{
		first=Temp->next;
		delete Temp;
			
	}
 
	Last= first;
    Temp= first->next;
   while(Temp != 0)
   {

	   if(Temp->Data == v)
	   {
		   Last->next=Temp->next;
		   delete Temp;
                    Temp=Last->next;
	   }
            Last=Last->next;
      	    Temp=Temp->next;


   }
}	
//--------------------------NODE--------------------------------
template<class T>

Node<T>::Node(const T &v)
{
  Data = v;
  next= 0;
}



#pragma package(smart_init)
