#include <iostream.h>
#include <conio.h>
#include "ListeD.h"


ElementLista::ElementLista(int i)
{
	valoare=i;
	urmatorul=NULL;
	precedentul=NULL;
}


ListaD::~ListaD()
{
	ElementLista* ptr=capLista;
	while (capLista!=NULL)
	{
		capLista=capLista->urmatorul;
		delete ptr;
		ptr=capLista;
	}
}

void ListaD::Afisez()
{
	ElementLista* ptr=capLista;
	if (ptr==NULL)
		cout << "\n Structura de date este vida! ";
	else
		while (ptr!=NULL)
		{
			cout << " " << ptr->valoare;
			ptr=ptr->urmatorul;
		}
		cout <<"\n";
}

void ListaD::AfisezInvers()
{
	ElementLista* ptr=capLista;
	if (ptr==NULL)
		cout << "\n Structura de date este vida! ";
	else
	{
		while (ptr->urmatorul!=NULL)
			ptr=ptr->urmatorul;
		while (ptr!=NULL)
		{
			cout << " " << ptr->valoare;
			ptr=ptr->precedentul;
		}
	}
	cout <<"\n";
}

void ListaD::AdaugPrim(int i)
{
	ElementLista* ptr=new ElementLista(i);
	ptr->urmatorul=capLista;
	if (capLista!=NULL) capLista->precedentul=ptr;
	capLista=ptr;
}

void ListaD::AdaugUltim(int i)
{
	ElementLista* ptr, *ElementNou= new ElementLista(i);

	if (capLista==NULL)
		capLista=ElementNou;
	else
	{
		ptr=capLista;
		while(ptr->urmatorul!=NULL)
			ptr=ptr->urmatorul;
		ptr->urmatorul=ElementNou;
		ElementNou->precedentul=ptr;
	}
}

void ListaD::AdaugInainte(int i, int cheie)
{
	ElementLista* ptr, *ElementNou= new ElementLista(i);
	if (capLista==NULL)
		AdaugPrim(i);
	ptr=capLista;
	while((ptr->urmatorul->valoare!=cheie)&&(ptr->urmatorul->urmatorul!=NULL))
			ptr=ptr->urmatorul;
	ptr->urmatorul->precedentul=ElementNou;
	ElementNou->urmatorul=ptr->urmatorul;
	ElementNou->precedentul=ptr;
	ptr->urmatorul=ElementNou;
}

void ListaD::StergPrim()
{
	ElementLista* ptr=capLista;
	if (capLista!=NULL)
	{
		capLista=capLista->urmatorul;
		capLista->precedentul=NULL;
		delete ptr;
	}
}

void ListaD::StergUltim()
{
	ElementLista* ptr=capLista;
	if (capLista!=NULL)
	{
		while (ptr->urmatorul!=NULL)
			ptr=ptr->urmatorul;
		ptr->precedentul->urmatorul=NULL;
		delete ptr;
	}
}

void ListaD::StergCheie(int cheie)
{
	ElementLista* ptr=capLista;
	if (capLista!=NULL)
	{
		while(ptr!=NULL)
		{
			if (ptr->valoare==cheie) break;
			ptr=ptr->urmatorul;
		}
			
		if (ptr!=NULL)
		{
			ptr->precedentul->urmatorul=ptr->urmatorul;
			ptr->urmatorul->precedentul=ptr->precedentul;
			delete ptr;
		}
	}
}

void main()
{
	ListaD Lista;
	Lista.AdaugPrim(5);
	Lista.AdaugPrim(7);
	Lista.AdaugUltim(3);
	Lista.AdaugUltim(9);
	Lista.AdaugInainte(4,8);
	Lista.AdaugInainte(2,3);
	cout << "\n-------- inainte ----------\n";
	Lista.Afisez();
	cout << "\n--------  inapoi -----------\n";
	Lista.AfisezInvers();
	cout << "\n-------- stergere ----------\n";
	Lista.StergPrim();
	Lista.StergUltim();
	Lista.StergCheie(20);
	Lista.StergCheie(3);
	cout << "\n-------- inainte ----------\n";
	Lista.Afisez();
	cout << "\n--------  inapoi -----------\n";
	Lista.AfisezInvers();
	cout << "\n\n";
}