C++ - Konstruktor kopije kod vezane liste

poruka: 4
|
čitano: 5.730
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
offline
C++ - Konstruktor kopije kod vezane liste

Pozdrav!

Htio bi napraviti duboku kopiju konstruktorom kopije jednostruko vezane liste npr. za sljedeći kod:

Pa ako netko zna,

 

 

#include<iostream>
using namespace std;

class Racunala
{
private:
    int invBroj;
public:
    Racunala(int broj);
    int GetInvBroj() {return invBroj;}
    Racunala* pokSljedeci;
    ~Racunala() {}
};
Racunala::Racunala(int broj)
{
    invBroj = broj;
    pokSljedeci = NULL;
}
int main()
{
    Racunala* glavaListe = NULL;
    Racunala* repListe = NULL;
    int brojRacunala;

    cout<< "Unesi broj racunala: ";
    cin>> brojRacunala;

    if(brojRacunala > 0)
    {
       for(int i=0; i<brojRacunala; i++)
       {
          Racunala* novoRacunalo = new Racunala(i+1);
          if(glavaListe == NULL)
          {
             glavaListe = novoRacunalo;
             repListe = novoRacunalo;
          }
          else
          {
             repListe->pokSljedeci = novoRacunalo;
             repListe = novoRacunalo;
          }
       }
    }
    repListe = glavaListe;
    while(repListe)
    {
       cout<< "Racunalo inventurni broj: " << repListe->GetInvBroj() << endl;
       repListe = repListe->pokSljedeci;
    }
    repListe = glavaListe;
    while(repListe)
    {
       Racunala* obrisi = repListe;
       repListe = repListe->pokSljedeci;
       delete obrisi;
    }
    glavaListe = NULL;
    return 0;
}

 

 

 

Poruka je uređivana zadnji put pon 22.11.2010 16:56 (Floki).
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ - Konstruktor kopije kod vezane liste

Kad kažeš duboko kopiranje što točno misliš? Konstruktor kopije bi napravio još jedno Računalo, spojio ga prije ili kasnije onog kojeg mu pošalješ, i vratio pointer na tog novog.

 

Racunala& Racunala::Racunala(const Racunala& r)
{
    Racunala novi=new(Racunala(r.GetInvBroj())); //to ce napravit novog sa podacima od starog

    //sad ih povezemo, novi ide nakon r-a

    novi.pokSljedeci=r.pokSljedeci;

    r.pokSljedeci=&novi;

    return novi;

}

 

Evo tako nešto, nisam compiliro {#}

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
17 godina
offline
C++ - Konstruktor kopije kod vezane liste

Hvala!

Ovo bi bilo umetanje novog objekta u istu listu nakon starog objekta sa podacima od starog objekta

Moram najprije modificirati program tako da objekte umećem preko klase Lista, dakle jedan objekt klase Lista označava vezanu listu objekata klase Računalo, tada bi se mogla

kopirati cijela lista u novu listu - a onda bi tek mogao napraviti duboku kopiju - to znači napraviti nove objekte kao kopije starih, a napraviti  nove pokazivače na nove objekte,

za razliku od duboke kopije, plitka kopija kao razultat daje novu listu čiji pokazivači pokazuju na iste objekte na koje pokazuju pokazivači stare liste

Ključna naredba za duboku kopiju je ova iz tvog koda:

Racunala novi = new(Racunala r.GetInvBroj());

Poruka je uređivana zadnji put sri 24.11.2010 13:08 (Floki).
 
0 0 hvala 0
17 godina
offline
C++ - Konstruktor kopije kod vezane liste

Evo, pošto sam ovako eksplicitno naveo naziv teme, možda netko dogugla na ovaj link tražeći konstruktor kopije vezane liste, pa možda ovo pomogne:

 

 

 

#include<iostream>
using namespace std;


class Racunalo
{
private:
    int invBroj;
    Racunalo* pokSljedeci;
public:
    Racunalo(int broj);
    int GetInvBroj() {return invBroj;}
    Racunalo* GetPokSljedeci() {return pokSljedeci;}
    void SetPokSljedeci(Racunalo* pok) {pokSljedeci = pok;}
    ~Racunalo() {cout<< "Obrisano racunalo inv. broj: " << GetInvBroj() << endl;}
};
Racunalo::Racunalo(int broj)
{
    invBroj = broj;
    pokSljedeci = NULL;
}
class Lista
{
private:
    Racunalo* glavaListe;
    Racunalo* repListe;
public:
    Lista();
    Lista(const Lista& refLista);        // deklaracija konstruktora kopije
    Racunalo* GetGlavaListe() {return glavaListe;}
    Racunalo* GetRepListe() {return repListe;}
    void UnesiListu(int brojElemenata);
    void IspisiListu();
    void ObrisiListu();
};
Lista::Lista()
{
    glavaListe = NULL;
    repListe = NULL;
}
void Lista::UnesiListu(int brojElemenata)
{
    if(brojElemenata>0)
    {
       for(int i=0; i<brojElemenata; ++i)
       {
          Racunalo* novoRacunalo = new Racunalo(i+1);
          if(glavaListe == NULL)
          {
             glavaListe = novoRacunalo;
             repListe = novoRacunalo;
          }
          else
          {
             repListe->SetPokSljedeci(novoRacunalo);
             repListe = novoRacunalo;
          }
       }
    }
    else
       cout<< "Broj elemenata mora biti veci od nule" << endl;
}
void Lista::IspisiListu()
{
    if(glavaListe != NULL)
    {
       Racunalo* pomocni = glavaListe;
       while(pomocni)
       {
          cout<< "Racunalo inventurni broj " << pomocni->GetInvBroj() << endl;
          pomocni = pomocni->GetPokSljedeci();
       }
    }
    else
       cout<< "Lista je prazna!" << endl;
}
void Lista::ObrisiListu()
{
    repListe = glavaListe;
    while(repListe)
    {
       Racunalo* pomocni = repListe;
       repListe = repListe->GetPokSljedeci();
       delete pomocni;
    }

    glavaListe = NULL;
}
Lista::Lista(const Lista& refLista)     // definicija konstruktora kopije
{
    glavaListe = NULL;
    repListe = NULL;
    Racunalo* pomocni = refLista.glavaListe;      // pomocni pokazivac dobija vrijednost
    while(pomocni)                                // pokazivaca glavaListe od objekta lista
    {
       Racunalo* novoRacunalo = new Racunalo(pomocni->GetInvBroj());
    if(glavaListe == NULL)        // kopiranje objekata iz objekta lista u objekt lista1
    {
       glavaListe = novoRacunalo;    // povezivanja kopiranog objekta u listi1
       repListe = novoRacunalo;
       pomocni = pomocni->GetPokSljedeci();   // pokazivac pomocni seta po objektima stare liste
    }
    else
    {
       repListe->SetPokSljedeci(novoRacunalo); // povezivanja kopiranog objekta u lista1
       repListe = novoRacunalo;
       pomocni = pomocni->GetPokSljedeci();   // pokazivac pomocni seta po objektma stare liste
    }                                          // kad dobije vrijednost NULL koiranje zavrsava
    }
}
int main()
{
    Lista lista;
    lista.UnesiListu(5);
    lista.IspisiListu();
    Lista lista1(lista);       // deklaracija liste lista1 i poziv konstruktra kopije tako da objekt lista
    lista.ObrisiListu();       // konstruktor kopije kopira u objekt lista1 - objekt lista se sastoji od
    lista1.IspisiListu();      // niza povezanih objekata klase Racunalo
    lista1.ObrisiListu();      // vidljivo je da se radi o dubokoj kopiji jer program nakon brisanja stare
                              // liste ispisuje objekte kopirane liste
    return 0;
}



 

 

Poruka je uređivana zadnji put sri 24.11.2010 20:57 (Floki).
 
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice