Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 31 odgovor
  • 8.856 pregleda

Najnovija ↓

Re: [Zadatak] Dinamicki Array 09.07.2008. u 14:56 · pre 223 meseca
izmenjeno 1 put, poslednji put Kushwais 10.07.2008. u 00:06
  1. Kushwais10.07.2008. u 00:06zapis iz teksta poruke
#21
i print() funkcija . uspevam ispravno samo prvih 20 elementa da ispisem ?

hvala

print () radi kako treba :)
Re: [Zadatak] Dinamicki Array 11.07.2008. u 19:44 · pre 222 meseca
izmenjeno 1 put, poslednji put Kushwais 11.07.2008. u 23:06
  1. Kushwais11.07.2008. u 23:06zapis iz teksta poruke
#23
Leto i odmori su u toku :) ali ako nekog ima molio bih da mi odgovori ...

promenio sam funkciju empty()

Code:
void empty()                                    
    {
        if (_size!=0)                               
        {   node *xnode=prvi;
            int koraci=_size/velicinaNiza;
            for(int i=0;i<koraci;i++)
            xnode=xnode->next;
            delete xnode->lista;           
            _size=0;
            prvi->next=0;
        }
    }


ne znam da li je ovo u redu ?? hvala


hm, provereno ne valja
Re: [Zadatak] Dinamicki Array 11.07.2008. u 23:24 · pre 222 meseca #24
Citat:
Kushwais: Hvala opat na objasnjenju :)

da li je dovoljno u destructoru

~ node (){
..... }

dovoljno obrisati samo next ili je mozda potrebno i listu ??


destruktor(koji sam zaboravio da ubacim) izgleda ovako :
Code:


~CDLista()
    {
        delete prvi;
    }


brisanjem node-a prvi dalje se rekurzivno brisu i ostali node-ovi.
Sta tacno nije dobro sa funkcijama pop() i empty()? Kod mene dobro rade. Ako mozes navedi kod u kojima ih koristis.
Re: [Zadatak] Dinamicki Array 11.07.2008. u 23:58 · pre 222 meseca #25
pa recimo u funkciji empty();

CDLista a ;
...

a.empty();
cout<<a[0];
cout<<a[1];
...

jedino sto je izrisano je prvi index , dobija vrednsot 0 ali zato ostali indexi su tu, vrednosti koje sam pre ubacio .

milsim da je isti probllem kod pop()
Re: [Zadatak] Dinamicki Array 12.07.2008. u 00:32 · pre 222 meseca #26
void empty()
{
if (_size!=0)
{ if(prvi->next)
delete prvi->next;
delete prvi;
prvi=new node();
_size=0;
}
}

ovako sam ja to ispravio , da li je ok??
Re: [Zadatak] Dinamicki Array 12.07.2008. u 12:00 · pre 222 meseca
izmenjeno 1 put, poslednji put Aleksa Stankovic 12.07.2008. u 12:28
  1. Aleksa Stankovic12.07.2008. u 12:28zapis iz teksta poruke
#27
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.
Re: [Zadatak] Dinamicki Array 13.07.2008. u 13:13 · pre 222 meseca #28
Hvala za trud Aleksa :) dosta mi je pomoglo !

Nazalost copyconstuktor radi lepo samo za prvih 20 elemenata , ako upisem vise , ispise mi "slucajne brojeve "
Re: [Zadatak] Dinamicki Array 13.07.2008. u 20:41 · pre 222 meseca #29
Code:
DynArray( DynArray& lista)                 
    {                                      
        _size=lista._size;                  
        //prvi=new node(*lista.prvi);
           prvi=lista.prvi;
                                           
                                         
    }



sada radi :)
Re: [Zadatak] Dinamicki Array 14.07.2008. u 22:24 · pre 222 meseca #30
Citat:
Kushwais:
Code:
DynArray( DynArray& lista)                 
    {                                      
        _size=lista._size;                  
        //prvi=new node(*lista.prvi);
           prvi=lista.prvi;
                                           
                                         
    }



sada radi :)



Mozes li da opises problem sa konstruktorom koristeci kod, posto i ovo kod mene radi. Inace, ovaj kod koji si ti napisao nije dobar iz razloga sto dodeljujes iste adrese, pa kada menjas podatak jedne liste menjas podatak i druge. Primer:
Code:


#include "DynArray"

int main()
{
    DynArray lista1;
    for (int i=0; i<145 ; i++)
    lista1.append(i);
    DynArray lista2(lista1);
    lista1[56]=2;
    cout << (lista2)[56];
    return 0;
}


Koristeci tvoju definiciju, na ekran ce se ispisati 2, dok je pravilno da bude ispisano 56. Sa mojim primerkom ovog konstruktora ne dolazi do ovog problema.
Re: [Zadatak] Dinamicki Array 16.07.2008. u 14:37 · pre 222 meseca #31
U pravu si Aleksa , to sam i kasnije sam video ... problem je doslo samo prilikom ispisa posto sam u node napravio metodu print , kao i u CDLista ..., a ne u constructory , no to sam ispravio sad je sve u najboljme rede !


Desetka za trud Aleksa ;) hvala puno !!!!
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme