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

problem kod klase s vezanom listom

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

[ Pregleda: 1001 | Odgovora: 10 ]

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

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?
02.10.2004. u 18:33 

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1402
212.62.47.*

ICQ: 246436949


Profil

icon Re: problem kod klase s vezanom listom03.10.2004. u 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 ;)
DirectX na srpskom | GLScene na srpskom

There are only 10 types of people in this world; those who understand binary and those who don't.
03.10.2004. u 02:54 

Časlav Ilić
Braunšvajg, Nemačka

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



Profil

icon Re: problem kod klase s vezanom listom03.10.2004. u 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?
03.10.2004. u 07:58 

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
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!
03.10.2004. u 21:21 

Časlav Ilić
Braunšvajg, Nemačka

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



Profil

icon Re: problem kod klase s vezanom listom04.10.2004. u 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).
Prikačeni fajlovi
04.10.2004. u 11:08 

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
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!
05.10.2004. u 19:35 

Časlav Ilić
Braunšvajg, Nemačka

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



Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 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.
06.10.2004. u 07:33 

antonija
Antonija Budimir

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



Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 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.
06.10.2004. u 11:56 

Časlav Ilić
Braunšvajg, Nemačka

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



Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 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.
Prikačeni fajlovi
06.10.2004. u 13:27 

Gojko Vujovic
Juniper Networks
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13061
*.gojko.ss.

Sajt: www.gojkovujovic.com


Profil

icon Re: problem kod klase s vezanom listom06.10.2004. u 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.
06.10.2004. u 17:24 

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
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;
    }
07.10.2004. u 15:14 

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

[ Pregleda: 1001 | Odgovora: 10 ]

Postavi temu Odgovori

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