Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] lista dwukierunkowa, dodawanie/wyswietlanie nie działa

Ostatnio zmodyfikowano 2016-04-17 09:35
Autor Wiadomość
exik92
Temat założony przez niniejszego użytkownika
[C++] lista dwukierunkowa, dodawanie/wyswietlanie nie działa
» 2016-04-16 20:58:45
Witam. Jestem w trakcie robienia mini projektu dotyczącego czytelników, książek i ich wypożyczania. Zamieszczę jedynie fragment kodu, w którym występuje problem oraz pozostały kod do uruchomienia programu. Problem tkwi w poprawnym wydrukowaniu czytelników tzn: imię, nazwisko oraz dla każdego (dwukierunkowa) lista wypożyczonych książek.  W main'ie kod pokazuje, że funkcja print(lista) działa poprawnie. Natomiast gdy chce za pomocą funkcji wyświetlić grupę czytelników, która korzysta z funkcji print(lista), program się wykrzacza. Najciekawsze jest to, że dla jednego czytelnika wszystko działa. Natomiast gdy do grupy dodam kolejnego czytelnika to wtedy jest błąd. Czy ktoś mógłby mi pomóc?



C/C++
#include <iostream>
#include <cstdlib>


using namespace std;

class Ksiazka {
private:
    Ksiazka * pop, * nast;
   
public:
    string tytul;
   
    Ksiazka * getPop() { return pop; }
    Ksiazka * getNast() { return nast; }
    void setPop( Ksiazka * NewPop ) { pop = NewPop; }
    void setNast( Ksiazka * NewNast ) { nast = NewNast; }
   
    void pobierzK()
    {
        cout << "Podaj tytul ksiazki" << endl;
        cin >> tytul;
    }
   
    Ksiazka() { };
    //Ksiazka(){pop=NULL;nast=NULL;tytul="";}
    Ksiazka( string SETtytul ) { pop = NULL; nast = NULL; tytul = SETtytul; }
    Ksiazka( Ksiazka * R ) { tytul = R->tytul; };
   
    void wydruk()
    {
        //if(tytul!="")
        cout << "Tytul: " << tytul << endl; }
   
   
};




C/C++
class Lista {
public:
    Ksiazka * pierwszy, * ostatni;
    int ilosc;
    Lista() { pierwszy = NULL; ostatni = NULL; ilosc = 0; }
    Lista( Lista * M ) { pierwszy = M->pierwszy; ostatni = M->ostatni; ilosc = M->ilosc; }
    //Lista(string nazwa1) {pierwszy=NULL; ostatni=NULL; ilosc=0; nazwa=nazwa1;}
   
    ~Lista() {
        Ksiazka * E = pierwszy; Ksiazka * Temp;
        while( E )
        { Temp = E;
            E = Temp->getNast();
            delete Temp; }
    }
   
   
    void Add2Begin( Ksiazka * E )
    {
        if( pierwszy ) {
            pierwszy->setPop( E );
            E->setNast( pierwszy );
            pierwszy = E;
            ilosc++;
        }
       
        else {
            pierwszy = E;
            ostatni = E;
            ilosc = 1;
            //pierwszy->setPop(NULL);
            //pierwszy->setNast(NULL);
        }
       
    }
   
   
};



void print( Lista * M ) {
    Ksiazka * Temp;
    Temp = M->pierwszy;
    if( Temp == NULL ) { cout << endl; cout << "Brak elementow" << endl; }
    else {
        cout << "ilosc: " << M->ilosc << endl;
        while( Temp )
        { Temp->wydruk();
            Temp = Temp->getNast(); };
    }
}



C/C++
class Czytelnik
    : public Ksiazka
     , Lista
{ public:
    string Imie;
    string Nazwisko;
    Lista * K;
    Czytelnik() { Imie = ""; Nazwisko = ""; K = NULL; };
    Czytelnik( string imie, string nazwisko, string TYTUL ) { Imie = imie; Nazwisko = nazwisko; tytul = TYTUL; };
    Czytelnik( string imie, string nazwisko, Lista * R ) { Imie = imie; Nazwisko = nazwisko; K = R; };
   
    void pobierz() {
        cout << "Podaj imie" << endl;
        cin >> Imie;
       
        cout << "Podaj nazwisko" << endl;
        cin >> Nazwisko; }
};



