Guest User

Untitled

a guest
Jan 18th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.86 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template <typename Tip>
  6. class Iterator;
  7.  
  8. //Prva verzija klase Niz je bila preko vektora, pa je zbog toga ova klasa izmjenjena u odnosu na onu koju sam poslala kao Pripremu za tutorijal 2
  9. //Također, neke metode u svim klasama su izmjenjene na osnovu gresaka koje sam uvidjela nakon autotestova, vecina gresaka je bila vezana za pristup izvan opsega, pa su mjenjane samo vrijednosti koje vraca niz ili lista
  10. template<typename Tip>
  11. class Niz
  12. {
  13. int dimenzija;
  14. Tip* niz;
  15. int trenutno;//trenutni broj elemenata stavljenih u niz
  16. int pok; //index elementa na koji trenutno pokazuje
  17.  
  18. public:
  19. Niz() :dimenzija(0), trenutno(0), pok(0)
  20. {
  21.  
  22. niz=new Tip[0];
  23. }
  24.  
  25. virtual ~Niz()
  26. {
  27. delete[] niz;
  28. pok=0;
  29. trenutno=0;
  30. }
  31.  
  32. Niz(const Niz &n)
  33. {
  34.  
  35. dimenzija=n.dimenzija;
  36. niz=new Tip[n.dimenzija];
  37. for (int i=0; i<dimenzija; i++)
  38. {
  39. niz[i]=n.niz[i];
  40. }
  41. }
  42.  
  43.  
  44. Niz &operator=(const Niz &n)
  45. {
  46. delete[] niz;
  47. pok=0;
  48. trenutno=0;
  49.  
  50. dimenzija=n.dimenzija;
  51. niz=new Tip[n.dimenzija];
  52. for (int i=0; i<dimenzija; i++)
  53. {
  54. niz[i]=n.niz[i];
  55. }
  56.  
  57.  
  58. return *this;
  59. }
  60.  
  61.  
  62. virtual int brojElemenata()
  63. {
  64. return trenutno;
  65. }
  66.  
  67. virtual Tip trenutni()
  68. {
  69. return niz[trenutno-1];
  70. }
  71.  
  72. virtual bool prethodni()
  73. {
  74. if (trenutno==0) throw "Nema elemenata u nizu.";
  75. else if (trenutno==1) return false;
  76. else
  77. {
  78. pok--;
  79. return true;
  80. }
  81. }
  82.  
  83. virtual bool sljedeci()
  84. {
  85. if (trenutno==0) throw "Nema elemenata u nizu.";
  86. else if (trenutno==dimenzija) return false;
  87. else
  88. {
  89. pok++;
  90. return true;
  91.  
  92. }
  93.  
  94. }
  95.  
  96. virtual void pocetak()
  97. {
  98. pok=0;
  99. }
  100.  
  101. virtual void kraj()
  102. {
  103. pok=dimenzija;
  104. }
  105.  
  106. virtual void dodajIspred( const Tip &element)
  107. {
  108.  
  109. if (trenutno==0)
  110. {
  111. niz[0]=element;
  112. trenutno++;
  113. pok=0;
  114.  
  115. }
  116. else
  117. {
  118. Tip *niz1=new Tip[trenutno+1];
  119. for (int i=0; i<pok; i++)
  120. {
  121. niz1[i]=niz[i];
  122. }
  123. niz1[pok]=element;
  124. for (int j=pok+1; j<trenutno; j++)
  125. {
  126. niz1[j]=niz[j];
  127. }
  128. niz=niz1;
  129. pok++;
  130. trenutno++;
  131. }
  132. }
  133.  
  134.  
  135. virtual void dodajIza(const Tip &element)
  136. {
  137.  
  138.  
  139.  
  140.  
  141. if (trenutno==0)
  142. {
  143. niz[trenutno-1]=element;
  144. trenutno++;
  145. pok=0;
  146. }
  147.  
  148. else
  149. {
  150.  
  151. Tip *niz1=new Tip[trenutno+1];
  152.  
  153. for (int i=0; i<=pok; i++)
  154. {
  155.  
  156. niz1[i]=niz[i];
  157.  
  158. }
  159. niz1[pok]=element;
  160.  
  161. for (int j=pok+1; j<trenutno; j++)
  162. {
  163. niz1[j]=niz[j];
  164. }
  165. niz=niz1;
  166. pok++;
  167. trenutno++;
  168. }
  169. }
  170.  
  171.  
  172. virtual void obrisi()
  173. {
  174. if (trenutno==0) throw "Niz je prazan.";
  175.  
  176. Tip *niz1=new Tip[trenutno];
  177. for (int i=0; i<pok; i++)
  178. {
  179. niz1[i]=niz[i];
  180. }
  181. for (int j=pok+1; j<trenutno; j++)
  182. {
  183. niz1[j]=niz[j];
  184. }
  185.  
  186. if (pok==trenutno-1) pok--;
  187. else pok++;
  188. trenutno--;
  189. niz=niz1;
  190.  
  191.  
  192. }
  193.  
  194.  
  195. virtual Tip operator [] (int n) const
  196. {
  197. if (n<0) throw "Ne postoji taj clan niza.";
  198. return niz[n-1];
  199. }
  200.  
  201. friend class Iterator<Tip>;
  202. };
  203.  
  204.  
  205.  
  206. // obzirom da smo dobili neke upute vezane za implementacije pojedinih metoda klase Lista, doslo je do nekih izmjena u metodama, obzirom da je nacin na koji sam implementirala metode za pripremu za tutorijal bio pogresan.
  207. template<typename Tip>
  208. class Lista: public Niz<Tip>
  209. {
  210.  
  211. struct Cvor //izmjena naziva struktura iz Clan u Cvor i Clan* veza u Cvor* _sljedeci, zbog prilagodjavanja imena i funkcije koju obavlja Cvor sljedeci, cisto radi lakse orjentacije
  212. {
  213. Tip element;
  214. Cvor *_sljedeci;
  215. };
  216. Cvor* p; //pocetni
  217. Cvor* tr; //trenutni
  218. Cvor *poslj;// posljednji
  219. int br; // ukupan broj cvorova
  220.  
  221.  
  222. public:
  223. Lista() :p(0), tr(0), poslj(0), br(0) {} //atributi su bili implementirani unutar zagrada, pa sam ih prebacila u konstruktorsku inicijalizacijsku listu
  224.  
  225. ~Lista()
  226. {
  227.  
  228. Cvor *novi(p);
  229. while (novi->_sljedeci!=0)
  230. {
  231. novi=novi->_sljedeci;
  232. delete p;
  233. p=novi;
  234. }
  235. delete novi;
  236. p=tr=poslj=0;
  237. }
  238.  
  239. Lista(Lista &a)
  240. {
  241. br=a.br;
  242. p= new Cvor(*p);
  243. Cvor *temp(a.p);
  244. Cvor *temp1(p);
  245. while (temp!=0)
  246. {
  247. if (temp==a.tr) tr=temp1;
  248. temp1->_sljedeci=new Cvor(*temp);
  249. temp1=temp1->_sljedeci;
  250. temp=temp->_sljedeci;
  251. }
  252. }
  253.  
  254. Lista &operator=(Lista &a)
  255. {
  256. Cvor *temp=p;
  257. while (temp->_sljedeci!=0)
  258. {
  259. temp=temp->_sljedeci;
  260. delete p;
  261. p=temp;
  262. }
  263. delete temp;
  264. p=tr=poslj=0;
  265.  
  266. br=a.br;
  267. p=new Cvor(*p);
  268. temp=a.p;
  269. Cvor *temp1(p);
  270. while (temp!=0)
  271. {
  272. if (temp==a.tr) tr=temp1;
  273. temp1->_sljedeci=new Cvor(temp);
  274. temp1=temp1->_sljedeci;
  275. temp=temp->_sljedeci;
  276. }
  277. return *this;
  278. }
  279.  
  280. int brojElemenata()
  281. {
  282. return br;
  283. }
  284.  
  285. Tip trenutni() const
  286. {
  287. if (br==0) throw "Lista je prazna.";
  288. return tr->element;
  289. }
  290.  
  291. bool prethodni()
  292. {
  293. if (br==0) return false;
  294. Cvor *novi=p;
  295. while (novi->_sljedeci!=tr)
  296. {
  297. novi=novi->_sljedeci;
  298. }
  299. tr=novi;
  300. return true;
  301. }
  302.  
  303.  
  304. bool sljedeci()
  305. {
  306. if (tr==poslj) return false;
  307. tr=tr->_sljedeci;
  308. return true;
  309. }
  310.  
  311. void pocetak()
  312. {
  313. tr=p;
  314. }
  315.  
  316. void kraj()
  317. {
  318.  
  319. tr=poslj; //Obzirom da sam naknadno dodala varijablu posljednji, promjenila sam i ovu metodu u odnosu kakvu sam je poslala kao pripremu za tutorijal 2.
  320. }
  321.  
  322. void obrisi()
  323. {
  324. if (tr==p)
  325. {
  326. p=p->_sljedeci;
  327. delete tr;
  328.  
  329. br--;
  330. tr=p;
  331.  
  332. }
  333. else
  334. {
  335. Cvor *temp=p;
  336. while (temp->_sljedeci!=tr)
  337. {
  338. temp=temp->_sljedeci;
  339. }
  340. temp->_sljedeci=tr->_sljedeci;
  341. delete tr;
  342. br--;
  343. tr=temp;
  344.  
  345.  
  346. }
  347. }
  348.  
  349.  
  350. void dodajIza(const Tip &el)
  351. {
  352. Cvor* novi=new Cvor;
  353. novi->element=el;
  354. novi->_sljedeci=0;
  355. if (br==0)
  356. {
  357. poslj=tr=novi;
  358. }
  359. else
  360. {
  361. novi->_sljedeci=tr->_sljedeci;
  362. tr->_sljedeci=novi;
  363. }
  364. br++;
  365. }
  366.  
  367. void dodajIspred(const Tip &el)
  368. {
  369. if (br==0)
  370. {
  371. p=new Cvor;
  372. p->element=el;
  373. p->_sljedeci=0;
  374. tr=p;
  375. br++;
  376. return;
  377. }
  378.  
  379. if (tr==p)
  380. {
  381. Cvor* novi=new Cvor;
  382. novi->_sljedeci=p;
  383. novi->element=el;
  384. p=novi;
  385. br++;
  386. return;
  387. }
  388. prethodni();
  389. dodajIza(el);
  390. sljedeci();
  391. sljedeci();
  392. }
  393.  
  394. Tip &operator [](int n)
  395. {
  396. if (n<0 || n>br) throw "Ne postoji taj clan niza.";
  397. Cvor* temp(p);
  398. for (int i=0; i<n; i++)
  399. {
  400. temp=temp->_sljedeci;
  401. }
  402. return temp->element;
  403. }
  404.  
  405. friend class Iterator<Tip>;
  406. };
  407.  
  408.  
  409.  
  410. template <typename Tip>
  411. class Iterator
  412. {
  413. const Niz<Tip> *niz;
  414. const Lista<Tip> *lista;
  415. int trenutniNiz;
  416. typename Lista<Tip>::Cvor *trenutniLista;
  417.  
  418. public:
  419.  
  420. Iterator(const Niz<Tip> &n) : niz(n), lista(0), trenutniNiz(0), trenutniLista(0) {}
  421.  
  422. Iterator(const Lista<Tip> &l) : lista(l), trenutniLista(l.p), niz(0), trenutniNiz(0) {}
  423.  
  424. Tip trenutni()
  425. {
  426. if (niz==0 && lista==0 && trenutniLista==0) throw "Niz je prazan.";
  427. else if (niz==0 && lista==0 && trenutniNiz==0) throw "Lista je prazna.";
  428. else if (niz!=0) return niz->_niz[trenutniNiz];
  429. else return trenutniLista->element;
  430. }
  431.  
  432. Tip prethodni()
  433. {
  434. typename Lista<Tip>::Cvor *novi(trenutniLista);
  435. if (niz==0 && lista==0 && trenutniLista==0) throw "Niz je prazan.";
  436. else if (niz==0 && lista==0 && trenutniNiz==0) throw "Lista je prazna.";
  437. else if (niz!=0)
  438. {
  439. trenutniNiz--;
  440. return niz->_niz[trenutniNiz];
  441. }
  442. else
  443. {
  444. while (novi->_sljedeci!=trenutniLista)
  445. {
  446. novi=novi->_sljedeci;
  447. }
  448. return trenutniLista->element;
  449.  
  450.  
  451. }
  452. }
  453.  
  454. Tip sljedeci()
  455. {
  456. if (niz==0 && lista==0 && trenutniLista==0) throw "Niz je prazan.";
  457. else if (niz==0 && lista==0 && trenutniNiz==0) throw "Lista je prazna.";
  458. else if (niz!=0)
  459. {
  460. trenutniNiz++;
  461. return niz->_niz[trenutniNiz];
  462. }
  463. else
  464. {
  465. trenutniLista=trenutniLista->_sljedeci;
  466. return trenutniLista->element;
  467. }
  468. }
  469.  
  470. Tip pocetak()
  471. {
  472. if (niz==0 && lista==0 && trenutniLista==0) throw "Niz je prazan.";
  473. else if (niz==0 && lista==0 && trenutniNiz==0) throw "Lista je prazna.";
  474. else if (niz!=0)
  475. {
  476. trenutniNiz=0;
  477. return niz->_niz[trenutniNiz];
  478. }
  479. else
  480. {
  481. trenutniLista=trenutniLista.p;
  482. return trenutniLista->element;
  483. }
  484. }
  485.  
  486. Tip kraj()
  487. {
  488. if (niz==0 && lista==0 && trenutniLista==0) throw "Niz je prazan.";
  489. else if (niz==0 && lista==0 && trenutniNiz==0) throw "Lista je prazna.";
  490. else if (niz!=0)
  491. {
  492. int a(0);
  493. for (int i=0; i<niz.brojElemenata(); i++)
  494. a++;
  495.  
  496. trenutniNiz=a;
  497. return niz->_niz[trenutniNiz];
  498. }
  499. else
  500. {
  501. trenutniLista=trenutniLista.poslj;
  502. return trenutniLista->element;
  503. }
  504. }
  505.  
  506. };
  507.  
  508.  
  509.  
  510. template<typename Tip>
  511. class DvostrukaLista: public Niz<Tip>
  512. {
  513. struct Cvor
  514. {
  515. Tip element;
  516. Cvor* _sljedeci;
  517. Cvor* _prethodni;
  518.  
  519. };
  520.  
  521. Cvor* _pocetak; //pokazivac na pocetni cvor
  522. Cvor* _kraj; //pokazivac na krajnji cvor
  523. Cvor* tekuci; //pokazivac na prethodnika tekuceg
  524. int brojEl;
  525. public:
  526. DvostrukaLista() : tekuci(0), _pocetak(0), _kraj(0), brojEl(0) {}
  527.  
  528. ~DvostrukaLista()
  529. {
  530. while (_pocetak!=0)
  531. {
  532. tekuci=_pocetak;
  533. _pocetak=_pocetak->_sljedeci;
  534. delete tekuci;
  535. }
  536.  
  537. _kraj=0;
  538. tekuci=0;
  539. }
  540.  
  541. DvostrukaLista(DvostrukaLista &a)
  542. {
  543. brojEl=a.brojEl;
  544. _pocetak= new Cvor(*_pocetak);
  545. Cvor *temp(a._pocetak);
  546. Cvor *temp1(_pocetak);
  547. while (temp!=0)
  548. {
  549. if (temp==a.tekuci) tekuci=temp1;
  550. temp1->_sljedeci=new Cvor(temp);
  551. temp1=temp1->_sljedeci;
  552. temp=temp->_sljedeci;
  553. }
  554. }
  555.  
  556. DvostrukaLista &operator=(DvostrukaLista &a)
  557. {
  558. while (_pocetak!=0)
  559. {
  560. tekuci=_pocetak;
  561. _pocetak=_pocetak->_sljedeci;
  562. delete tekuci;
  563. }
  564.  
  565. _kraj=0;
  566. tekuci=0;
  567.  
  568. brojEl=a.brojEl;
  569. _pocetak= new Cvor(*_pocetak);
  570. Cvor *temp(a._pocetak);
  571. Cvor *temp1(_pocetak);
  572. while (temp!=0)
  573. {
  574. if (temp==a.tekuci) tekuci=temp1;
  575. temp1->_sljedeci=new Cvor(temp);
  576. temp1=temp1->_sljedeci;
  577. temp=temp->_sljedeci;
  578. }
  579.  
  580.  
  581. return *this;
  582. }
  583.  
  584. int brojElemenata()
  585. {
  586. return brojEl;
  587. }
  588.  
  589. Tip trenutni() const
  590. {
  591. if (brojEl==0) throw "Niz je prazan.";
  592. return tekuci->element;
  593. }
  594.  
  595. bool prethodni()
  596. {
  597. if (brojEl==0) return false;
  598. if (tekuci!=_pocetak)
  599. {
  600. tekuci=tekuci->_prethodni;
  601. return true;
  602. }
  603. }
  604.  
  605.  
  606. bool sljedeci()
  607. {
  608. if (tekuci==_kraj) return false;
  609. if (brojEl==0) return false;
  610. if (tekuci!=_kraj)
  611. {
  612. tekuci=tekuci->_sljedeci;
  613. return true;
  614. }
  615. }
  616.  
  617. void pocetak()
  618. {
  619. tekuci=_pocetak;
  620. }
  621.  
  622. void kraj()
  623. {
  624.  
  625. tekuci=_kraj;
  626. }
  627.  
  628. void obrisi()
  629. {
  630. if (tekuci==_pocetak)
  631. {
  632. _pocetak=_pocetak->_sljedeci;
  633. delete tekuci;
  634. tekuci=_pocetak;
  635. brojEl--;
  636. }
  637. else
  638. {
  639. Cvor *temp=_pocetak;
  640. while (temp->_sljedeci!=tekuci)
  641. {
  642. temp=temp->_sljedeci;
  643. }
  644. temp->_sljedeci=tekuci->_sljedeci;
  645. delete tekuci;
  646. tekuci=temp;
  647. brojEl--;
  648. }
  649. }
  650.  
  651.  
  652. void dodajIza(const Tip &el)
  653. {
  654. Cvor* novi=new Cvor;
  655. novi->element=el;
  656. novi->_sljedeci=0;
  657. if (brojEl==0)
  658. {
  659. _kraj=tekuci=novi;
  660. }
  661. else
  662. {
  663. novi->_sljedeci=tekuci->_sljedeci;
  664. tekuci->_sljedeci=novi;
  665. }
  666. brojEl++;
  667. }
  668.  
  669. void dodajIspred(const Tip &el)
  670. {
  671. Cvor* novi=new Cvor;
  672. novi->element=el;
  673. novi->_sljedeci=0;
  674. if (brojEl==0)
  675. {
  676. _kraj=tekuci=novi;
  677. }
  678. else
  679. {
  680. novi->_sljedeci=tekuci->_prethodni;
  681. tekuci->_sljedeci=novi;
  682. }
  683. brojEl++;
  684.  
  685. }
  686.  
  687. Tip &operator[](int n)
  688. {
  689. if (n<0 ) throw "Ne postoji taj clan niza.";
  690. Cvor* temp(pocetak);
  691. for (int i=0; i<n; i++)
  692. {
  693. temp=temp->_sljedeci;
  694. }
  695. return temp->element;
  696. }
  697. };
  698.  
  699.  
  700.  
  701. template<typename Tip_>
  702. Tip_ dajMaksimum(const Niz<Tip_>& n)
  703. {
  704. int index(0);
  705. if (int(n.trenutni())==0) throw "Niz je prazan.";
  706. else
  707. {
  708. int max=n[0];
  709.  
  710. for (int i=0; i<int(n.brojElemenata()); i++)
  711. {
  712.  
  713. if (n[i]>max) max=n[i];
  714. index=i;
  715. }
  716. }
  717.  
  718. return n[index];
  719.  
  720. }
  721.  
  722. template<typename Tip>
  723. Tip dajMaksimum( Lista<Tip> &n)
  724. {
  725.  
  726. Tip max=0;
  727. for (int i=1; i<n.brojElemenata(); i++)
  728. {
  729.  
  730. if (max<n.trenutni()) max=n.trenutni();
  731. }
  732.  
  733. return max;
  734. }
  735.  
  736.  
  737. template<typename Tip>
  738. Tip dajMaksimum( DvostrukaLista<Tip> &dl)
  739.  
  740. {
  741. Tip max=dl.trenutni();
  742. for (int i=1; i<dl.brojElemenata(); i++)
  743. {
  744. if (dl.trenutni()>max) max=dl.trenutni();
  745.  
  746. }
  747.  
  748. return max;
  749. }
  750.  
  751. int main()
  752. {
  753.  
  754. try
  755. {
  756. Niz<int>* niz;
  757. niz = new Niz<int>;
  758.  
  759. niz->dodajIza(2);
  760. niz->dodajIspred(3);
  761. niz->dodajIza(5);
  762. for (int i(1); i<3; i++)
  763. cout << (*niz)[i] << " ";
  764. delete niz;
  765.  
  766. Lista<int> *lista;
  767. lista=new Lista<int>;
  768. lista->dodajIspred(2);
  769. lista->dodajIza(3);
  770. cout<<(*lista)[1];
  771.  
  772. }
  773.  
  774. catch (const char tekst[])
  775. {
  776. cout<<tekst;
  777. }
  778. catch (...)
  779. {
  780. cout << "\nGreska u programu";
  781. }
  782.  
  783. return 0;
  784. }
Add Comment
Please, Sign In to add comment