Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem kod klase s vezanom listom

[es] :: C/C++ programiranje :: problem kod klase s vezanom listom

[ Pregleda: 2645 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

antonija
Antonija Budimir

Član broj: 29581
Poruke: 17
213.191.144.*



Profil

icon problem kod klase s vezanom listom02.10.2004. u 18:33 - pre 237 meseci
Pozdrav! Ja imam zadatak da napravim klasu polinoma i to takvu da u vezanoj listi spremam parove(koeficijent, potencija) za pojedine clanove polinoma. Definirala sam strukturu el:
Code:

struct el {
    double koef;
    int pot;
    struct el *sljedeci;
};

i klasu polinoma sa privatnim clanovima stupanj i pocetak_liste i sa konstruktorom:
Code:

    Polinomi(int st, istream& is) {
        stupanj = st;
        struct el *novi_element = NULL;
        struct el *zadnji_el = NULL;
        struct el *prvi_el = NULL;
        pocetak_liste = new struct el; 
        if (pocetak_liste == NULL) {
            cout << "Nema dovoljno memorije!" << endl;
            exit (1);
        };
        for (int i = 0; i <= stupanj; i++) {
            novi_element = new struct el;
            is >> novi_element->koef;
            novi_element->pot = i;
            novi_element->sljedeci = NULL;
            if (i == 0) 
                pocetak_liste = novi_element; 
            dodaj_posle(zadnji_el, novi_element);
            zadnji_el = novi_element;
        };
    }

gde je dodaj_posle metoda koja stavlja novi_element u listu iza zadnji_element. Kompajler mi ne javlja nikakvu gresku ali kad pokrenem program u kojem inicijaliziram dva polinoma tim konstruktorom on zablokira. Mozete li mi pomoci?
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: problem kod klase s vezanom listom03.10.2004. u 02:54 - pre 237 meseci
Code:

    Polinomi(int st, istream& is) {

        stupanj = st;
        struct el *novi_element = NULL;
        struct el *zadnji_el = NULL;
        pocetak_liste = NULL; 

        for (int i = 0; i <= stupanj; i++) {
            novi_element = new struct el;
            is >> novi_element->koef;
            novi_element->pot = i;
            novi_element->sljedeci = NULL;
            if (i == 0) 
            {
                pocetak_liste = novi_element;
                zadnji_el = pocetak_liste;
            }
            else
            {
                zadnji_el->sljedeci = novi_element;
                zadnji_el = zadnji_el->sljedeci;
            }
        };
    }


Skoro je cetiri sata i popio sam ko zna koliko piva na zurci i ne znam vise ni kako se zovem... ali probaj da kod napises ovako. Mozda ce raditi, mozda nece... ali mogu ti bar malo objasniti (hik) u cemu je bio problem sa tvojim programom:

pocetak_liste = new struct el; i zatim malo dalje u kodu pocetak_liste = novi_element; Memorija curi na sve strane :) Zauzela si memoriju za pocetak_liste i zatim taj pokazivac zamenila drugim i vise ne mozes da oslobodis onu memoriju koju si zauzela. sasvim fin razlog za zakucavanje programa.

Mogla bi da postujes i funkciju dodaj_posle. Mozda i tu ima jos neka greska.

P.S.
Bitno je da pocetak_liste postavis samo jednom (npr. u konstruktoru) i da ga vise ne diras do unistenja klase.
E, da... i ono dodaj_posle nije potrebno ako ovako uradis klasu ;)
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.informatik.uni-erlangen.de



+27 Profil

icon Re: problem kod klase s vezanom listom03.10.2004. u 07:58 - pre 237 meseci
Ahem... šta bi sa onom prethodnom temom, čemu nova? :) Ako je funkcija dodaj_posle() definisana kao tamo (tu je jer će kasnije, pri sabiranju, opet da se dodaje u listu):

Code:
struct el * dodaj_posle (struct el *const tekuci_el, struct el *const novi_el) {
    if (novi_el != NULL && tekuci_el != NULL) {
        novi_el->sljedeci = tekuci_el->sljedeci;
        tekuci_el->sljedeci = novi_el;
    }
    return novi_el;
}


onda bi sledeće trebalo da radi:

Code:
Polinomi(int st, istream& is) {
        stupanj = st;
        struct el *novi_element = NULL;
        struct el *zadnji_el = NULL;

        for (int i = 0; i <= stupanj; i++) {
            novi_element = new struct el;
            is >> novi_element->koef;
            novi_element->pot = i;
            novi_element->sljedeci = NULL;
            zadnji_el = dodaj_posle(zadnji_el, novi_element);
            if (i == 0) pocetak_liste = zadnji_el;
        }
    }


Kao što reče Srđan, ono prvo rezervisanje memorije nije bilo potrebno, jer se sve radi u petlji (mada to sigurno nije uzrok pada programa, samo je loše jer nepotrebno baca memoriju, tj. „curi“). Opet da napomenem, kada rezervišeš memoriju preko new, nije potrebno proveravati da li je rezervisana pomoću ... == NULL, jer će new baciti izuzeće ako nema dovoljno memorije. Pošto dodaj_posle() vraća pokazivač na novododati element, može se odmah zapamtiti novi zadnji element, nije potrebna još jedna dodela.

Drugo, pošto se pamte i koeficijenti i stepeni, onaj (asistent) koji je to zadao verovatno ne želi da se u listi nalaze stepeni sa nultim koeficijentom. U tom slučaju, novi element bi trebalo rezervisati i dodavati u listu samo ako unešeni koeficijent nije nula.

A destruktor kako izgleda?
 
Odgovor na temu

antonija
Antonija Budimir

Član broj: 29581
Poruke: 17
213.191.144.*



Profil

icon Re: problem kod klase s vezanom listom03.10.2004. u 21:21 - pre 237 meseci
Pozdrav!
Presla sam na ovu novu temu jer onu nisam mogla naci. Mislim da ste mi je izbrisali. Inace, problem je bio u destruktoru pa sam to popravila i sad sve super radi. Medutim, moram jos napraviti operator zbrajanja ali mi kompajler javlja: internal compailer error. Ne znam zasto, a kod je sledeci:
Code:

    friend const Polinomi operator+(const Polinomi &a, const Polinomi &b) {
        const struct el *zbroj;
        struct el *zadnji_el = NULL;
        struct el *novi_element = NULL; 
        struct el *lista1 = NULL;
        struct el *lista2 = NULL;
        int p, naj = 0;
        for (lista1 = a.pocetak_liste; lista1 != NULL; lista1 = lista1->sljedeci) {
            if (naj > lista1->pot) {
                naj = lista1->pot;
                lista1 = a.pocetak_liste;
                lista2 = b.pocetak_liste;
            };
        };
        for (lista2 = b.pocetak_liste; lista2 != NULL; lista2 = lista2->sljedeci) {
            if (naj > lista2->pot) {
                naj = lista2->pot;
                lista1 = b.pocetak_liste;
                lista2 = a.pocetak_liste;
            };
        };
        for (lista1; lista1 != NULL; lista1 = lista1->sljedeci) {
            p = lista1->pot;
            for (lista2; (lista2 != NULL) || (lista2->pot <= p); lista2 = lista2->sljedeci) {
                novi_element = new struct el;
                if (lista2->pot = p) {
                    novi_element->koef = lista1->koef + lista2->koef;
                    novi_element->pot = p;
                    novi_element->sljedeci = NULL;
                    if (p == naj) {
                        zbroj = novi_element;
                    }
                    else {
                        dodaj_posle(zadnji_el, novi_element);
                    };
                    zadnji_el = novi_element;
                }
                else if ((lista2->pot > lista1->pot) && (lista2->sljedeci->pot < lista1->pot)) {
                    novi_element->koef = lista1->koef;
                    novi_element->pot = p;
                    novi_element->sljedeci = NULL;
                    dodaj_posle(zadnji_el, novi_element);
                    zadnji_el = novi_element;
                    for (start = lista2; lista2->pot < lista1->sljedeci->pot; start = start->sljedeci) {
                        novi_element->koef = start->koef;
                        novi_element->pot = start->pot;
                        novi_element->sljedeci = NULL;
                        dodaj_posle(zadnji_el, novi_element);
                        zadnji_el = novi_element;
                    };
                }
                else if ((lista1->pot > lista2->pot) && (lista1->sljedeci->pot < lista2->pot)) {
                    novi_element->koef = lista2->koef;
                    novi_element->pot = p;
                    novi_element->sljedeci = NULL;
                    dodaj_posle(zadnji_el, novi_element);
                    zadnji_el = novi_element;
                    for (start = lista1; lista1->pot < lista2->sljedeci->pot; start = start->sljedeci) {
                        novi_element->koef = start->koef;
                        novi_element->pot = start->pot;
                        novi_element->sljedeci = NULL;
                        dodaj_posle(zadnji_el, novi_element);
                        zadnji_el = novi_element;
                    };
                };
            };
            stupanj = p;
        };
        Polinomi A(zbroj);
        return(A);
    }

