Advertisement
Guest User

zad uz tut 2

a guest
Aug 3rd, 2015
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <new>
  3.  
  4. using namespace std;
  5.  
  6. template <typename T>
  7. class Lista
  8. {
  9. public:
  10. Lista(){}
  11. virtual ~Lista(){}
  12. virtual int brojElemenata() const=0;
  13. virtual T trenutni() const=0;
  14. virtual T &trenutni()=0;
  15. virtual bool prethodni()=0;
  16. virtual bool sljedeci()=0;
  17. virtual void pocetak()=0;
  18. virtual void kraj()=0;
  19. virtual void obrisi()=0;
  20. virtual void dodajIspred(const T &element)=0;
  21. virtual void dodajIza(const T &element)=0;
  22. virtual T operator [](int i) const=0;
  23. virtual T &operator [](int i)=0;
  24. };
  25.  
  26. template <typename T>
  27. class NizLista: public Lista<T>
  28. {
  29. int brojelemenata,kapacitet;
  30. int tren;
  31. T *pok;
  32. public:
  33. NizLista(){
  34. tren=0;
  35. brojelemenata=0;
  36. kapacitet=100;
  37. pok=new T[kapacitet];
  38. }
  39. ~NizLista()
  40. {
  41. delete[] pok;
  42. }
  43. NizLista(const NizLista<T> &t)
  44. {
  45. brojelemenata=t.brojElemenata();
  46. kapacitet=t.kapacitet;
  47. tren=t.tren;
  48. pok=new T[t.kapacitet];
  49. for(int i=0; i<brojelemenata; i++) pok[i]=t.pok[i];
  50. }
  51. NizLista &operator=(const NizLista<T> &t)
  52. {
  53. if(&t!=this) //OVDJE SMO DODALI PROVJERU DA LI JE ELEMENT KOJI SE PRIDRUZUJE ISTA TA KLASA DA NE BI DOSLO DO SAMODESTRUKCIJE
  54. {
  55. delete[] pok;
  56. brojelemenata=t.brojElemenata();
  57. kapacitet=t.kapacitet;
  58. pok=new T[t.kapacitet];
  59. for(int i=0; i<brojelemenata; i++) pok[i]=t.pok[i];
  60. }
  61. return *this;
  62. }
  63. int brojElemenata() const{return brojelemenata;}
  64. T trenutni() const{return pok[tren];}
  65. T &trenutni(){return pok[tren];}
  66. bool prethodni()
  67. {
  68. if(tren==0)return false;
  69. tren--;
  70. return true;
  71. }
  72. bool sljedeci()
  73. {
  74. if(tren==brojelemenata-1) return false;
  75. tren++;
  76. return true;
  77. }
  78. void pocetak(){tren=0;}
  79. void kraj(){tren=brojelemenata-1;} //OVDJE SMO PROMJENILI kapacitet U brojelemenata - TREBA TAKO JER NAM ONDA VRACA ZADNJI ELEMENT U LISTI
  80. void obrisi(){
  81. for(int i=tren;i<kapacitet-1;i++)
  82. {
  83. pok[i]=pok[i+1];
  84. }
  85. brojelemenata--;
  86. }
  87. void dodajIspred(const T &el)
  88. {
  89. if(brojelemenata==0)
  90. {
  91. pok[0]=el;
  92. tren=0;
  93. brojelemenata++;
  94.  
  95. }
  96. else{
  97. if(brojelemenata==kapacitet)
  98. {
  99. T *pom=new T[kapacitet*2];
  100. for(int i=0;i<brojelemenata;i++)
  101. pom[i]=pok[i];
  102. delete []pok;
  103. pok=pom;
  104. kapacitet*=2;
  105. }
  106. brojelemenata++;
  107. for(int i=brojelemenata-1;i>tren;i--)
  108. {
  109. pok[i]=pok[i-1];
  110. }
  111. pok[tren]=el;
  112. tren++;
  113. }
  114. }
  115. void dodajIza(const T &el)
  116. {
  117. if(brojelemenata==0)
  118. {
  119. pok[0]=el;
  120. tren=0;
  121. brojelemenata++;
  122. }
  123. else
  124. {
  125. if(brojelemenata==kapacitet)
  126. {
  127. T *pom=new T[kapacitet*2];
  128. for(int i=0;i<brojelemenata;i++)
  129. pom[i]=pok[i];
  130. delete[] pok;
  131. pok=pom;
  132. kapacitet*=2;
  133. }/////////OVO SMO DODALI ZA PROMJENU KAPACITETA
  134.  
  135. brojelemenata++;
  136. for(int i=brojelemenata-1;i>tren;i--)
  137. {
  138. pok[i]=pok[i-1];
  139. }
  140. pok[tren+1]=el;
  141. }
  142. }
  143. T operator [](int i) const
  144. {
  145. if(i<0 || i>=brojelemenata) throw "Greska!";
  146. return pok[i];
  147. }
  148. T &operator [](int i)
  149. {
  150. if(i<0 || i>=brojelemenata) throw "Greska!";
  151. return pok[i];
  152. }
  153.  
  154. };
  155.  
  156. template <typename T>
  157. class JednostrukaLista: public Lista<T>
  158. {
  159. struct Cvor
  160. {
  161. T element;
  162. Cvor *sljedeci;
  163. Cvor(const T &el, Cvor *slj)
  164. {
  165. element=el;
  166. sljedeci=slj;
  167. }
  168. };
  169. Cvor *poc;
  170. Cvor *kra;
  171. Cvor *tren;
  172. int brojelemenata;
  173. public:
  174. JednostrukaLista()
  175. {
  176. brojelemenata=0;
  177. poc=nullptr;
  178. kra=nullptr;
  179. tren=nullptr;
  180. }
  181. //UBACENA PROVJERA DA LI JE LISTA PRAZNA U DESTRUKTORU
  182. ~JednostrukaLista()
  183. {
  184. if(brojelemenata>0)
  185. {
  186. auto temp=poc;
  187. while (poc->sljedeci!=nullptr)
  188. {
  189. poc=poc->sljedeci;
  190. delete temp;
  191. temp=poc;
  192. }
  193. delete temp;
  194. }
  195. }
  196. // OVO JE NOVINA: DODALI SMO OVAJ KOPIRAJUCI KONSTRUKTOR DA BI MOGLI JEDNU LISTU INICIJALIZIRATI DRUGOM, ON JE MODELIRAN PREMA
  197. // KONSTRUKOTRU ZA KLASU DvostrukaLista
  198. JednostrukaLista(const JednostrukaLista<T> &dv)
  199. {
  200. if(dv.brojElemenata()==0)
  201. {
  202. brojelemenata=0;
  203. poc=kra=tren=nullptr;
  204. }
  205. else
  206. {
  207. brojelemenata=dv.brojElemenata();
  208. poc=new Cvor(dv.poc->element,nullptr);
  209. if(dv.poc==dv.tren) tren=poc;
  210. auto pom1=dv.poc;
  211. auto pom2=poc;
  212. for(int i=0;i<brojelemenata-1;i++)
  213. {
  214. pom1=pom1->sljedeci;
  215. auto cuvaj=pom2;
  216. pom2=new Cvor(pom1->element,nullptr);
  217. cuvaj->sljedeci=pom2;
  218. if(pom1==dv.tren) tren=pom2;
  219. }
  220. }
  221. }
  222. //OVAJ OPERATOR JE TAKODE MODELIRAN PREMA ONOME IZ KLASE DvostrukaLista
  223. JednostrukaLista<T> &operator=(const JednostrukaLista<T> &dv)
  224. {
  225. if(this==&dv) return *this;
  226. else
  227. {
  228. if(brojElemenata()!=0)
  229. {
  230. auto temp=poc;
  231. while (poc->sljedeci!=nullptr)
  232. {
  233. poc=poc->sljedeci;
  234. delete temp;
  235. temp=poc;
  236. }
  237. delete temp;
  238. }
  239. if(dv.brojElemenata()==0)
  240. {
  241. brojelemenata=0;
  242. poc=kra=tren=nullptr;
  243. }
  244. else
  245. {
  246. brojelemenata=dv.brojElemenata();
  247. poc=new Cvor(dv.poc->element,nullptr);
  248. if(dv.poc==dv.tren) tren=poc;
  249. auto pom1=dv.poc;
  250. auto pom2=poc;
  251. for(int i=0;i<brojelemenata-1;i++)
  252. {
  253. pom1=pom1->sljedeci;
  254. auto cuvaj=pom2;
  255. pom2=new Cvor(pom1->element,nullptr);
  256. cuvaj->sljedeci=pom2;
  257. if(pom1==dv.tren) tren=pom2;
  258. }
  259. }
  260. }
  261. return *this;
  262. }
  263. virtual int brojElemenata() const
  264. {
  265. return brojelemenata;
  266. }
  267. virtual T trenutni() const
  268. {
  269. if(brojelemenata==0) throw "Greska!";
  270. return tren->element;
  271. }
  272. virtual T &trenutni()
  273. {
  274. if(brojelemenata==0) throw "Greska!";
  275. return tren->element;
  276. }
  277. virtual bool prethodni()
  278. {
  279. if(brojelemenata==0) throw "Greska!";
  280. Cvor *pomocni(poc);
  281. if(tren==poc) return false;
  282. while(pomocni->sljedeci!=tren) pomocni=pomocni->sljedeci;
  283. tren=pomocni;
  284. return true;
  285. }
  286. virtual bool sljedeci()
  287. {
  288. if(brojelemenata==0) throw "Greska!";
  289. if(tren==kra) return false;
  290. tren=tren->sljedeci;
  291. return true;
  292. }
  293. virtual void pocetak()
  294. {
  295. if(brojelemenata==0) throw "Greska!";
  296. tren=poc;
  297. }
  298. virtual void kraj()
  299. {
  300. if(brojelemenata==0) throw "Greska!";
  301. tren=kra;
  302. }
  303. // GRESKA DOLE, FUNKCIJA NIJE DEKREMENTIRALA BROJ ELEMENATA, STO BI U PROGRAMU UZROKOVALO NETACAN BROJ ELEMENATA U SLUCAJU POZIVA FUNKCIJE
  304. virtual void obrisi()
  305. {
  306. if(brojelemenata==0) throw "Greska!";
  307. if(brojelemenata==1)
  308. {
  309. delete poc;
  310. poc=nullptr;
  311. tren=nullptr;
  312. kra=nullptr;
  313. }
  314. else if(tren==poc)
  315. {
  316. Cvor* pomocni(tren);
  317. tren=tren->sljedeci;
  318. poc=tren;
  319. delete pomocni;
  320. }
  321. else if(tren==kra)
  322. {
  323. prethodni();
  324. kra=tren;
  325. delete tren->sljedeci;
  326. tren->sljedeci=nullptr;
  327. }
  328. else
  329. {
  330. Cvor* pomocni(tren);
  331. prethodni();
  332. tren->sljedeci=pomocni->sljedeci;
  333. tren=pomocni->sljedeci;
  334. delete pomocni;
  335. }
  336. brojelemenata--;
  337. }
  338. virtual void dodajIspred(const T &el)
  339. {
  340.  
  341. if(brojelemenata==0)
  342. {
  343. poc=new Cvor(el,nullptr);
  344. tren=kra=poc;
  345. brojelemenata++;
  346. }
  347. else if(tren==poc)
  348. {
  349. poc=new Cvor(el,tren);
  350. brojelemenata++;
  351. }
  352. else
  353. {
  354. Cvor* pomocni(tren);
  355. prethodni();
  356. tren->sljedeci=new Cvor(el,pomocni);
  357. tren=pomocni;
  358. brojelemenata++;
  359. }
  360. }
  361. virtual void dodajIza(const T &el)
  362. {
  363. if(brojelemenata==0)
  364. {
  365. poc=new Cvor(el,nullptr);
  366. tren=poc;
  367. kra=poc;
  368. brojelemenata++;
  369. }
  370. // ISPRAVKA NA OVOM MJESTU - BILA DODJELA UMJESTO POREĐENJA (GRESKA PRILIKOM KUCANJA)
  371. else if(tren==kra)
  372. {
  373. auto pomocni=new Cvor(el,nullptr);
  374. tren->sljedeci=pomocni;
  375. kra=pomocni;
  376. brojelemenata++;
  377. /*tren->sljedeci=new Cvor(el,nullptr);
  378. kra=tren->sljedeci;
  379. brojelemenata++;*/
  380. }
  381. else
  382. {
  383. auto pomocni(tren->sljedeci);
  384. tren->sljedeci=new Cvor(el,tren->sljedeci);
  385. brojelemenata++;
  386. /*Cvor* pomocni(tren->sljedeci);
  387. tren->sljedeci=new Cvor(el,pomocni);
  388. brojelemenata++;*/
  389. }
  390. }
  391. virtual T operator [](int i) const
  392. {
  393. if(i<0 || i>=brojelemenata) throw "Greska!";
  394. Cvor *pomocni(poc);
  395. for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
  396. return pomocni->element;
  397. }
  398. virtual T &operator [](int i)
  399. {
  400. if(i<0 || i>=brojelemenata) throw "Greska!";
  401. Cvor *pomocni(poc);
  402. for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
  403. return pomocni->element;
  404. }
  405. };
  406.  
  407. template <typename T>
  408. class DvostrukaLista : public Lista<T>
  409. {
  410. struct DCvor
  411. {
  412. T element;
  413. DCvor *sljedeci;
  414. DCvor *prethodni;
  415. DCvor(const T &el, DCvor *slj, DCvor *pr)
  416. {
  417. element=el;
  418. sljedeci=slj;
  419. prethodni=pr;
  420. }
  421. };
  422. DCvor *poc,*kra,*tren;
  423. int brojelemenata;
  424. public:
  425. DvostrukaLista()
  426. {
  427. brojelemenata=0;
  428. poc=nullptr;
  429. kra=nullptr;
  430. tren=nullptr;
  431. }
  432. DvostrukaLista(const DvostrukaLista<T> &dv)
  433. {
  434. if(dv.brojElemenata()==0)
  435. {
  436. brojelemenata=0;
  437. poc=kra=tren=nullptr;
  438. }
  439. else
  440. {
  441. brojelemenata=dv.brojElemenata();
  442. poc=new DCvor(dv.poc->element,nullptr,nullptr);
  443. if(dv.poc==dv.tren) tren=poc;
  444. auto pom1=dv.poc;
  445. auto pom2=poc;
  446. for(int i=0;i<brojelemenata-1;i++)
  447. {
  448. pom1=pom1->sljedeci;
  449. pom2=new DCvor(pom1->element,nullptr,pom2);
  450. pom2->prethodni->sljedeci=pom2;
  451. if(pom1==dv.tren) tren=pom2;
  452. }
  453. }
  454. }
  455. DvostrukaLista<T> &operator=(const DvostrukaLista<T> &dv)
  456. {
  457. if(this==&dv) return *this;
  458. else
  459. {
  460. if(brojElemenata()!=0)
  461. {
  462. auto temp=poc;
  463. while (poc->sljedeci!=nullptr)
  464. {
  465. poc=poc->sljedeci;
  466. delete temp;
  467. temp=poc;
  468. }
  469. delete temp;
  470. }
  471. if(dv.brojElemenata()==0)
  472. {
  473. brojelemenata=0;
  474. poc=kra=tren=nullptr;
  475. }
  476. else
  477. {
  478. brojelemenata=dv.brojElemenata();
  479. poc=new DCvor(dv.poc->element,nullptr,nullptr);
  480. if(dv.poc==dv.tren) tren=poc;
  481. auto pom1=dv.poc;
  482. auto pom2=poc;
  483. for(int i=0;i<brojelemenata-1;i++)
  484. {
  485. pom1=pom1->sljedeci;
  486. pom2=new DCvor(pom1->element,nullptr,pom2);
  487. pom2->prethodni->sljedeci=pom2;
  488. if(pom1==dv.tren) tren=pom2;
  489. }
  490. }
  491. }
  492. return *this;
  493. }
  494. int brojElemenata()const {return brojelemenata;}
  495. virtual T trenutni() const {return tren->element;}
  496. virtual T &trenutni(){return tren->element;}
  497. virtual bool prethodni()
  498. {
  499. if(brojelemenata==0) throw "Greska!";
  500. if(tren==poc) return false;
  501. tren=tren->prethodni;
  502. return true;
  503. }
  504. virtual bool sljedeci()
  505. {
  506. if(brojelemenata==0) throw "Greska!";
  507. if(tren==kra) return false;
  508. tren=tren->sljedeci;
  509. return true;
  510. }
  511. virtual void pocetak()
  512. {
  513. if(brojelemenata==0) throw "Greska!";
  514. tren=poc;
  515. }
  516. virtual void kraj()
  517. {
  518. if(brojelemenata==0) throw "Greska!";
  519. tren=kra;
  520. }
  521. virtual void obrisi()
  522. {
  523. if(brojelemenata==0) throw "Greska!";
  524. if(brojelemenata==1)
  525. {
  526. delete poc;
  527. poc=nullptr;
  528. tren=nullptr;
  529. kra=nullptr;
  530. }
  531. else if(tren==poc)
  532. {
  533. DCvor* pomocni(tren);
  534. tren=tren->sljedeci;
  535. tren->prethodni=nullptr;
  536. poc=tren;
  537. delete pomocni;
  538. }
  539. else if(tren==kra)
  540. {
  541. tren=tren->prethodni;
  542. delete tren->sljedeci;
  543. tren->sljedeci=nullptr;
  544. kra=tren;
  545. }
  546. else
  547. {
  548. DCvor* pomocni(tren);
  549. tren=tren->prethodni;
  550. tren->sljedeci=pomocni->sljedeci;
  551. tren=pomocni->sljedeci;
  552. delete pomocni;
  553. }
  554. brojelemenata--;
  555. }
  556. virtual void dodajIspred(const T &el)
  557. {
  558. if(brojelemenata==0)
  559. {
  560. poc=new DCvor(el,nullptr,nullptr);
  561. tren=kra=poc;
  562. brojelemenata++;
  563. }
  564. else if(tren==poc)
  565. {
  566. poc=new DCvor(el,tren,nullptr);
  567. tren->prethodni=poc;
  568. brojelemenata++;
  569. }
  570. else
  571. {
  572. DCvor* nov=new DCvor(el,tren,tren->prethodni);
  573. tren->prethodni->sljedeci=nov;
  574. tren->prethodni=nov;
  575. brojelemenata++;
  576. }
  577. }
  578. virtual void dodajIza(const T &el)
  579. {
  580. if(brojelemenata==0)
  581. {
  582. poc=new DCvor(el,nullptr,nullptr);
  583. tren=kra=poc;
  584. brojelemenata++;
  585. }
  586. else if(tren==kra)
  587. {
  588. kra=new DCvor(el,nullptr,tren);
  589. tren->sljedeci=kra;
  590. brojelemenata++;
  591. }
  592. else
  593. {
  594. DCvor* nov=new DCvor(el,tren->sljedeci,tren);
  595. tren->sljedeci->prethodni=nov;
  596. tren->sljedeci=nov;
  597. brojelemenata++;
  598. }
  599. }
  600. virtual T operator [](int i) const
  601. {
  602. if(i<0 || i>=brojelemenata) throw "Greska!";
  603. DCvor *pomocni(poc);
  604. for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
  605. return pomocni->element;
  606. }
  607. virtual T &operator [](int i)
  608. {
  609. if(i<0 || i>=brojelemenata) throw "Greska!";
  610. DCvor *pomocni(poc);
  611. for(int j=0;j<i;j++) pomocni=pomocni->sljedeci;
  612. return pomocni->element;
  613. }
  614. ~DvostrukaLista()
  615. {
  616. if(brojelemenata>0)
  617. {
  618. auto temp=poc;
  619. while (poc->sljedeci!=nullptr)
  620. {
  621. poc=poc->sljedeci;
  622. delete temp;
  623. temp=poc;
  624. }
  625. delete temp;
  626. }
  627. }
  628.  
  629. };
  630. int main()
  631. {
  632. /* U mainu cemo pokazati kako se koriste sve funkcije i da li rade */
  633. JednostrukaLista<int> lista;
  634. lista.dodajIspred(13); // Dodavanje elemenata
  635. lista.dodajIza(14);
  636. lista.dodajIspred(15);
  637. lista.dodajIza(16);
  638. lista.dodajIspred(17);
  639. lista.dodajIza(18);
  640. cout<<lista.trenutni()<<endl;//metoda trenutni
  641. lista.pocetak(); // Mijenjanje pozicije
  642. cout<<lista.trenutni()<<endl;//metoda trenutni
  643. lista.kraj(); // Mijenjanje pozicije
  644. cout<<lista.trenutni()<<endl;//metoda trenutni
  645. for(int i=0;i<lista.brojElemenata();i++) cout<<lista[i]<<" ";//operator[]
  646. cout<<endl<<endl;
  647.  
  648. DvostrukaLista<int> dlista;
  649. dlista.dodajIspred(13); // Dodavanje elemenata
  650. dlista.dodajIza(14);
  651. dlista.dodajIspred(15);
  652. dlista.dodajIza(16);
  653. dlista.dodajIspred(17);
  654. dlista.dodajIza(18);
  655. cout<<dlista.trenutni()<<endl; //metoda trenutni
  656. dlista.pocetak(); // Mijenjanje pozicije
  657. cout<<dlista.trenutni()<<endl;//metoda trenutni
  658. dlista.kraj(); // Mijenjanje pozicije
  659. cout<<dlista.trenutni()<<endl;//metoda trenutni
  660. for(int i=0;i<dlista.brojElemenata();i++) cout<<dlista[i]<<" ";//operator[]
  661. cout<<endl<<endl;
  662.  
  663. NizLista<int> nlista;
  664. nlista.dodajIspred(13); // Dodavanje elemenata
  665. nlista.dodajIza(14);
  666. nlista.dodajIspred(15);
  667. nlista.dodajIza(16);
  668. nlista.dodajIspred(17);
  669. nlista.dodajIza(18);
  670. cout<<nlista.trenutni()<<endl;//metoda trenutni
  671. nlista.pocetak(); // Mijenjanje pozicije
  672. cout<<nlista.trenutni()<<endl;//metoda trenutni
  673. nlista.kraj(); // Mijenjanje pozicije
  674. cout<<nlista.trenutni()<<endl;//metoda trenutni
  675. for(int i=0;i<lista.brojElemenata();i++) cout<<nlista[i]<<" ";//operator[]
  676. cout<<endl<<endl;
  677. return 0;
  678. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement