Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: mateka on May 5th, 2012  |  syntax: C++  |  size: 7.74 KB  |  hits: 23  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. //Generikus körkörös, duplán láncolt lista interfésze
  2.  
  3.  
  4. #include <iostream>
  5. #include <fstream>                      // a fájlkezeléshez
  6. using namespace std;
  7.  
  8.  
  9.  
  10. template <class T>      // Ez kell elé, hogy a friend-nél
  11. class Lista;    // már ismert legyen a Lista<T>
  12.  
  13.  
  14.  
  15. // ListaElem nevű osztály deklarációja
  16. template <class T>                      // Sablon kezdete (kell, mert generikus)
  17. class ListaElem {
  18. friend class Lista<T>;
  19. private:                        // hozzá kell férnie a mezőkhöz
  20.         T adat;                 // adat (változhat a típusa)
  21.         ListaElem<T> *kov;      // pointer következő elemre
  22.         ListaElem<T> *elo;              // pointer az előző elemre
  23. };
  24.  
  25.  
  26.  
  27. // Lista nevű osztály deklarációja
  28. template <class T>              // Sablon kezdete (kell, mert generikus)
  29. class Lista {
  30.         ListaElem<T> *elso;             // első pointer
  31.  
  32. public:
  33.         Lista() { elso = new ListaElem<T>;              //Konstruktor
  34.         elso->kov = NULL;              
  35.         elso->elo = NULL;
  36.         elso->adat = NULL;
  37.         }
  38.  
  39.  
  40.         //Függvények
  41.     void beszur(const T&);              //ListaElem beszúrása
  42.         void beszurhelyere(T);          //megkeresi a paraméterként megadott adatnak megfelelő helyét az elemnek, és a listába eszerint szúrja be
  43.         void beolvas(char*);             //a megadott paraméter lesz a beovlasandó fájl, egy listát ad vissza
  44.         void torol(const T&);           //ListaElem törlése
  45.     bool szerepel(const T&);    //logikai visszatérés, igaz ha szerepel az adott adat a listában
  46.         int keres(const T&);            //megadja, hogy az első elem után először mikor fordul elő a keresett adat
  47.         int elemszam();                         //megadja az adott lista elemeinek számát
  48.         bool hasonlit(T d1, T d2) { return(d1<d2); }    // default hasonlító fv.
  49.        
  50.  
  51.  
  52.  
  53.         //Operátor overload-ok
  54.         Lista<T> operator+(Lista<T>&);          // Két lista egyesítve, az első paraméterként megadott listában lesznek az adatok, a második
  55.         Lista<T>&  Lista<T>::operator=(Lista<T>&);              //Értékadás
  56.         bool operator<(Lista<T>&);              //Összehasonlítás, kisebb-e?
  57.         bool operator==(Lista<T>&);             //Összehasonlítás : egyenlőek-e?
  58.         bool operator>(Lista<T>&);              //Összehasonlítás : nagyobb-e?
  59.         T& operator[](int ik);          //Indexedik elem
  60.         ostream& operator<<(ostream& os, const Lista<T>&);      //Kiíratás overload, kiírja az adott lista összes elemét
  61.  
  62.         void deleteAll();               //deleteAll függvény
  63.         ~Lista() { deleteAll(); delete elso;}           //Destruktor  
  64.  
  65.  
  66.         //Iterátor     osztály (bejárók)
  67.         class iterator;
  68.  
  69.        
  70.  
  71.         /**
  72.         *Az iterátorok használata megkönnyíti a léptetést
  73.         */
  74.  
  75.  
  76.         //Iterátor kifejtve
  77.         class iterator{
  78.         public:
  79.                 ListaElem<T> *akt,*elotti;              //kihasználjuk a két irány előnyeit
  80.                 iterator() : akt(0),elotti(0){};        //Iterátor konstruktor
  81.                 iterator begin() {                              // létrehoz egy iterátort és az elejére állítja
  82.                 return(iterator(*this));
  83.                 }
  84.                
  85.                 iterator end() {                                // létrehozza és az utolsó elem után állítja
  86.                 return(iterator());
  87.                 }
  88.  
  89.                 iterator(const Lista& I):akt(I.elso),elotti(I.elso)
  90.                 {
  91.                 if(akt->kov == elotti) akt=0;
  92.                 }
  93.                
  94.                 iterator& operator++(){
  95.                         if(akt){
  96.                                 akt = akt->kov;
  97.                                 if((akt->kov) == elotti) akt = 0;
  98.                         }
  99.                         return(*this);
  100.                 }
  101.  
  102.                 iterator operator++(int) {              // növeli az iterátort (post)
  103.                         iterator tmp = *this;           // előző érték
  104.                         operator++();                           // növel
  105.                         return(tmp);                            // előzővel kell visszatérni
  106.                 }
  107.  
  108.                 bool operator!=(const iterator &i) const {              // összehasonlít
  109.                         return(akt != i.akt);
  110.                 }
  111.                
  112.            };  
  113.  
  114. //Függvények deklarációja
  115.  
  116.         //beszurás függvénye
  117.         template<class T>
  118.                 void Lista<T>::beszur(const T& dat){            //létrehozunk egy uj lista elemet, amit a lista
  119.                                 new ListaElem<T> uj;                            //elejére szurunk be, majd az 'adat' tagjának,
  120.                                 uj->adat = dat;                                         // a paraméterül kapott 'dat' értéket adjuk
  121.                                 uj->kov = elso->kov;
  122.                                 elso->kov->elo = uj;
  123.                                 elso->kov = uj;
  124.                                 uj->elo = elso;
  125.                 }
  126.  
  127.                 //helyére beszurás függvénye
  128.                 template<class T>
  129.                 void Lista<T>::beszurhelyere(const T& dat){
  130.                                 ListaElem<T> *temp;
  131.                                 for(temp=elso;temp->kov!=elso && hasonlit(temp->adat,dat);temp = temp->kov);
  132.                                 new ListaElem<T> uj;
  133.                                 uj->adat = dat;                                         // a sima beszur függvényhez hasonloan mukordik,
  134.                                 uj->kov = temp->kov;                            //annyi különbséggel, hogy egy for ciklussal, meg-
  135.                                 temp->kov->elo = uj;                            //keressük az elem 'adat' tag szerinti helyét a listában
  136.                                 temp->kov = uj;
  137.                                 uj->elo = temp;
  138.                 }
  139.                
  140.                 //törlés függvénye
  141.                 template<class T>      
  142.                 void Lista<T>::torol(const T& dat){                     // paraméterul egy értéket kap, az ezt tartalmazo
  143.                                 ListaElem<T> *temp,*torlendo;           //listaelemet megkeresi a listában, majd törli azt
  144.                                 for(temp=elso;temp->kov!=elso && temp->adat!=dat;temp=temp->kov);
  145.                                 temp->kov = torlendo;
  146.                                 temp->kov = torlendo->kov;
  147.                                 torlendo->kov = temp;
  148.                                 delete torlendo;
  149.                 }
  150.                
  151.                 //szerepelés függvénye
  152.                 template<class T>
  153.                 void Lista<T>::szerepel(const T& dat){          //megnézi, hogy szerepel e a listában
  154.                                 ListaElem<T> *temp;                                     //a paraméterül kapott adatot tároló listaelem
  155.                                 for(temp=elso;temp->kov!=elso && temp->adat!=dat;temp=temp->kov);
  156.                                 if (temp->kov == NULL)
  157.                                         return(false);
  158.                                 else
  159.                                         return(true);
  160.                 }
  161.                 //keres függvénye
  162.                 template<class T>
  163.                 int Lista<T>::keres(const T& dat){                      // a szerepel függvénytől eltérően,
  164.                                 ListaElem<T> *temp;                                     //nem a jelenlét a lényeg, hanem, hogy
  165.                                 int db;                                                         // a keresett értéket hanyadik listaelem tárolja
  166.                                 for(temp=elso;temp->kov!=elso && temp->adat!=dat;temp=temp->kov)
  167.                                         db++;
  168.                                 if(temp->kov == elso && temp->adat != dat)
  169.                                         return -1;
  170.                                 else
  171.                                         return (db+1);
  172.                 }
  173.                
  174.                 //elemszam függvénye
  175.                 template<class T>
  176.                 int Lista<T>::elemszam(){                                       //megadja az adott lista elemszamat
  177.                         ListaElem<T> *temp;
  178.                         int db;
  179.                         for(temp=elso;temp->kov!=elso;temp=temp->kov)
  180.                                 db++;
  181.                         return (db+1);
  182.                 }
  183.  
  184.                
  185. //Operator overloadok
  186.  
  187.  
  188.                 //+ operator értelmezése
  189.                 Lista<T> Lista<T>::operator+(Lista<T>& list){
  190.                         Lista<T> uj;
  191.                         ListaElem<T> *temp;
  192.                         uj->adat = this->adat;                                                                          //két listát összefűzünk, és egy
  193.                         uj->elso->kov = this->elso->kov;                                                        //harmadikban adjuk vissza őket
  194.                         this->elso->kov->elo = uj->elso;
  195.                         for(temp=this->elso;temp->kov!=this->elso;temp=temp->kov);
  196.                         temp->kov = list->elso->kov;
  197.                         list->elso->kov->elo = temp;
  198.                         list->elso->kov = uj->elso;
  199.                         uj->elso->elo = list->elso;
  200.                         return uj;
  201.                 }
  202.  
  203.                 //< operator értelmezése     
  204.                 bool Lista<T>::operator<(Lista<T>& list){                                       //a benne talalhato listaelemek száma
  205.                                 return(this.elemszam() < list.elemszam());                      //alapjan összehasonlit két listat
  206.                 }                                                                                                                       //kisebb e
  207.  
  208.                 //> operator értelmezése
  209.                 bool Lista<T>::operator<(Lista<T>& list){                                       //a benne talalhato listaelemek száma
  210.                                 return(this.elemszam() < list.elemszam());                      //alapjan összehasonlit két listat
  211.                 }                                                                                                                       //nagyobb e
  212.  
  213.                 //== operator értelmezése
  214.                 bool Lista<T>::operator==(Lista<T>& list){                                      //a benne talalhato listaelemek száma
  215.                                 return(this.elemszam() == list.elemszam());                     //alapjan összehasonlit két listat
  216.                 }                                                                                                                       //egyenlő e
  217.                
  218.                 //[] operator értelmezése
  219.                 T& operator[](int index){
  220.                         int i;
  221.                         ListaElem<T> *temp;                                                                             // a paraméterként kapott indexnek megfelelő
  222.                         if(this.elemszam()<i)                                                                   // listaelemmel tér vissza
  223.                                 throw("Indexelesi hiba, tulnagy indexszam")
  224.                         else
  225.                                 temp = elso;
  226.                                 for(i=0;i<=index;i++)
  227.                                         temp = temp->kov;
  228.                         return temp;
  229.                 }
  230.                                        
  231.                 //<< operator értelmezése
  232.                 ostream& Lista<T>::operator<<(ostream& os, const Lista<T>& list){
  233.                         int i;
  234.                         for(i=0;i<=this.darabszam();i++)                                                // lista kiírása, listaelemenként
  235.                         {os<<list[i]<<endl;}
  236.                         return os;
  237.                 }
  238.                
  239.                
  240.                 //törlés függvény
  241.                 void Lista<T>::deleteAll(){                                                                     //egy lista törlése, az első tagon kívül
  242.                         ListaElem<T> *temp;
  243.                         for(temp=elso->kov;temp->kov;temp=temp->kov)
  244.                                 delete temp->elo;
  245.                 }
  246.  
  247. };