class grupa
    : public Czytelnik
{
public:
    int ilosc;
    Czytelnik * ekipa;
   
    grupa() { ekipa = NULL; ilosc = 0; }
   
    void wyswietl() {
        if( ekipa == NULL )
        { cout << "lista czytelnikow jest pusta" << endl; }
        else {
            cout << "ilosc: " << ilosc << endl;
            for( int i = 0; i < ilosc; i++ )
            { cout << i + 1 << "." << "Imie: " << ekipa[ i ].Imie << " Nazwisko: " << ekipa[ i ].Nazwisko << " \nWypozyczone ksiazki: " << endl;
                cout << "ok przed lista";
               
                //ekipa[i].K->print();
               
                print( ekipa[ i ].K );
               
               
                //K->print();
                cout << "ok po liscie";
            }
        }
    }
};


void dodaj( grupa * G, Czytelnik * C ) {
    C->pobierz();
    if( G->ekipa == NULL ) {
        G->ekipa = new Czytelnik[ 1 ];
        G->ilosc = 1;
        G->ekipa[ 0 ].Imie = C->Imie;
        G->ekipa[ 0 ].Nazwisko = C->Nazwisko;
        G->ekipa[ 0 ].K = new Lista();
       
        cout << "ok po pustej";
    }
   
    else {
        Czytelnik * newEkipa = new Czytelnik[ G->ilosc + 1 ]; // nowa tablica, powolywanie do zycia
       
        for( int i = 0; i < G->ilosc; i++ ) {
            newEkipa[ i ].Imie = G->ekipa[ i ].Imie;
            newEkipa[ i ].Nazwisko = G->ekipa[ i ].Nazwisko;
            newEkipa[ i ].K = G->ekipa[ i ].K;
           
            // new Lista(G->ekipa[i].K)
           
            cout << "ok po przepisaniu";
           
        }
        G->ilosc++; // ilosc ++
       
        newEkipa[ G->ilosc - 1 ] = Czytelnik( C->Imie, C->Nazwisko, C->K );
       
        //newEkipa[G->ilosc-1].Imie=C->Imie; //podmienic osttaniego
        //newEkipa[G->ilosc-1].Nazwisko=C->Nazwisko;//podmienic osttaniego
        //newEkipa[G->ilosc-1].K=new Lista(C);
       
        //newEkipa[G->ilosc-1].K->pierwszy=C->K->pierwszy;
        //newEkipa[G->ilosc-1].K->ostatni=C->K->ostatni;
        //newEkipa[G->ilosc-1].K->ilosc=C->K->ilosc;
       
       
        cout << "ok po ostatnim";
       
        delete[] G->ekipa; //zwalnianie pamieci
        G->ekipa = newEkipa;
        cout << "ok po usunieciu"; }
}



C/C++
int main( int argc, char ** argv ) {
   
    grupa * G = new grupa; Czytelnik * C = new Czytelnik();
    Lista L; Czytelnik * D = new Czytelnik();
   
    /*
    dodaj(G,C); cout << endl;
    G->wyswietl(); cout << endl;
    dodaj(G,D);  cout << endl;
    G->wyswietl(); cout << endl;   */ // tu jest problem
   
    { Ksiazka * E = new Ksiazka( "a" );
        L.Add2Begin( E ); }
   
    { Ksiazka * E = new Ksiazka( "b" );
        L.Add2Begin( E ); }
   
    { Ksiazka * E = new Ksiazka( "c" );
        L.Add2Begin( E ); }
   
    { Ksiazka * E = new Ksiazka( "d" );
        L.Add2Begin( E ); }
   
    { Ksiazka * E = new Ksiazka( "e" );
        L.Add2Begin( E ); }
   
    print( & L );
   
    { Ksiazka * E = new Ksiazka( "bbbbbbbb" );
        L.Add2Begin( E ); }
   
    print( & L );
   
    system( "pause" );
    return 0;
}

// Dodam, że jestem nowicjuszem jeśli chodzi o programowanie. Także liczę na każda krytykę. Pozdrawiam!
P-147331
exik92
Temat założony przez niniejszego użytkownika
» 2016-04-17 09:35:25
Problem rozwiązany. Z pośpiechu w konstruktorze zamiast tworzyć nowa Listę to ją nullowałem.

Czytelnik() { Imie = ""; Nazwisko = ""; K = NULL; };

Temat do zamknięcia.

P-147340
« 1 »
  Strona 1 z 1