[ Lukic111 @ 30.05.2013. 13:22 ] @
Imam problem sa listama oko domaceg zadatka kod Krausa :)

Imam klasu Skladiste :
Skladište može da sadrži zadat broj predmeta do zadate ukupne zapremine i težine.
Predmeti se stavljaju pojedinačno na prvo slobodno mesto. Može da se izvadi prvi
predmet koji je jednak zadatom predmetu kao uzorku. Spisak sadržanih predmeta može
da se upiše u izlazni tok.


Nju sam "realizovao"(ali imam problem metodom(ili operatorskom funkcijom) koja treba da doda predmet na prvo slobodno mesto i metodom koja treba da izbaci predet koji je jednak zadatom predmetu):

Code:
#include "Predmet.h"

class Skladiste
{
    double max_zapremina,max_tezina;
    int max_broj_elemenata;

    struct Elem
    {
        Predmet *p;
        Elem *sledeci;

        Elem(Predmet *predmet=0, Elem *sl=0)
        {  
            p=predmet;
            sledeci=sl;
        }
    
        ~Elem(){delete p;}
    };

public:
    Elem *prvi,*poslednji;

    Skladiste(int m_b_e,double m_z,double m_t)
    { 
        max_broj_elemenata=m_b_e; 
        max_zapremina=m_z; 
        max_tezina=m_t;  
    
        prvi=poslednji=0;
    }

    //dodavanje predmeta na prvo slobodno mesto u sanduku!!!! PROBLEM ???
    Skladiste& operator+=(const Predmet &p)
    {
        Elem *novi=new Elem(p.kopija());
        Elem *tek=prvi;

        if (!prvi) { prvi=novi; }
        else
        {
            while(tek)
                tek=tek->sledeci;
            
            tek=novi;
        }

        return *this;
    }

    friend ostream& operator<<(ostream &it,const Skladiste &s)
    {
        Skladiste::Elem *tekuci=s.prvi;
        
        while(tekuci)
        {
            it<<*tekuci->p<<endl;
            tekuci=tekuci->sledeci;
        }
        return it;
    }
};


[Ovu poruku je menjao Mihajlo Cvetanović dana 30.05.2013. u 14:43 GMT+1]
[ Mihajlo Cvetanović @ 30.05.2013. 13:39 ] @
Moraš da navedeš kakav problem te muči, jer mi još uvek nismo razvili sposobnost telepatije, a informacije o problemu su neophodne za pronalaženje rešenja za dati problem. Dakle, šta očekuješ da se desi, a šta se zapravo dešava? Ako postoji neki ulaz u problem onda daj ulazne podatke, očekivane izlazne podatke, i aktuelne izlazne podatke.

Uzgred, da li operacije sa skladištem moraju da se rade pomoću operatora, ili to mogu da budu obične funkcije, recimo DodajNaKraj i UkloniSaPocetka? Ja lično ne volim da uvodim operatore bez preke potrebe, jer nisu dovoljno fleksibilni.
[ Mihajlo Cvetanović @ 30.05.2013. 13:52 ] @
Možda u ovom slučaju nema potrebe za opisivanjem problema. Imaš ulančanu listu, ali kad dodaš novi element na kraj liste onda moraš pretposlednji element da povežeš da pokazuje na novi. Takođe moraš stalno da ažuriraš i Skladiste::poslednji (kad već postoji, mada koliko vidim nigde se ne koristi, ali mogao bi).

Umesto

Code:
            while(tek)
                tek=tek->sledeci;


treba

Code:
            while(tek->sledeci)
                tek=tek->sledeci;


Jer treba da nađeš poslednji tek, a ne tek koji je jednak 0. Kad nađeš poslednji tek uveži ga sa novim poslednjim (probaj sam).
[ Lukic111 @ 30.05.2013. 20:55 ] @
Pa i meni se cini da sam dao sve potrebne informacije :)...

Pa za dodavanje pa prvo sobodno mesto mora operatorska funkcija jer su takvi zahtevi u zadatku...


Code:
Skladiste& operator+=(const Predmet &p){  //dodavanje predmeta na prvo slobodno mesto u sanduku!!!!
    
    Elem *novi=new Elem(p.kopija());
    Elem *tek=prvi;
    
    if(!prvi) { prvi=novi; }
    else {
        while(tek->sledeci){
        tek=tek->sledeci;
    }
    tek->sledeci=novi;
    }

    
    return *this;
    }




I u main-u:
Code:
    Skladiste s(10,10000,10000);

    s+=*new Valjak(1,1,1,'v');
    s+=*new Kupa(2,2,2,'b');
    s+=*new Sfera(3,3,'c');
    cout<<s;


Sada sve radi super :) Hvala :) E sada cu imati problem da napisem metodu za "vadjenje" elemenata iz liste...
[ Mihajlo Cvetanović @ 31.05.2013. 09:38 ] @
U jeziku C++ svako new mora da bude upareno s jednim delete (takođe, svako new[] mora da bude upareno sa delete[], ali to sad nije bitno). Kad se izvrši s+=*new Valjak(1,1,1,'v') onda se u memoriji (na heapu) kreira objekat, ali taj objekat se u ovom kodu nikad neće uništiti. Takve situacije treba izbegavati, i zato umesto ovog gore treba da stoji s+=Valjak(1,1,1,'v'). Značenje ovog koda je da se stvori objekat, ali ne na heapu nego na steku, i taj objekat će se automatski obrisati kad više ne budi bilo potrebe za njim (praktično, odmah posle izvršavanja operatora +=).