Hvala!
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.informatik.uni-erlangen.de



+27 Profil

icon Re: problem kod klase s vezanom listom04.10.2004. u 11:08 - pre 237 meseci
Ja sam se totalno izgubio u ovom kôdu, ne bih baš mogao da ukažem šta treba ispraviti. Ako je od neke pomoći, eto u prilogu jednostavnijeg rešenja (tu je ceo program, sa tu i tamo ispravljenim konstruktorima i destruktorom, kao i kopirajućim konstruktorom, koji u ovom slučaju nije strogo neophodan, ali ga treba obavezno ubaciti čim se u klasi nešto radi sa pokazivačima).
Prikačeni fajlovi
 
Odgovor na temu

antonija
Antonija Budimir

Član broj: 29581
Poruke: 17
*.sava.sczg.hr



Profil

icon Re: problem kod klase s vezanom listom05.10.2004. u 19:35 - pre 237 meseci
Bok!
Vas kod isto nije dobar. Uspije nekako zbrojiti polinome ali onda naglo zablokira! Mislim da je problem takoder kod operator+. Je li mozete provjeriti sto bi to moglo biti? Hvala!
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.informatik.uni-erlangen.de



+27 Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 07:33 - pre 237 meseci
Ne bi trebalo da blokira, eventualno da izbaci segmentnu grešku ili tako nešto. Da li ispiše dobar zbir? Odakle pokrećeš program (iz komandne linije, ili...)? Reci koje koeficijente si tačno zadala, da ih isprobam kod sebe.
 
Odgovor na temu

antonija
Antonija Budimir

Član broj: 29581
Poruke: 17
*.math.hr



Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 11:56 - pre 237 meseci
Ispise dobar zbir, samo kad ga ispise na kraju stavi znak za '+'. Kao da ne zna koliko tocno zbir ima koeficijenata. I nakon sto ispise zbir zablokira. Ne kompajliram ga iz komandne linije nego normalno.
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de



+27 Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 13:27 - pre 237 meseci
Probaj sa ovim u prilogu. U kopirajućem konstruktoru je bila jedna greška (nisam novi_el->sljedeci eksplicitno postavio na NULL, ali je moj kompilator to automatski uradio), možda je to jedini problem.

Inače, kad god kažeš da nešto ne radi, obavezno daj što detaljniji opis kako ne radi. Čim si rekla da ispiše dodatno + i stane, odmah sam znao da nešto nije u redu sa krajem liste, i krenuo da ulovim gde mi fali neko NULL.
Prikačeni fajlovi
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 17:24 - pre 237 meseci
Antonija, ako pogledas svoj profil, videces jasno nekoliko poslednjih tema koje si pokretala ili u kojima si ucestvovala sa odgovorima.

Tamo ces naci i link ka prethodnoj o vezanoj listi.
 
Odgovor na temu

antonija
Antonija Budimir

Član broj: 29581
Poruke: 17
*.sava.sczg.hr



Profil

icon Re: problem kod klase s vezanom listom07.10.2004. u 15:14 - pre 237 meseci
Imam jos samo problem kod mnozenja polinoma. Kad to zavrsim, onda sam gotova s programom. Kompajler mi opet ne javlja nikakavu gresku ali kad pokrenem program onda mi ne ispisuje nista. Kao da je svaki umnozak null. Kod je sledeci:
Code:

    friend const Polinomi operator* (const Polinomi &a, const Polinomi &b) {
        struct el *lista_a = a.pocetak_liste;
        struct el *lista_b = b.pocetak_liste;
        Polinomi c, d;
        struct el *zadnji = NULL;

        while (lista_a != NULL && lista_b != NULL) {
            struct el *pom = new struct el;
            if (lista_b != NULL) {
                pom->pot = lista_a->pot + lista_b->pot;
                pom->koef = lista_a->koef * lista_b->koef;
                pom->sljedeci = NULL;
                lista_b = lista_b->sljedeci;
                zadnji = dodaj_posle(zadnji, pom);
            }
            else {
                lista_a = lista_a->sljedeci;
                lista_b = b.pocetak_liste;
                if (c.pocetak_liste == NULL)
                    c.pocetak_liste = zadnji;
                d = d + c;
                obrisi_listu(c.pocetak_liste);
                obrisi_listu(zadnji);
                obrisi_listu(pom);
            };
        };
        return d;
    }
 
Odgovor na temu

[es] :: C/C++ programiranje :: problem kod klase s vezanom listom

[ Pregleda: 2645 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.