Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <new>
- using namespace std;
- template <typename T>
- class Lista
- {
- public:
- Lista(){}
- virtual ~Lista(){}
- virtual int brojElemenata() const=0;
- virtual T trenutni() const=0;
- virtual T &trenutni()=0;
- virtual bool prethodni()=0;
- virtual bool sljedeci()=0;
- virtual void pocetak()=0;
- virtual void kraj()=0;
- virtual void obrisi()=0;
- virtual void dodajIspred(const T &element)=0;
- virtual void dodajIza(const T &element)=0;
- virtual T operator [](int i) const=0;
- virtual T &operator [](int i)=0;
- };
- template <typename T>
- class NizLista: public Lista<T>
- {
- int brojelemenata,kapacitet;
- int tren;
- T *pok;
- public:
- NizLista(){
- tren=0;
- brojelemenata=0;
- kapacitet=100;
- pok=new T[kapacitet];
- }
- ~NizLista()
- {
- delete[] pok;
- }
- NizLista(const NizLista<T> &t)
- {
- brojelemenata=t.brojElemenata();
- kapacitet=t.kapacitet;
- tren=t.tren;
- pok=new T[t.kapacitet];
- for(int i=0; i<brojelemenata; i++) pok[i]=t.pok[i];
- }
- NizLista &operator=(const NizLista<T> &t)
- {
- if(&t!=this) //OVDJE SMO DODALI PROVJERU DA LI JE ELEMENT KOJI SE PRIDRUZUJE ISTA TA KLASA DA NE BI DOSLO DO SAMODESTRUKCIJE
- {
- delete[] pok;
- brojelemenata=t.brojElemenata();
- kapacitet=t.kapacitet;
- pok=new T[t.kapacitet];
- for(int i=0; i<brojelemenata; i++) pok[i]=t.pok[i];
- }
- return *this;
- }
- int brojElemenata() const{return brojelemenata;}
- T trenutni() const{return pok[tren];}
- T &trenutni(){return pok[tren];}
- bool prethodni()
- {
- if(tren==0)return false;
- tren--;
- return true;
- }
- bool sljedeci()
- {
- if(tren==brojelemenata-1) return false;
- tren++;
- return true;
- }
- void pocetak(){tren=0;}
- void kraj(){tren=brojelemenata-1;} //OVDJE SMO PROMJENILI kapacitet U brojelemenata - TREBA TAKO JER NAM ONDA VRACA ZADNJI ELEMENT U LISTI
- void obrisi(){
- for(int i=tren;i<kapacitet-1;i++)
- {
- pok[i]=pok[i+1];
- }
- brojelemenata--;
- }
- void dodajIspred(const T &el)
- {
- if(brojelemenata==0)
- {
- pok[0]=el;
- tren=0;
- brojelemenata++;
- }
- else{
- if(brojelemenata==kapacitet)
- {
- T *pom=new T[kapacitet*2];
- for(int i=0;i<brojelemenata;i++)
- pom[i]=pok[i];
- delete []pok;
- pok=pom;
- kapacitet*=2;
- }
- brojelemenata++;
- for(int i=brojelemenata-1;i>tren;i--)
- {
- pok[i]=pok[i-1];
- }
- pok[tren]=el;
- tren++;
- }
- }
- void dodajIza(const T &el)
- {
- if(brojelemenata==0)
- {
- pok[0]=el;
- tren=0;
- brojelemenata++;
- }
- else
- {
- if(brojelemenata==kapacitet)
- {
- T *pom=new T[kapacitet*2];
- for(int i=0;i<brojelemenata;i++)
- pom[i]=pok[i];
- delete[] pok;
- pok=pom;
- kapacitet*=2;
- }/////////OVO SMO DODALI ZA PROMJENU KAPACITETA
- brojelemenata++;
- for(int i=brojelemenata-1;i>tren;i--)
- {
- pok[i]=pok[i-1];
- }
- pok[tren+1]=el;
- }
- }
- T operator [](int i) const
- {
- if(i<0 || i>=brojelemenata) throw "Greska!";
- return pok[i];
- }
- T &operator [](int i)
- {
- if(i<0 || i>=brojelemenata) throw "Greska!";
- return pok[i];
- }
- };
- template <typename T>
- class JednostrukaLista: public Lista<T>
- {
- struct Cvor
- {
- T element;
- Cvor *sljedeci;
- Cvor(const T &el, Cvor *slj)
- {
- element=el;
- sljedeci=slj;
- }
- };
- Cvor *poc;
- Cvor *kra;
- Cvor *tren;
- int brojelemenata;
- public:
- JednostrukaLista()
- {
- brojelemenata=0;
- poc=nullptr;
- kra=nullptr;
- tren=nullptr;
- }
- //UBACENA PROVJERA DA LI JE LISTA PRAZNA U DESTRUKTORU
- ~JednostrukaLista()
- {
- if(brojelemenata>0)
- {
- auto temp=poc;
- while (poc->sljedeci!=nullptr)
- {
- poc=poc->sljedeci;
- delete temp;
- temp=poc;
- }
- delete temp;
- }
- }
- // OVO JE NOVINA: DODALI SMO OVAJ KOPIRAJUCI KONSTRUKTOR DA BI MOGLI JEDNU LISTU INICIJALIZIRATI DRUGOM, ON JE MODELIRAN PREMA
- // KONSTRUKOTRU ZA KLASU DvostrukaLista
- JednostrukaLista(const JednostrukaLista<T> &dv)
- {
- if(dv.brojElemenata()==0)
- {
- brojelemenata=0;
- poc=kra=tren=nullptr;
- }
- else
- {
- brojelemenata=dv.brojElemenata();
- poc=new Cvor(dv.poc->element,nullptr);
- if(dv.poc==dv.tren) tren=poc;
- auto pom1=dv.poc;
- auto pom2=poc;
- for(int i=0;i<brojelemenata-1;i++)
- {
- pom1=pom1->sljedeci;
- auto cuvaj=pom2;
- pom2=new Cvor(pom1->element,nullptr);
- cuvaj->sljedeci=pom2;
- if(pom1==dv.tren) tren=pom2;
- }
- }
- }
- //OVAJ OPERATOR JE TAKODE MODELIRAN PREMA ONOME IZ KLASE DvostrukaLista
- JednostrukaLista<T> &operator=(const JednostrukaLista<T> &dv)
- {
- if(this==&dv) return *this;
- else
- {
- if(brojElemenata()!=0)
- {
- auto temp=poc;
- while (poc->sljedeci!=nullptr)
- {
- poc=poc->sljedeci;
- delete temp;
- temp=poc;
- }
- delete temp;
- }
- if(dv.brojElemenata()==0)
- {
- brojelemenata=0;
- poc=kra=tren=nullptr;
- }
- else
- {
- brojelemenata=dv.brojElemenata();
- poc=new Cvor(dv.poc->element,nullptr);
- if(dv.poc==dv.tren) tren=poc;
- auto pom1=dv.poc;
- auto pom2=poc;
- for(int i=0;i<brojelemenata-1;i++)
- {
- pom1=pom1->sljedeci;
- auto cuvaj=pom2;
- pom2=new Cvor(pom1->element,nullptr);
- cuvaj->sljedeci=pom2;
- if(pom1==dv.tren) tren=pom2;
- }
- }
- }
- return *this;
- }
- virtual int brojElemenata() const
- {
- return brojelemenata;
- }
- virtual T trenutni() const
- {
- if(brojelemenata==0) throw "Greska!";
- return tren->element;
- }
- virtual T &trenutni()
- {
- if(brojelemenata==0) throw "Greska!";
- return tren->element;
- }
- virtual bool prethodni()
- {
- if(brojelemenata==0) throw "Greska!";
- Cvor *pomocni(poc);
- if(tren==poc) return false;
- while(pomocni->sljedeci!=tren) pomocni=pomocni->sljedeci;
- tren=pomocni;
- return true;
- }
- virtual bool sljedeci()
- {
- if(brojelemenata==0) throw "Greska!";
- if(tren==kra) return false;
- tren=tren->sljedeci;
- return true;
- }
- virtual void pocetak()
- {
- if(brojelemenata==0) throw "Greska!";
- tren=poc;
- }
- virtual void kraj()
- {
- if(brojelemenata==0) throw "Greska!";
- tren=kra;
- }
- // GRESKA DOLE, FUNKCIJA NIJE DEKREMENTIRALA BROJ ELEMENATA, STO BI U PROGRAMU UZROKOVALO NETACAN BROJ ELEMENATA U SLUCAJU POZIVA FUNKCIJE
- virtual void obrisi()
- {
- if(brojelemenata==0) throw "Greska!";
- if(brojelemenata==1)
- {
- delete poc;
- poc=nullptr;
- tren=nullptr;
- kra=nullptr;
- }
- else if(tren==poc)
- {
- Cvor* pomocni(tren);
- tren=tren->sljedeci;
- poc=tren;
- delete pomocni;
- }
- else if(tren==kra)
- {
- prethodni();
- kra=tren;
- delete tren->sljedeci;
- tren->sljedeci=nullptr;
- }
- else
- {
- Cvor* pomocni(tren);
- prethodni();
- tren->sljedeci=pomocni->sljedeci;
- tren=pomocni->sljedeci;
- delete pomocni;
- }
- brojelemenata--;
- }
- virtual void dodajIspred(const T &el)
- {
- if(brojelemenata==0)
- {
- poc=new Cvor(el,nullptr);
- tren=kra=poc;
- brojelemenata++;
- }
- else if(tren==poc)
- {
- poc=new Cvor(el,tren);
- brojelemenata++;
- }
- else
- {
- Cvor* pomocni(tren);
- prethodni();
- tren->sljedeci=new Cvor(el,pomocni);
- tren=pomocni;
- brojelemenata++;
- }
- }
- virtual void dodajIza(const T &el)
- {
- if(brojelemenata==0)
- {
- poc=new Cvor(el,nullptr);
- tren=poc;
- kra=poc;
- brojelemenata++;
- }
- // ISPRAVKA NA OVOM MJESTU - BILA DODJELA UMJESTO POREĐENJA (GRESKA PRILIKOM KUCANJA)
- else if(tren==kra)
- {
- auto pomocni=new Cvor(el,nullptr);
- tren->sljedeci=pomocni;
- kra=pomocni;
- brojelemenata++;
- /*tren->sljedeci=new Cvor(el,nullptr);
- kra=tren->sljedeci;
- brojelemenata++;*/
- }
- else
- {
- auto pomocni(tren->sljedeci);
- tren->sljedeci=new Cvor(el,tren->sljedeci);
- brojelemenata++;
- /*Cvor* pomocni(tren->sljedeci);
- tren->sljedeci=new Cvor(el,pomocni);
- brojelemenata++;*/
- }
- }
- virtual T operator [](int i) const
- {
- if(i<0 || i>=brojelemenata) throw "Greska!";
- Cvor *pomocni(poc);
- for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
- return pomocni->element;
- }
- virtual T &operator [](int i)
- {
- if(i<0 || i>=brojelemenata) throw "Greska!";
- Cvor *pomocni(poc);
- for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
- return pomocni->element;
- }
- };
- template <typename T>
- class DvostrukaLista : public Lista<T>
- {
- struct DCvor
- {
- T element;
- DCvor *sljedeci;
- DCvor *prethodni;
- DCvor(const T &el, DCvor *slj, DCvor *pr)
- {
- element=el;
- sljedeci=slj;
- prethodni=pr;
- }
- };
- DCvor *poc,*kra,*tren;
- int brojelemenata;
- public:
- DvostrukaLista()
- {
- brojelemenata=0;
- poc=nullptr;
- kra=nullptr;
- tren=nullptr;
- }
- DvostrukaLista(const DvostrukaLista<T> &dv)
- {
- if(dv.brojElemenata()==0)
- {
- brojelemenata=0;
- poc=kra=tren=nullptr;
- }
- else
- {
- brojelemenata=dv.brojElemenata();
- poc=new DCvor(dv.poc->element,nullptr,nullptr);
- if(dv.poc==dv.tren) tren=poc;
- auto pom1=dv.poc;
- auto pom2=poc;
- for(int i=0;i<brojelemenata-1;i++)
- {
- pom1=pom1->sljedeci;
- pom2=new DCvor(pom1->element,nullptr,pom2);
- pom2->prethodni->sljedeci=pom2;
- if(pom1==dv.tren) tren=pom2;
- }
- }
- }
- DvostrukaLista<T> &operator=(const DvostrukaLista<T> &dv)
- {
- if(this==&dv) return *this;
- else
- {
- if(brojElemenata()!=0)
- {
- auto temp=poc;
- while (poc->sljedeci!=nullptr)
- {
- poc=poc->sljedeci;
- delete temp;
- temp=poc;
- }
- delete temp;
- }
- if(dv.brojElemenata()==0)
- {
- brojelemenata=0;
- poc=kra=tren=nullptr;
- }
- else
- {
- brojelemenata=dv.brojElemenata();
- poc=new DCvor(dv.poc->element,nullptr,nullptr);
- if(dv.poc==dv.tren) tren=poc;
- auto pom1=dv.poc;
- auto pom2=poc;
- for(int i=0;i<brojelemenata-1;i++)
- {
- pom1=pom1->sljedeci;
- pom2=new DCvor(pom1->element,nullptr,pom2);
- pom2->prethodni->sljedeci=pom2;
- if(pom1==dv.tren) tren=pom2;
- }
- }
- }
- return *this;
- }
- int brojElemenata()const {return brojelemenata;}
- virtual T trenutni() const {return tren->element;}
- virtual T &trenutni(){return tren->element;}
- virtual bool prethodni()
- {
- if(brojelemenata==0) throw "Greska!";
- if(tren==poc) return false;
- tren=tren->prethodni;
- return true;
- }
- virtual bool sljedeci()
- {
- if(brojelemenata==0) throw "Greska!";
- if(tren==kra) return false;
- tren=tren->sljedeci;
- return true;
- }
- virtual void pocetak()
- {
- if(brojelemenata==0) throw "Greska!";
- tren=poc;
- }
- virtual void kraj()
- {
- if(brojelemenata==0) throw "Greska!";
- tren=kra;
- }
- virtual void obrisi()
- {
- if(brojelemenata==0) throw "Greska!";
- if(brojelemenata==1)
- {
- delete poc;
- poc=nullptr;
- tren=nullptr;
- kra=nullptr;
- }
- else if(tren==poc)
- {
- DCvor* pomocni(tren);
- tren=tren->sljedeci;
- tren->prethodni=nullptr;
- poc=tren;
- delete pomocni;
- }
- else if(tren==kra)
- {
- tren=tren->prethodni;
- delete tren->sljedeci;
- tren->sljedeci=nullptr;
- kra=tren;
- }
- else
- {
- DCvor* pomocni(tren);
- tren=tren->prethodni;
- tren->sljedeci=pomocni->sljedeci;
- tren=pomocni->sljedeci;
- delete pomocni;
- }
- brojelemenata--;
- }
- virtual void dodajIspred(const T &el)
- {
- if(brojelemenata==0)
- {
- poc=new DCvor(el,nullptr,nullptr);
- tren=kra=poc;
- brojelemenata++;
- }
- else if(tren==poc)
- {
- poc=new DCvor(el,tren,nullptr);
- tren->prethodni=poc;
- brojelemenata++;
- }
- else
- {
- DCvor* nov=new DCvor(el,tren,tren->prethodni);
- tren->prethodni->sljedeci=nov;
- tren->prethodni=nov;
- brojelemenata++;
- }
- }
- virtual void dodajIza(const T &el)
- {
- if(brojelemenata==0)
- {
- poc=new DCvor(el,nullptr,nullptr);
- tren=kra=poc;
- brojelemenata++;
- }
- else if(tren==kra)
- {
- kra=new DCvor(el,nullptr,tren);
- tren->sljedeci=kra;
- brojelemenata++;
- }
- else
- {
- DCvor* nov=new DCvor(el,tren->sljedeci,tren);
- tren->sljedeci->prethodni=nov;
- tren->sljedeci=nov;
- brojelemenata++;
- }
- }
- virtual T operator [](int i) const
- {
- if(i<0 || i>=brojelemenata) throw "Greska!";
- DCvor *pomocni(poc);
- for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
- return pomocni->element;
- }
- virtual T &operator [](int i)
- {
- if(i<0 || i>=brojelemenata) throw "Greska!";
- DCvor *pomocni(poc);
- for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
- return pomocni->element;
- }
- ~DvostrukaLista()
- {
- if(brojelemenata>0)
- {
- auto temp=poc;
- while (poc->sljedeci!=nullptr)
- {
- poc=poc->sljedeci;
- delete temp;
- temp=poc;
- }
- delete temp;
- }
- }
- };
- int main()
- {
- /* U mainu cemo pokazati kako se koriste sve funkcije i da li rade */
- JednostrukaLista<int> lista;
- lista.dodajIspred(13); // Dodavanje elemenata
- lista.dodajIza(14);
- lista.dodajIspred(15);
- lista.dodajIza(16);
- lista.dodajIspred(17);
- lista.dodajIza(18);
- cout<<lista.trenutni()<<endl;//metoda trenutni
- lista.pocetak(); // Mijenjanje pozicije
- cout<<lista.trenutni()<<endl;//metoda trenutni
- lista.kraj(); // Mijenjanje pozicije
- cout<<lista.trenutni()<<endl;//metoda trenutni
- for(int i=0;i<lista.brojElemenata();i++) cout<<lista[i]<<" ";//operator[]
- cout<<endl<<endl;
- DvostrukaLista<int> dlista;
- dlista.dodajIspred(13); // Dodavanje elemenata
- dlista.dodajIza(14);
- dlista.dodajIspred(15);
- dlista.dodajIza(16);
- dlista.dodajIspred(17);
- dlista.dodajIza(18);
- cout<<dlista.trenutni()<<endl; //metoda trenutni
- dlista.pocetak(); // Mijenjanje pozicije
- cout<<dlista.trenutni()<<endl;//metoda trenutni
- dlista.kraj(); // Mijenjanje pozicije
- cout<<dlista.trenutni()<<endl;//metoda trenutni
- for(int i=0;i<dlista.brojElemenata();i++) cout<<dlista[i]<<" ";//operator[]
- cout<<endl<<endl;
- NizLista<int> nlista;
- nlista.dodajIspred(13); // Dodavanje elemenata
- nlista.dodajIza(14);
- nlista.dodajIspred(15);
- nlista.dodajIza(16);
- nlista.dodajIspred(17);
- nlista.dodajIza(18);
- cout<<nlista.trenutni()<<endl;//metoda trenutni
- nlista.pocetak(); // Mijenjanje pozicije
- cout<<nlista.trenutni()<<endl;//metoda trenutni
- nlista.kraj(); // Mijenjanje pozicije
- cout<<nlista.trenutni()<<endl;//metoda trenutni
- for(int i=0;i<lista.brojElemenata();i++) cout<<nlista[i]<<" ";//operator[]
- cout<<endl<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement