#include <iostream>
#include <string>
using namespace std;
// Struktura Aktor przechowujaca dane aktora - lista aktorów.
struct Aktor {
string nazwisko; // Imię i nazwisko razem - dla ułatwienia.
int lf; // Liczba fanów, którzy przestaną oglądać serial po odejściu aktora.
Aktor *next; // Wskaźnik na następny element listy.
Aktor(string nazwisko, int lf);
};
struct Lista{
Aktor *first; // wskaźnik na poczatek listy
Lista();
void insert_aktor(string nazwisko, int lf);
void find_aktor(Aktor *first, int p);
};
Aktor::Aktor(string nazwisko, int lf){
next = 0;
this->nazwisko = nazwisko;
this->lf = lf;
}
Lista::Lista(){
first = 0;
}
void Lista::insert_aktor(string nazwisko, int lf){
Aktor *nowy = new Aktor(nazwisko, lf);
nowy->nazwisko = nazwisko;
nowy->lf = lf;
Aktor *pomoc = first, *pomoc2 = NULL; // Wskazniki pomocnicze posłużą do poruszania się po liscie.
while ((pomoc != NULL) && ((pomoc->lf) < (nowy->lf))){ // Dopoki nie wyszlismy za liste i nazwisko na liscie jest przed nowym nazwiskiem, poruszamy sie dalej.
pomoc2 = pomoc; // pomoc2 zawsze wskazuje poprzednika pomoc.
pomoc = pomoc->next;
}
if ((pomoc != NULL) && ((pomoc->lf) == (nowy->lf))){
if (((pomoc->nazwisko).compare(nowy->nazwisko) == 0)){ // Aktor z podanym nazwiskiem juz istnieje.
cout << "NIE" << endl;
delete nowy; // Usuniecie nowego obiektu aktora.
}
else if (((pomoc->nazwisko).compare(nowy->nazwisko) < 0)){
//jak nazwisko wieksze:
pomoc2 = pomoc; // pomoc2 zawsze wskazuje poprzednika pomoc.
pomoc = pomoc->next;
//wstawiamy aktora
if (pomoc2 != NULL){
pomoc2->next = nowy;
nowy->next = pomoc;
cout << "TAK" << endl;
}
}
else if (((pomoc->nazwisko).compare(nowy->nazwisko) > 0)){
//jak nazwisko mniejsze:
//cofany i wstawiamy aktora
if (pomoc2 != NULL){
pomoc2->next = nowy;
nowy->next = pomoc;
cout << "TAK" << endl;
}
}
}
if ((pomoc != NULL) && ((pomoc->lf) > (nowy->lf))){
//to wstaw przed
if (pomoc2 != NULL){
pomoc2->next = nowy;
nowy->next = pomoc;
cout << "TAK" << endl;
}
}
else if ((first == NULL) || ((pomoc == first) && ((pomoc->nazwisko).compare(nowy->nazwisko) == 1))){ // Nowy element bedzie początkiem listy.
nowy->next = first;
first = nowy;
cout << "TAK" << endl;
}
else { // Dodajemy Aktora w srodku lub na koncu listy.
if (pomoc2 != NULL){
pomoc2->next = nowy;
nowy->next = pomoc;
cout << "TAK" << endl;
}
}
}
void Lista::find_aktor(Aktor *aktor, int p){
bool tmp = false;
while ((aktor != NULL)){
if (p >= aktor->lf){
tmp = true;
cout << aktor->nazwisko << endl;
//wywal tego aktora
}
aktor = aktor->next;
}
if (tmp == false){
cout << "NIE" << endl;
}
}
/*
//*****
bool delete_aktor(Aktor **korzen, string a){
if ((*korzen) == NULL) // lista jest pusta
return false;
Aktor *pomoc = (*korzen), *pomoc2 = NULL; // wskazniki pomocnicze posluza do poruszania sie po liscie
while(pomoc != NULL && (pomoc->nazwisko).compare(a) != 0){ // dopoki nie znajdziemy wizytowki z podanym nazwiskiem lub nie przeszukamy calego wizytownika
pomoc2 = pomoc;
pomoc = pomoc->next;
}
if (pomoc == NULL) // wyszlismy za liste - nie ma takiego nazwiska na liscie
return false;
else if (pomoc == (*korzen)){ // usuwamy koniec
(*korzen) = (*korzen)->next;
delete pomoc;
}
else { // usuwamy ze srodka lub konca listy
pomoc2->next = pomoc->next;
delete pomoc;
}
return true;
}*/
int main() {
int n; // Liczba operacji do wykonania.
int op; // Rodzaj operacji do wykonania.
int p; // Maksymalna liczba fanów, na której stratę można sobie pozwolić.
string nazwisko;
int lf;
cin >> n;
Lista *lista = new Lista;
for (int i = 0; i < n; i++){
cin >> op; // Wczytanie rodzaju operacji.
if (op == 1){
cin.ignore();
getline(cin, nazwisko);
cin >> lf;
lista->insert_aktor(nazwisko, lf);
}
if (op == 2){ // Wyszukanie aktora do roli.
cin.ignore();
cin >> p; // Podaj liczbę fanów, na której stratę możesz sobie pozwolić.
lista->find_aktor(lista->first, p);
}
}
system("pause");
return 0;
}