#include <iostream>

using namespace std;

struct book
{
    char tytul[1000];
    char autor_nazw[50];
    char autor_imie[20];
    int cena;
    int rok_wyd;
    book *nast;
    book *poprz;
};

void dodaj_ksiazke(book *&s_ptr, book *&l_ptr);
void wypisz_liste(book *s_ptr);
void wypisz_ksiazke(book *s_ptr);
void usun_ksiazke(book *&s_ptr);
void usun_liste(book *l_ptr);



int main()
{
    book *start_ptr = NULL, *end_ptr = NULL;
    int wybor = 0;

    while (1)
    {

        cout << "Prosze wybrac jedna z opcji:" << endl;
        cout << "1. Dodaj ksiazke do listy"  << endl;
        cout << "2. Wypisz liste"  << endl;
        cout << "3. Wypisz ksiazke"  << endl;
        cout << "4. Usun ksiazke z listy"  << endl;
        cout << "5. Zakoncz program"  << endl;
        cin >> wybor;
        switch(wybor)
        {
        case 1:
            dodaj_ksiazke(start_ptr, end_ptr);
            break;
        case 2:
            wypisz_liste(start_ptr);
            break;
        case 3:
            wypisz_ksiazke(start_ptr);
            break;
        case 4:
            usun_ksiazke(start_ptr);
            break;
        case 5:
            usun_liste(end_ptr);
            return 0;
        default:
            cout << "Nie ma takiej opcji:" << wybor << endl;
        }
    }

    return 0;
}

void dodaj_ksiazke(book *&s_ptr, book *&l_ptr)
{
    book *temp_ptr = s_ptr;

    if ( s_ptr == NULL )    // Lista jest jeszcze pusta. Trzeba utworzyć pierwszy element
    {
        s_ptr = new book;
        (*s_ptr).nast = NULL;
        (*s_ptr).poprz = NULL;
        temp_ptr = s_ptr;
     }
    else
    {
        temp_ptr = new book;
        (*l_ptr).nast = temp_ptr;
        (*temp_ptr).nast = NULL;
        (*temp_ptr).poprz = l_ptr;
    }

    cout << "Prosze podac tytul ksiazki: ";
    cin.get();
    cin.getline((*temp_ptr).tytul, 1000);
    cout << "Prosze podac nazwisko autora: ";
    cin.getline((*temp_ptr).autor_nazw, 50);
    cout << "Prosze podac imie autora: ";
    cin.getline((*temp_ptr).autor_imie, 20);
    cout << "Prosze podac cene: ";
    cin >> (*temp_ptr).cena;
    cout << "Prosze podac rok wydania: ";
    cin >> (*temp_ptr).rok_wyd;
    cout << endl << endl;
    l_ptr = temp_ptr;

}

void wypisz_liste(book *s_ptr)
{
    cout << endl << endl;
    if ( s_ptr == NULL ) cout << "Lista jest pusta" << endl << endl;
    while( s_ptr )
    {
        cout << endl << "Tytul: \t" << (*s_ptr).tytul << endl;
        cout << "Autor: \t" << (*s_ptr).autor_imie << " " << (*s_ptr).autor_nazw << endl;
        cout << "Cena: \t" << (*s_ptr).cena << endl;
        cout << "Rok wyd.: \t" << (*s_ptr).rok_wyd << endl << endl;
        s_ptr =(*s_ptr).nast;
    }
}

void wypisz_ksiazke(book *s_ptr)
{
    int rok;
    cout << "Podaj rok wydania ksiazki: ";
    cin >> rok;
    if ( s_ptr == NULL )
    {
        cout << "Lista jest pusta" << endl << endl;
        return;
    }
    while( s_ptr )
    {
        if ( (*s_ptr).rok_wyd == rok )   // Znaleźliśmy książkę
        {
            cout << endl << "Tytul: \t" << (*s_ptr).tytul << endl;
            cout << "Autor: \t" << (*s_ptr).autor_imie << " " << (*s_ptr).autor_nazw << endl;
            cout << "Cena: \t" << (*s_ptr).cena << endl;
            cout << "Rok wyd.: \t" << (*s_ptr).rok_wyd << endl << endl;
            return;
        }
        s_ptr = (*s_ptr).nast;
    }
    cout << "Nie ma takiej ksiazki." << endl;

}

void usun_ksiazke(book *&s_ptr)
{
    int rok;
    book *temp_ptr = s_ptr;
    cout << "Podaj rok wydania ksiazki do usuniecia: ";
    cin >> rok;
    if ( temp_ptr == NULL )
    {
        cout << "Lista jest pusta" << endl << endl;
        return;
    }
    while( temp_ptr )
    {
        if ( (*temp_ptr).rok_wyd == rok )   // Znaleźliśmy książkę
        {
            if ( temp_ptr == s_ptr )   //Znaleziona pozycja jest pierwsza na liście
            {
                s_ptr = (*s_ptr).nast;
                if( s_ptr ) (*s_ptr).poprz = temp_ptr;
                delete temp_ptr;
                return;
            }
            (*(*temp_ptr).poprz).nast = (*temp_ptr).nast;
            if( (*temp_ptr).nast ) (*(*temp_ptr).nast).poprz = (*temp_ptr).poprz;
            delete temp_ptr;
            return;
        }
        temp_ptr = (*temp_ptr).nast;
    }
    cout << "Nie ma takiej ksiazki." << endl;

}

void usun_liste(book *l_ptr)
{
    book *temp_ptr;
    while( l_ptr )
    {
        temp_ptr = (*l_ptr).poprz;
        delete l_ptr;
        l_ptr = temp_ptr;
    }
}

