![]() Ласло Краус |
Објектно програмирање - колоквијуми Допунски први колоквијум 11. 12. 1999 |
---|
L1=L2
),
+L
), претходни
(-L
), последњи (++L
) и први
(--L
) елемент листе (вредност оператора је индикатор
успеха; у случају неуспеха текући елемент се не мења),
!L
) (текући
елемент увек постоји, осим ако је листа празна, у случају неуспеха
програм се прекида),
~L
) (претходни
или наредни елемент постаје текући, у случају неуспеха програм се
прекида),
L+=r
) и испред
(L-=r
) текућег елемента (нови елемент постаје
текући),
d<<L
).
// 1999_k1a.h - Definicija klase za dvostruko lancane liste (Lista).
#include <stdlib.h>
#include <iostream.h>
class Lista {
struct Elem { // Element liste.
double bro; Elem *pre, *nar;
Elem (int b=0, Elem *p=0, Elem *n=0)
{ bro = b; pre = p; nar = n; };
};
Elem *poc, *kra, *tek;
void kopiraj (const Lista &); // Kopiraj listu.
void brisi (); // Isprazni listu.
public:
Lista () { poc = kra = tek = 0; } // Stvori praznu listu.
Lista (double b) // Konv. broja u listu.
{ poc = kra = tek = new Elem (b); }
Lista (const Lista &lst) { kopiraj (lst); } // Inic. listom.
~Lista () { brisi (); } // Unisti listu.
Lista & operator= (const Lista &lst){ // Dodela vrednosti.
if (this != &lst) { brisi (); kopiraj (lst); }
return *this;
}
int operator+ () // Idi na naredni.
{ if (!tek || !tek->nar) return 0; tek = tek->nar; return 1; }
int operator- () // Idi na prethodni.
{ if (!tek || !tek->pre) return 0; tek = tek->pre; return 1; }
int operator++ () // Idi na krajnji.
{ if (!kra) return 0; tek = kra; return 1; }
int operator-- () // Idi na pocetni.
{ if (!poc) return 0; tek = poc; return 1; }
double & operator! () const // Uzmi tekuci.
{ if (!tek) exit (2); return tek->bro; }
void operator~ () ; // Brisi tekuci.
int prazna () { return tek == 0; } // Da li je lista prazna?
Lista & operator+= (double); // Dodaj iza tekuceg.
Lista & operator-= (double); // Dodaj ispred tekuceg.
friend ostream & operator<< (ostream&, const Lista&); // Pisi listu.
};
// 1999_k1a.cpp - Definicije metoda uz klasu Lista.
#include "1999_k1a.h"
void Lista::kopiraj (const Lista &lst){ // Kopiraj listu.
poc = kra = 0;
for (tek=lst.poc; tek; tek=tek->nar) {
kra = (!poc ? poc : kra->nar) = new Elem (tek->bro, kra);
if (kra == 0) exit (1);
}
tek = poc;
}
void Lista::brisi () { // Isprazni listu.
while (poc) { tek = poc; poc = poc->nar; delete tek; }
tek = kra = 0;
}
void Lista::operator~ () { // Brisi tekuci.
if (! tek) exit (2);
Elem *sta = tek;
if (tek->pre) tek = tek->pre; else tek = tek->nar;
(sta->pre ? sta->pre->nar : poc) = sta->nar;
(sta->nar ? sta->nar->pre : kra) = sta->pre;
delete sta;
}
Lista & Lista::operator+= (double b) { // Dodaj iza tekuceg.
if (! tek) {
if ((poc = kra = tek = new Elem (b)) == 0) exit (1);
} else {
tek = tek->nar = (tek->nar!=0 ? tek->nar->pre : kra)
= new Elem (b, tek, tek->nar);
if (! tek) exit (1);
}
return *this;
}
Lista & Lista::operator-= (double b) { // Dodaj ispred tekuceg.
if (! tek) {
if ((poc = kra = tek = new Elem (b)) == 0) exit (1);
} else {
tek = tek->pre = (tek->pre!=0 ? tek->pre->nar : poc)
= new Elem (b, tek->pre, tek);
if (! tek) exit (1);
}
return *this;
}
ostream & operator<< (ostream &d, const Lista &lst) { // Pisi listu.
d << '[';
for (Lista::Elem *t=lst.poc; t; t=t->nar)
{ d << t->bro; if (t->nar) d << ','; }
return d << ']';
}
// 1999_k1b.cpp - Ispitivanje klase Lista.
#include "1999_k1a.h"
#include <iostream.h>
int main () {
Lista lst;
for (int dalje=1; dalje; ) {
cout << "\n1 Prvi 5 Dodaj ispred"
"\n2 Prethodni 6 Dodaj iza"
"\n3 Naredni 7 Uzmi tekuci"
"\n4 Poslednji 8 Brisi tekuci"
"\n"
"\n9 Prikazi sve 0 Zavrsi"
"\n"
"\nVas izbor? ";
int izbor; cin >> izbor;
switch (izbor) {
case 1: if (! --lst) cout << "\n*** Ne postoji prvi ***\a\n";
break;
case 2: if (! -lst) cout << "\n*** Ne postoji prethodni ***\a\n";
break;
case 3: if (! +lst) cout << "\n*** Ne postoji naredni ***\a\n";
break;
case 4: if (! ++lst) cout << "\n*** Ne postoji poslednji ***\a\n";
break;
case 5: { cout << "Broj? "; double b; cin >> b; lst -= b; }
break;
case 6: { cout << "Broj? "; double b; cin >> b; lst += b; }
break;
case 7: if (! lst.prazna()) cout << "Broj= " << !lst << endl;
else cout << "\n*** Nema tekuceg ***\a\n";
break;
case 8: if (! lst.prazna()) ~lst;
else cout << "\n*** Nema tekuceg ***\a\n";
break;
case 9: cout << "Lista: " << lst << endl;
break;
case 0: dalje = 0; break;
default: cout << "\n*** Neispravan izbor ***\a\n";
}
}
return 0;
}
(садржај)
Copyright © 2010, Laslo Kraus
Последња ревизија: 4.10.2010.