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?
#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;
}
};
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();
};
}
}
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";
}
}
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 w programowaniu, także liczę na każda krytykę. Pozdrawiam!