[ antonija @ 02.10.2004. 18:33 ] @
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?
[ Srki_82 @ 03.10.2004. 02:54 ] @
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 ;)
[ Časlav Ilić @ 03.10.2004. 07:58 ] @
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?
[ antonija @ 03.10.2004. 21:21 ] @
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!
[ Časlav Ilić @ 04.10.2004. 11:08 ] @
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).
[ antonija @ 05.10.2004. 19:35 ] @
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!
[ Časlav Ilić @ 06.10.2004. 07:33 ] @
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.
[ antonija @ 06.10.2004. 11:56 ] @
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.
[ Časlav Ilić @ 06.10.2004. 13:27 ] @
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.
[ Gojko Vujovic @ 06.10.2004. 17:24 ] @
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.
[ antonija @ 07.10.2004. 15:14 ] @
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;
    }