Sa implementeze o clasa template ce implemeteaza notiunea de Lista.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
/* Declararea tipului abstract Lista */
template <class TipI>
class Lista;
/** Clasa Nod al unei liste*/
template <class TipI>
class Nod {
TipI info; //informatia
Nod<TipI> *next;//legatura catre urmatorul nod din lista
public:
Nod();//Constructor Implicit
Nod(TipI info,Nod<TipI>* next=0);//Constructor de initializare
TipI getInfo();//
void setInfo(TipI info);
Nod<TipI> *getNext();
void setNext(Nod<TipI>* next);
int operator == (Nod<TipI>&);
friend class Lista<TipI>;
};
/*Constructor implicit*/
template <class TipI>
Nod<TipI>::Nod(){
next=0;
}
/*Constructor de initializare*/
template <class TipI>
Nod<TipI>::Nod(TipI info, Nod<TipI>* next){
this->info=info;
this->next=next;
}
/* Intoarce informatia stocata in nod*/
template <class TipI>
TipI Nod<TipI>::getInfo(){
return info;
}
/* Seteaza informatia stocata in nod */
template <class TipI>
void Nod<TipI>::setInfo(TipI info){
this->info=info;
}
/* Intoarce adresa elementului urmator*/
template <class TipI>
Nod<TipI> *Nod<TipI>::getNext(){
return next;
}
/* Seteaza adresa elementului urmator*/
template <class TipI>
void Nod<TipI>::setNext(Nod<TipI>* next){
this->next=next;
}
/* Supraincarcarea operatorului == */
template <class TipI>
int Nod<TipI>::operator == (Nod<TipI> &n){
return this->info==n.info;
}
/** Clasa Lista simplu inlatuita*/
template <class TipI>
class Lista {
protected:
Nod<TipI> *prim;
Nod<TipI> *ultim;
public:
Lista(); //constructor implicit
Lista(const Lista<TipI>& L); //constructor de copiere
~Lista(); //destructor
int isEmpty();
void clear();
void addElement(TipI info);
Nod<TipI>* getFirst();//intoarce primul elemnt din lista
Nod<TipI>* getLast(); //intoarce ultimul element din lista
Nod<TipI>* getElementAt( int index);
int getNrElemente();
void print();
TipI& operator[] (int index);
Lista<TipI>& operator=(Lista<TipI> &);
};
/** Implementarea clasei Lista*/
template <class TipI>
Lista<TipI>::Lista(){
prim=ultim=0;
}
template <class TipI>
Lista<TipI>::Lista(const Lista<TipI>& L){
Nod<TipI> *p;
prim=ultim=0;
p=L.prim;
while (p){
addElement(p->info);
p = p->next;
}
}
template <class TipI>
Lista<TipI>::~Lista(){
clear();
}
template <class TipI>
int Lista<TipI>::isEmpty(){
return prim==0;
}
template <class TipI>
void Lista<TipI>::clear(){
Nod<TipI> *p, *q;
p = prim;
while (p){
q=p;
p=p->next;
delete q;
}
prim = ultim = 0;
}
template <class TipI>
Lista<TipI>& Lista<TipI>:: operator=(Lista<TipI> &L){
clear();
Nod<TipI> *p =L.prim;
while(p){
addElement(p->info);
p=p->next;
}
return *this;
}
template <class TipI>
TipI& Lista<TipI>::operator[] (int index){
return getElementAt(index)->info;
}
/** Adauga un nod la sfarsitul listei*/
template <class TipI>
void Lista<TipI>::addElement(TipI inf){
Nod<TipI> *p;
p=new Nod<TipI>(inf,0);
if(isEmpty()){
prim=ultim=p;
} else {
ultim->next=p;
ultim = p;
}
}
template <class TipI>
Nod<TipI>* Lista<TipI>::getFirst(){
return prim;
}
template <class TipI>
Nod<TipI>* Lista<TipI>::getLast(){
return ultim;
}
template <class TipI>
Nod<TipI>* Lista<TipI>::getElementAt( int index){
int i;
Nod<TipI>* p;
for(i=0,p=prim;i<index&&p!=0;i++,p=p->next);
return p;
}
template <class TipI>
int Lista<TipI>::getNrElemente(){
int n=0;
Nod<TipI>* p=prim;
while(p){
n++;
p=p->next;
}
return n;
}
template <class TipI>
void Lista<TipI>::print(){
Nod<TipI>* p= getFirst();
while(p){
cout<<p->getInfo()<<",";
p=p->getNext();
}
cout<<"\b ";
}
int main(){
Lista<int> li; //lista ce contine elemente numere intregi
li.addElement(1);
li.addElement(2);
li.addElement(4);
li.print();
Lista<int> l2 = li;
cout<<endl<<"================================="<<endl;
l2[1]=12;
l2.print();
cout<<endl<<"================================="<<endl;
li.print();
cout<<endl<<"================================="<<endl;
Lista<float> lf; //lista ce contine elemente numere reale
lf.addElement(1.2);
lf.addElement(7.3);
lf.print();
getch();
}