Programare Orientata pe Obiecte


Clase Template

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();
}

Tema

  1. Implementati clasa Multime care sa poata retina elemente de orice tip. Sa se suparaincarce operatorii +, * pentru a realiza reuniunea respectiv intersectia a doua multimi.

  2. Implementati clasa generica (template) care sa implementeze un arbore binar.