To nije problem. Kada se ceo niz obrise, naravno da ce ostati prvih dvadeset elemenata. Posto je u pitanju tip int, bolje je bilo da se u osnovi node-a stavi lista od int[20], a ne lista pokazivaca na tip int*( kao int *lista[20]). Takodje kada obrises poslednji element ono sto se desava jeste smanjenje podatka _size za jedan. Nekad nema potrebe da se uradi bilo sta drugo, jer kako bi ti recimo mogao da obrises recimo 15 element niza int lista[20]? Jedino sto mozes da uradis jeste da recimo tom petnaestom elementu das neku vrednost kojom ces obeleziti da je izbrisan(recimo -1). Inace nema potrebe za brisanjem element po element(ne znam ni kako bi to uradio ako ne bih imao listu pokazivaca na tip int, sto u ovom slucaju nije potrebno). Ono sto je vazno jeste da se izbrise node ako se lista u tom node-u ne sadrzi vise nijedan element(sto mozemo zakljuciti preko promenljive _size). Tada se poslednji node brise. Tako i funkcija empty() brise sve elemente, ali kada ponovo inicijalizuje node prvi postoji mogucnost(cak je i verovatno) da ce da koristi memoriju koja je prethodno koriscena za node prvi, tako da ima iste elemente. Tvoja funkcija empty je gotovo ista kao i moja, evo objasnjenja:
Code:
void empty()
{
if (_size!=0)
{ if(prvi->next)
delete prvi->next;
delete prvi;
prvi=new node();
_size=0;
}
}
Kada obrises node prvi on dalje proverava ovaj tvoj deo koda
Code:
if(prvi->next)
delete prvi->next;
Dalje on to proverava za (prvi->next)->next i tako dalje. tako da obe funkcije rade isto samo tvoja ima jedan korak vise. Inace lepo si ovo napisao jer bi mozda bolje bilo da se ova funkcija napise kao:
Code:
void empty()
{
if (_size!=0)
{ if(prvi->next)
delete prvi->next;
_size=0;
}
}
Ostavljamo prvi node, ali menjamo _size pa iako imamo neke vrednosti prethodno koriscene to nije vazno posto prilikom koriscenja dinamickog niza treba paziti pre svega na velicinu. Jedino sto mogu da predlozim jeste da recimo ako hoces cisto zbog sebe da sve elemente koje izbrises stavis vrednost 0, mada za to nema potrebe.
Evo nekih primera gde se vidi da ove funkcije rade
Code:
// ovde se nalazi klasa CDLista
int main()
{
CDLista lista;
for (int i=0;i<152;i++)
lista.append(i);
printf("%d",lista[151]); // uspeva da otstampa posto postoji 152 elementa
lista.empty(); // brise sve elemente i inicijalizuje prvih dvadeset
printf("%d",lista[152]); // naravno ovde se javlja error i program se zavrsava jer se ne moze pristupiti 152 elementu
return 0;
}
Slicno proslom programu samo koristi funkciju pop().
Code:
// ovde se nalazi klasa CDLista
int main()
{
CDLista lista;
for (int i=0;i<152;i++)
lista.append(i);
printf("%d",lista[151]); // uspeva da otstampa posto postoji 152 elementa
for (int i=0;i<152;i++)
lista.pop(); // brise sve elemente i inicijalizuje prvih dvadeset
printf("%d",lista[152]); // naravno ovde se javlja error i program se zavrsava jer se ne moze pristupiti 152 elementu
return 0;
}
Ukoliko zelis da ti recimo operator [] vrati neku vrednost ako prekoracis velicinu niza kada pristupas index-u, mozes da promenis funkciju operator[] tako da izgleda ovako:
Code:
int& operator[](int index)
{
int error=0; //broj kojim ces obeleziti da si prekoracio velicinu niza
if (index>=_size) return error; // ukoliko je velicina niza prekoracena vraca taj broj
int koraci=index/velicinaNiza;
int element=index%velicinaNiza;
node *xnode=prvi;
for (int i=0; i<koraci; i++)
xnode=xnode->next;
return xnode->lista[element];
}
Nadam se da je ovo ono sto si zeleo.
[Ovu poruku je menjao Aleksa Stankovic dana 12.07.2008. u 12:28 GMT+1]