Вы находитесь на странице: 1из 6

#include <iostream>

using namespace std;

template <typename Type>

struct dNode
{
Type data;
dNode *prev;
dNode *next;

dNode()
{
prev = NULL;
next = NULL;
}

dNode(const Type& data)


{
next = NULL;
prev = NULL;
this->data = data;
}
};

template <typename Type>

class dList
{
dNode<Type> *head;
dNode<Type> *tail;
unsigned int length;

public:

dList()
{
head = NULL;
tail = NULL;
length = 0;
}

dList(const dList<Type>& dr)


{
head = NULL;
tail = NULL;
length = dr.length;

dNode<Type> *c = dr.head;
if (!head && c)
{
head = new dNode<Type>(c->data);
tail = head;
c = c->next;
}

while (c)
{
Add_Tail(c->data);
c = c->next;
}

~dList()
{
dNode<Type> * c = head;
while (head)
{
head = head->next;
delete c;
c = head;
}

dList<Type>& operator= (const dList<Type>& dr)


{
if (this != &dr)

{
dNode<Type> *c = head;
while (head)
{
head = head->next;
delete c;
c = head;
}

head = NULL;
tail = NULL;
length = dr.length;

c = dr.head;
if (!head && c)
{
head = new dNode<Type>(c->data);
tail = head;
c = c->next;
}

while (c)
{
Add_Tail(c->data);
c = c->next;
}
}
return *this;

unsigned int Length() const


{
return length;
}
void Add_Tail(const Type& element)
{
dNode<Type>* p = new dNode<Type>(element);

if (tail == NULL)
{
tail = p;
head = p;
length++;
}

else
{
tail->next = p;
p->prev=tail;
tail = p;
length++;
}

void Add_Head(const Type& element)


{
dNode<Type> *p = new dNode<Type>(element);

if (head == NULL)
{
tail = p;
head = p;
length++;
}
else {
p->next = head;
head->prev= p;
head = p;
length++;
}
}

void Add_Pos(const Type& element, const unsigned int pos)


{

if (pos == 0) Add_Head(element);
else if (pos >= length) Add_Tail(element);

else

{ dNode<Type>* c = head;
unsigned int i = 0;
while ((i < pos - 1) && c)
{
i++;
c = c->next;
}

dNode<Type>*p = new dNode<Type>(element);


p->next = c->next;
p->prev = c;
c->next->prev = p;
c->next = p;

length++; }

int Search(const Type element) const


{
dNode<Type>* c = head;
unsigned int i = 0;

while (c)
{
if (c->data == element)
{
return i;
break;
}
c = c->next;
i++;
}
return -1;

int Remove(const Type& element)


{
if (head->data == element)
{
dNode<Type> *s = head;
head = head->next;
head->prev = NULL;
delete s;
length--;

return 0;
}

if (tail->data == element)
{
dNode<Type> *s = tail;

tail=tail->prev;
tail->next = NULL;
delete s;
length--;

return 0;
}

dNode<Type> *c = head;

while (c->next)
{
if (c->next->data == element)
{
dNode<Type> *s = c->next;
c->next = s->next;
s->next->prev = c;
delete s;
length--;

return 0;
}
c = c->next;
}

cout << "Elementul nu se gaseste in lista" << endl;


return -1;

void Afis() const


{
dNode<Type> *c = head;
if (c == NULL)
cout << "Lista e goala" << endl;
else
while (c)
{
cout << c->data << ", ";
c = c->next;
}
}

Type Element(const unsigned i) const


{
if (i > length) {
cout << "Niciun element pe aceasta pozitie" << endl;
return -1;
}

dNode<Type> *c = head;
unsigned int j = 0;
while ((j < i - 1) && (c))
{
c = c->next;
j++;
}

return c->next->data;

};

int main()
{
dList<int> lista1;
lista1.Add_Tail(3);
lista1.Add_Tail(4);
lista1.Add_Head(2);
lista1.Add_Head(1);
lista1.Add_Tail(5);

lista1.Afis();
cout << endl;
cout << lista1.Length() << endl << endl;

lista1.Add_Pos(10, 4);
lista1.Afis();
cout << endl;
cout << lista1.Length() << endl << endl;

lista1.Add_Tail(9);
lista1.Afis();
cout << endl;
cout << lista1.Length() << endl << endl;

cout << lista1.Remove(1) << endl;


lista1.Afis();
cout << endl;
cout << lista1.Length() << endl << endl;

cout << lista1.Remove(9) << endl;


lista1.Afis();
cout << endl;
cout << lista1.Length() << endl << endl;

dList<int> lista2(lista1);
lista2.Afis();
cout << endl << endl;

dList<int> lista3;
lista3 = lista2;
lista3.Afis();
cout << endl;

cout << lista1.Search(4) << endl;

cout << lista1.Remove(8) << endl;


lista1.Afis();
cout << endl;
cout << lista1.Length() << endl;
cout << lista1.Search(4)<<endl;

cout << endl << endl;


cout << lista1.Element(10) << endl;

system("PAUSE");

Вам также может понравиться