Program SDiZO 1


#include
#include
#include
#include
#include
#include
#include
using namespace std;

// Źródło kodu do licznika czasu: http://stackoverflow.com/questions/1739259/how-to-use-queryperformancecounter
double PCFreq = 0.0;
__int64 licznik = 0;


void czasStart()
{
LARGE_INTEGER li;
if (!QueryPerformanceFrequency(&li))
cout << "Błąd!\n";

PCFreq = double(li.QuadPart) / 1000.0;

QueryPerformanceCounter(&li);
licznik = li.QuadPart;
}
void pobierzCzas()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
cout << "Operacja zajela: " << (li.QuadPart - licznik) / PCFreq << " milisekund" << endl;

}

class ElementListy
{
public:
ElementListy *nastepnyElement, *poprzedniElement;
int klucz;
};
class Lista
{
private:
ElementListy *glowa, *ogon;
public:
int liczbaElementow;
public:
Lista()
{

ogon = glowa = NULL;
liczbaElementow = 0;

}
~Lista()
{
ElementListy * element;

while (glowa)
{
element = glowa->nastepnyElement;
delete glowa;
glowa = element;
}
liczbaElementow = 0;
}
void zapelnijLosowo(int ile)
{
for (int i = 1; i <= ile; i++)
dodajNaPoczatek((rand() % 2000) - 1000);
}
bool szukaj(int liczbaDoZnalezienia)
{
bool czyJest = false;
ElementListy *element;
element = glowa;
for (int i = 1; i <= liczbaElementow; i++)
{
if (element->klucz == liczbaDoZnalezienia) { czyJest = true; break; }
else element = element->nastepnyElement;
}
return czyJest;
}
void zbudujZPliku(string nazwa)
{
string s;
int i = 1;
nazwa = nazwa + ".txt";
ifstream plik(nazwa);
if (!plik)
cout << "Nie mozna otworzyc pliku" << endl;
else
{
getline(plik, s);
int n = atoi(s.c_str());

while (!plik.eof())
{
if (i <= n)

{
getline(plik, s);
int klucz = atoi(s.c_str());
dodajNaKoniec(klucz);
i++;
}
else break;
}
plik.close();
for (i; i <= n; i++)
{
dodajNaKoniec(0);
}
}

}
void dodajNowyElementZaElementemOPodanymKluczu(int kluczElementuZaKtorymWstawiamy, int nowyKlucz)
{
licznik = 0;
czasStart();
ElementListy *element;
ElementListy * nowyElement = new ElementListy();
if (!(szukaj(kluczElementuZaKtorymWstawiamy)))
{
dodajNaPoczatek(nowyKlucz);
cout << "Na liscie nie ma elementu o podanej wartosci - wstawiono na poczatek listy" << endl;
}
else
{
element = glowa;
for (unsigned i = 1; i <= liczbaElementow; i++)
{
if (element->klucz == kluczElementuZaKtorymWstawiamy)
{
nowyElement->nastepnyElement = element->nastepnyElement; nowyElement->poprzedniElement = element;
element->nastepnyElement = nowyElement;
if (nowyElement->nastepnyElement) nowyElement->nastepnyElement->poprzedniElement = nowyElement;
else ogon = nowyElement;
nowyElement->klucz = nowyKlucz;
liczbaElementow++;
break;
}
else element = element->nastepnyElement;
}

}
pobierzCzas();
}
void dodajNaPoczatek(int nowyKlucz)
{
ElementListy * nowyElement = new ElementListy();
nowyElement->nastepnyElement = glowa;
nowyElement->poprzedniElement = NULL;
if (glowa) glowa->poprzedniElement = nowyElement;
glowa = nowyElement;
if (!ogon) ogon = glowa;
nowyElement->klucz = nowyKlucz;
liczbaElementow++;
}
void dodajNaKoniec(int nowyKlucz)
{
ElementListy * nowyElement = new ElementListy();
nowyElement->poprzedniElement = ogon;
nowyElement->nastepnyElement = NULL;
if (ogon) ogon->nastepnyElement = nowyElement;
ogon = nowyElement;
if (!glowa) glowa = ogon;
nowyElement->klucz = nowyKlucz;
liczbaElementow++;
}
void usunZPoczatku()
{
if (liczbaElementow == 0) cout << "Lista jest pusta, nie mozna nic usunac" << endl;
else
{
licznik = 0;
czasStart();
glowa = glowa->nastepnyElement;
liczbaElementow--;
pobierzCzas();
}

}

void usunZKonca()
{
if (liczbaElementow == 0) cout << "Lista jest pusta, nie mozna nic usunac" << endl;
else
{
licznik = 0;
czasStart();
ogon->poprzedniElement->nastepnyElement = NULL;
ogon->poprzedniElement = ogon;
liczbaElementow--;
pobierzCzas();
}
}
void usun(int kluczDoUsuniecia)
{
ElementListy *element;
element = glowa;
if (liczbaElementow == 0) cout << "Lista jest pusta, nie mozna nic usunac" << endl;
else
{
licznik = 0;
czasStart();
while ((element->nastepnyElement != NULL) && (element->klucz != kluczDoUsuniecia)) { element = element->nastepnyElement; }
if (element->klucz == kluczDoUsuniecia)
{
if (element->nastepnyElement) element->nastepnyElement->poprzedniElement = element->poprzedniElement;
else ogon = element->poprzedniElement;
if (element->poprzedniElement) { element->poprzedniElement->nastepnyElement = element->nastepnyElement; }
else glowa = element->nastepnyElement;
liczbaElementow--;
pobierzCzas();
}
else cout << "Na liscie nie ma elementu o podanym kluczu!" << endl;
}
}
void wyswietl()
{
ElementListy * element = new ElementListy();
int i = 1;
if (!glowa) cout << "Lista jest pusta." << endl;
else
{
element = glowa;
while (element)
{
cout << i << ". " << element->klucz << endl;
element = element->nastepnyElement;
i++;
}
cout << endl;

}
delete element;
}
};
class Tablica
{
public:
int liczbaElementow;
private:
int *w;
public: Tablica()
{
liczbaElementow = 0;
w = new int[liczbaElementow];
}
~Tablica()
{
delete[]w;
liczbaElementow = 0;
}
void zapelnijLosowo(int ile)
{
liczbaElementow = ile;
w = new int[2*liczbaElementow];
for (int i = 0; i < liczbaElementow; i++)
{
w[i] = ((rand() % 2000) - 1000);
}

}
void wyswietl()
{
if (liczbaElementow == 0) cout << "Tablica jest pusta" << endl;
else
{
for (int i = 0; i < liczbaElementow; i++){ cout << i << ": " << w[i] << endl; }
cout << endl;
}
}

void usun(int indeksElDoUsuniecia)
{
if (liczbaElementow == 0) { cout << "Tablica jest pusta, nie mozna nic usunac" << endl; }
else if (indeksElDoUsuniecia >= liczbaElementow) cout << "Tablica ma mniej elementow!" << endl;
else{
licznik = 0;
czasStart();
for (int i = indeksElDoUsuniecia; i < liczbaElementow; i++)
{
w[i] = w[i + 1];

}

liczbaElementow--;
pobierzCzas();
relokuj();
}
}
void relokuj()

{
int *t = new int[liczbaElementow];
for (int i = 0; i < liczbaElementow; i++)
{
t[i] = w[i];
}
w = new int[2*liczbaElementow];
for (int i = 0; i < liczbaElementow; i++)
{
w[i] = t[i];
}
delete[]t;
}
void usunZPoczatku()
{
if (liczbaElementow == 0) { cout << "Tablica jest pusta, nie mozna nic usunac" << endl; }
else
{
licznik = 0;
czasStart();
liczbaElementow--;
for (int i = 0; i < liczbaElementow; i++)
{
w[i] = w[i + 1];
}
relokuj();
pobierzCzas();
}

}

void usunZKonca()
{
if (liczbaElementow == 0) { cout << "Tablica jest pusta, nie mozna nic usunac" << endl; }

else
{
licznik = 0;
czasStart();
w[liczbaElementow - 1] = NULL;
liczbaElementow--;
pobierzCzas();
relokuj();
}
}
void dodajNaPoczatek(int wartoscNowegoElementu)
{
liczbaElementow++;

for (int i = liczbaElementow - 1; i > 0; i--)
{
w[i] = w[i - 1];
}
w[0] = wartoscNowegoElementu;
relokuj();
}
void dodajNaKoniec(int wartoscNowegoElementu)
{
licznik = 0;
czasStart();
w[liczbaElementow] = wartoscNowegoElementu;
liczbaElementow++;
pobierzCzas();
relokuj();

}
void dodaj(int indeksNowegoEl, int wartoscNowegoElementu)
{


if (indeksNowegoEl >= liczbaElementow)
{

dodajNaKoniec(wartoscNowegoElementu);
cout << "Podano indeks wykraczajacy poza rozmiar tablicy. Element zostal dodany na koncu tablicy" << endl;
}
else
{
licznik = 0;
czasStart();
liczbaElementow++;
for (int i = liczbaElementow - 1; i > indeksNowegoEl; i--)
{
w[i] = w[i - 1];
}
w[indeksNowegoEl] = wartoscNowegoElementu;
pobierzCzas();
//relokuj();
}

}
void szukaj(int liczbaDoZnalezienia)
{
licznik = 0;
czasStart();
bool czyJest = false;
for (int i = 0; i < liczbaElementow; i++){ if (liczbaDoZnalezienia == w[i]) { czyJest = true; break; } }
pobierzCzas();
if (czyJest) cout << "Szukany element znajduje sie w tablicy" << endl;
if (!czyJest) cout << "Szukego elementu nie ma w tablicy" << endl;

}
void zbudujZPliku(string nazwa)
{
string s;
int i = 0;

nazwa = nazwa + ".txt";
ifstream plik(nazwa);

if (!plik)
{
cout << "Nie mozna otworzyc pliku" << endl;;

}
else
{
getline(plik, s);
int n = atoi(s.c_str());
liczbaElementow = n;
while (!plik.eof())
{
if (i < liczbaElementow)
{
getline(plik, s);
w[i] = atoi(s.c_str());
i++;
}
else break;

}
plik.close();
for (i; i < liczbaElementow; i++)
{
w[i] = 0;
}
}

}
};
class Kopiec
{
public:
int liczbaElementow;
private:
int *w;
string gornyRog, dolnyRog, pion;
public:
Kopiec()
{
gornyRog = dolnyRog = pion = " ";
gornyRog[0] = 218; gornyRog[1] = 196;
dolnyRog[0] = 192; dolnyRog[1] = 196;
pion[0] = 179;
liczbaElementow = 0;
w = new int[liczbaElementow + 1];
}
~Kopiec()
{
liczbaElementow = 0;
delete[]w;

}
void zapelnijLosowo(int ile)
{
liczbaElementow = ile;
w = new int[liczbaElementow + 1];
for (int i = 1; i <= liczbaElementow; i++)
w[i] = ((rand() % 2000) - 1000);
budujKopiec();
}

void zbudujZPliku(string nazwa)
{
string s;
int i = 0;
int *t;
nazwa = nazwa + ".txt";
ifstream plik(nazwa);

if (!plik)
{
cout << "Nie mozna otworzyc pliku" << endl;;

}
else
{
getline(plik, s);
int n = atoi(s.c_str());
liczbaElementow = n;
t = new int[liczbaElementow];
while (!plik.eof())
{
if (i <= liczbaElementow)
{
getline(plik, s);
t[i] = atoi(s.c_str());
i++;
}
else break;
}
plik.close();
for (i; i <= liczbaElementow; i++)
{
t[i] = 0;
}
w = t;
budujKopiec();
}
}
void budujKopiec()
{
for (int i = 2; i <= liczbaElementow; i++)
{
int pozycjaElementu, pozycjaPrzodka, element;
pozycjaElementu = i;
pozycjaPrzodka = (pozycjaElementu) / 2;
element = w[i];
while ((pozycjaPrzodka > 0) && (w[pozycjaPrzodka] < element))
{
w[pozycjaElementu] = w[pozycjaPrzodka];
pozycjaElementu = pozycjaPrzodka;
pozycjaPrzodka = (pozycjaElementu) / 2;
}
w[pozycjaElementu] = element;
}
}
void wyswietl(string tekst1, string tekst2, int nrWezla)
{
if (liczbaElementow == 0)
cout << "Kopiec jest pusty" << endl;
string tekst;

if (nrWezla <= liczbaElementow)
{
tekst = tekst1;
if (tekst2 == gornyRog)
tekst[tekst.length() - 2] = ' ';

wyswietl(tekst + pion, gornyRog, 2 * nrWezla + 1);

tekst = tekst.substr(0, tekst1.length() - 2);

cout << tekst << tekst2 << w[nrWezla] << endl;

tekst = tekst1;
if (tekst2 == dolnyRog)
tekst[tekst.length() - 2] = ' ';
wyswietl(tekst + pion, dolnyRog, 2 * nrWezla);
}
}
bool szukaj(int liczbaDoZnalezienia)
{
bool czyJest = false;
for (int i = 1; i <= liczbaElementow; i++)
{
if (liczbaDoZnalezienia == w[i])
{
czyJest = true;
break;
}
}
return czyJest;

}
void dodaj(int liczbaDoDodania)
{
licznik = 0;
czasStart();
liczbaElementow++;
w[liczbaElementow] = liczbaDoDodania;
int pozycjaNowegoElementu = liczbaElementow;
while ((w[pozycjaNowegoElementu] > w[pozycjaNowegoElementu / 2]) && (pozycjaNowegoElementu > 1))
{
int temp = w[pozycjaNowegoElementu / 2];
w[pozycjaNowegoElementu / 2] = w[pozycjaNowegoElementu];
w[pozycjaNowegoElementu] = temp;
pozycjaNowegoElementu = (pozycjaNowegoElementu / 2);
}
pobierzCzas();
}
void relokuj()
{
int *t = new int[liczbaElementow + 1];
for (int i = 1; i <= liczbaElementow; i++)
{
t[i] = w[i];
}
w = new int[liczbaElementow + 1];
for (int i = 1; i <= liczbaElementow; i++)
{
w[i] = t[i];
}
delete[]t;
}
void usun(int liczbaDoUsuniecia)
{

if (liczbaElementow == 0) cout << "Kopiec jest pusty, nie mozna nic usunac" << endl;
else
{
if (!szukaj(liczbaDoUsuniecia)) cout << "W kopcu nie ma takiej liczby, nie mozna usunac!" << endl;
else
{
licznik = 0;
czasStart();
int i;
for (i = 1; i <= liczbaElementow; i++)
{
if (w[i] == liczbaDoUsuniecia) break;
}
if (i == liczbaElementow)
{
w[i] = NULL;
liczbaElementow--;
pobierzCzas();
}
if (i < liczbaElementow)
{
w[i] = w[liczbaElementow];
w[liczbaElementow] = NULL;
liczbaElementow--;
if (2 * i > liczbaElementow)
{
while (i > 1)
{
if (w[i] > w[i / 2])
{
int temp = w[i / 2];
w[i / 2] = w[i];
w[i] = temp;
}
i = i / 2;
}
}
else
{
while (i <= liczbaElementow / 2)
{
if ((w[i] < (w[2 * i])) || (w[i] < (w[2 * i + 1])))
{
if (w[2 * i] > w[2 * i + 1])
{
int temp = w[i];
w[i] = w[2 * i];
w[2 * i] = temp;
i = 2 * i;
}
else
{
int temp = w[i];
w[i] = w[2 * i + 1];
w[2 * i + 1] = temp;
i = 2 * i + 1;
}
}
else break;
}

}
}
pobierzCzas();
relokuj();
}
}
}
};

class WezelDrzewa
{
public:
WezelDrzewa *ojciec, *lewySyn, *prawySyn;
int klucz;
string kolor;
};

class DrzewoCzerwonoCzarne
{
private:
WezelDrzewa straznik;
string gornyRog, dolnyRog, pion;
string czarny;
string czerwony;
public:
WezelDrzewa *korzen;
int liczbaElementow;

DrzewoCzerwonoCzarne()
{
gornyRog = dolnyRog = pion = " ";
gornyRog[0] = 218; gornyRog[1] = 196;
dolnyRog[0] = 192; dolnyRog[1] = 196;
pion[0] = 179;
czarny = "CZAR";
czerwony = "CZERW";
straznik.kolor = czarny;
straznik.ojciec = &straznik;
straznik.lewySyn = &straznik;
straznik.prawySyn = &straznik;
korzen = &straznik;
liczbaElementow = 0;
}
~DrzewoCzerwonoCzarne()
{
usunDrzewo(korzen);
liczbaElementow = 0;
}
void usunDrzewo(WezelDrzewa *wezel)
{
if (wezel != &straznik)
{
usunDrzewo(wezel->lewySyn);
usunDrzewo(wezel->prawySyn);
delete wezel;
}
}
void zbudujZPliku(string nazwa)
{
string s;
int i = 1;
nazwa = nazwa + ".txt";
ifstream plik(nazwa);
if (!plik)
cout << "Nie mozna otworzyc pliku" << endl;
else
{

getline(plik, s);
int n = atoi(s.c_str());

while (!plik.eof())
{
if (i <= n)

{
getline(plik, s);
int klucz = atoi(s.c_str());
dodaj(klucz);
i++;
}
else break;
}
plik.close();
for (i; i <= n; i++)
{
dodaj(0);
}
}
}
void rotacjaL(WezelDrzewa* wezel)
{
WezelDrzewa * prawySyn, *ojciec;

prawySyn = wezel->prawySyn;
if (prawySyn != &straznik)
{
ojciec = wezel->ojciec;
wezel->prawySyn = prawySyn->lewySyn;
if (wezel->prawySyn != &straznik)
wezel->prawySyn->ojciec = wezel;

prawySyn->lewySyn = wezel;
prawySyn->ojciec = ojciec;
wezel->ojciec = prawySyn;

if (ojciec != &straznik)
{
if (ojciec->lewySyn == wezel) ojciec->lewySyn = prawySyn; else ojciec->prawySyn = prawySyn;
}
else korzen = prawySyn;
}
}
void rotacjaP(WezelDrzewa* wezel)
{
WezelDrzewa * lewySyn, *ojciec;

lewySyn = wezel->lewySyn;
if (lewySyn != &straznik)
{
ojciec = wezel->ojciec;
wezel->lewySyn = lewySyn->prawySyn;
if (wezel->lewySyn != &straznik)
wezel->lewySyn->ojciec = wezel;

lewySyn->prawySyn = wezel;
lewySyn->ojciec = ojciec;
wezel->ojciec = lewySyn;

if (ojciec != &straznik)
{
if (ojciec->lewySyn == wezel) ojciec->lewySyn = lewySyn; else ojciec->prawySyn = lewySyn;
}
else korzen = lewySyn;
}
}
void zapelnijLosowo(int ile)
{
int i;
int *t;
t = new int[ile];
for (i = 0; i < ile; i++)
t[i] = ((rand() % 2000) - 1000);

for (i = 0; i < ile; i++)
dodaj(t[i]);
}
void wyswietl(string tekst1, string tekst2, WezelDrzewa * wezel)
{
string tekst;
if (liczbaElementow == 0) cout << "Drzewo jest puste" << endl;
else if (wezel != &straznik)
{
tekst = tekst1;
if (tekst2 == gornyRog)
tekst[tekst.length() - 2] = ' ';
wyswietl(tekst + pion, gornyRog, wezel->prawySyn);

tekst = tekst.substr(0, tekst1.length() - 2);
cout << tekst << tekst2 << wezel->kolor << ":" << wezel->klucz << endl;

tekst = tekst1;
if (tekst2 == dolnyRog)
tekst[tekst.length() - 2] = ' ';
wyswietl(tekst + pion, dolnyRog, wezel->lewySyn);
}
}
void dodaj(int klucz)
{
WezelDrzewa *nowyElement, *wujek;

nowyElement = new WezelDrzewa;
nowyElement->lewySyn = &straznik;
nowyElement->prawySyn = &straznik;
nowyElement->ojciec = korzen;
nowyElement->klucz = klucz;
if (nowyElement->ojciec == &straznik) korzen = nowyElement;
else
while (true)
{
if (klucz < nowyElement->ojciec->klucz)
{
if (nowyElement->ojciec->lewySyn == &straznik)
{
nowyElement->ojciec->lewySyn = nowyElement;
break;
}
nowyElement->ojciec = nowyElement->ojciec->lewySyn;
}
if (klucz >= nowyElement->ojciec->klucz)
{
if (nowyElement->ojciec->prawySyn == &straznik)

{
nowyElement->ojciec->prawySyn = nowyElement;
break;
}
nowyElement->ojciec = nowyElement->ojciec->prawySyn;
}
}
nowyElement->kolor = czerwony;
while ((nowyElement != korzen) && (nowyElement->ojciec->kolor == czerwony))
{
if (nowyElement->ojciec == nowyElement->ojciec->ojciec->lewySyn)
{
wujek = nowyElement->ojciec->ojciec->prawySyn;

if (wujek->kolor == czerwony)
{
nowyElement->ojciec->kolor = czarny;
wujek->kolor = czarny;
nowyElement->ojciec->ojciec->kolor = czerwony;
nowyElement = nowyElement->ojciec->ojciec;
continue;
}

if (nowyElement == nowyElement->ojciec->prawySyn)
{
nowyElement = nowyElement->ojciec;
rotacjaL(nowyElement);
}

nowyElement->ojciec->kolor = czarny;
nowyElement->ojciec->ojciec->kolor = czerwony;
rotacjaP(nowyElement->ojciec->ojciec);
break;
}
else
{
wujek = nowyElement->ojciec->ojciec->lewySyn;

if (wujek->kolor == czerwony)
{
nowyElement->ojciec->kolor = czarny;
wujek->kolor = czarny;
nowyElement->ojciec->ojciec->kolor = czerwony;
nowyElement = nowyElement->ojciec->ojciec;
continue;
}

if (nowyElement == nowyElement->ojciec->lewySyn)
{
nowyElement = nowyElement->ojciec;
rotacjaP(nowyElement);
}

nowyElement->ojciec->kolor = czarny;
nowyElement->ojciec->ojciec->kolor = czerwony;
rotacjaL(nowyElement->ojciec->ojciec);
break;
}

}
korzen->kolor = czarny;
liczbaElementow++;
}
bool sprawdzCzyJest(int klucz)
{
WezelDrzewa * wezel;
bool czyJest = false;
wezel = korzen;
while ((wezel != &straznik) && (wezel->klucz != klucz))
{
if (klucz < wezel->klucz)
wezel = wezel->lewySyn;
else
wezel = wezel->prawySyn;
}

if (wezel == &straznik) czyJest = false;
else czyJest = true;
return czyJest;
}
WezelDrzewa* znajdzWezel(int klucz)
{
WezelDrzewa * wezel;
wezel = korzen;
while ((wezel != &straznik) && (wezel->klucz != klucz))
{
if (klucz < wezel->klucz)
wezel = wezel->lewySyn;
else
wezel = wezel->prawySyn;
}

if (wezel == &straznik) return NULL;
return wezel;
}
void usun(int klucz)
{
if (!sprawdzCzyJest(klucz))
cout << "W drzewie nie ma elementu o takim kluczu!" << endl;
else if (liczbaElementow == 0)
cout << "Drzewo jest puste!" << endl;
else
{
licznik = 0;
czasStart();
WezelDrzewa *wezelDoUsuniecia, *wujek, *syn;
wezelDoUsuniecia = znajdzWezel(klucz);
if ((wezelDoUsuniecia->lewySyn == &straznik) || (wezelDoUsuniecia->prawySyn == &straznik)) {}
else
{
if (wezelDoUsuniecia != &straznik)
{
if (wezelDoUsuniecia->prawySyn != &straznik)
{
if (wezelDoUsuniecia->prawySyn != &straznik)
{
while (wezelDoUsuniecia->prawySyn->lewySyn != &straznik)
wezelDoUsuniecia->prawySyn = wezelDoUsuniecia->prawySyn->lewySyn;
}
wezelDoUsuniecia = wezelDoUsuniecia->prawySyn;
}
else
{
wezelDoUsuniecia = wezelDoUsuniecia->ojciec;
while ((wezelDoUsuniecia != &straznik) && (wezelDoUsuniecia == wezelDoUsuniecia->prawySyn))
{
wezelDoUsuniecia = wezelDoUsuniecia;
wezelDoUsuniecia = wezelDoUsuniecia->ojciec;
}
}
}
else
wezelDoUsuniecia = &straznik;
}

if (wezelDoUsuniecia->lewySyn != &straznik)
syn = wezelDoUsuniecia->lewySyn;
else
syn = wezelDoUsuniecia->prawySyn;

syn->ojciec = wezelDoUsuniecia->ojciec;

if (wezelDoUsuniecia->ojciec == &straznik)
korzen = syn;
else if
(wezelDoUsuniecia == wezelDoUsuniecia->ojciec->lewySyn) wezelDoUsuniecia->ojciec->lewySyn = syn;
else
wezelDoUsuniecia->ojciec->prawySyn = syn;

if (wezelDoUsuniecia != wezelDoUsuniecia) wezelDoUsuniecia->klucz = wezelDoUsuniecia->klucz;

if (wezelDoUsuniecia->kolor == czarny)
while ((syn != korzen) && (syn->kolor == czarny))
{
if (syn == syn->ojciec->lewySyn)
{
wujek = syn->ojciec->prawySyn;

if (wujek->kolor == czerwony)
{
wujek->kolor == czarny;
syn->ojciec->kolor = czerwony;
rotacjaL(syn->ojciec);
wujek = syn->ojciec->prawySyn;
}

if ((wujek->lewySyn->kolor == czarny) && (wujek->prawySyn->kolor == czarny))
{
wujek->kolor = czerwony;
syn = syn->ojciec;
continue;
}

if (wujek->prawySyn->kolor == czarny)
{
wujek->lewySyn->kolor == czarny;
wujek->kolor = czerwony;
rotacjaP(wujek);
wujek = syn->ojciec->prawySyn;
}
wujek->kolor = syn->ojciec->kolor;
syn->ojciec->kolor = czarny;
wujek->prawySyn->kolor = czarny;
rotacjaL(syn->ojciec);
syn = korzen;
}
else
{
wujek = syn->ojciec->lewySyn;

if (wujek->kolor == czerwony)
{
wujek->kolor = czarny;
syn->ojciec->kolor = czerwony;
rotacjaP(syn->ojciec);
wujek = syn->ojciec->lewySyn;
}

if ((wujek->lewySyn->kolor == czarny) && (wujek->prawySyn->kolor == czarny))
{
wujek->kolor = czerwony;
syn = syn->ojciec;
continue;
}

if (wujek->lewySyn->kolor == czarny)
{
wujek->prawySyn->kolor == czarny;
wujek->kolor = czerwony;
rotacjaL(wujek);
wujek = syn->ojciec->lewySyn;
}

wujek->kolor = syn->ojciec->kolor;
syn->ojciec->kolor = czarny;
wujek->lewySyn->kolor = czarny;
rotacjaP(syn->ojciec);
syn = korzen;
}
}
syn->kolor = czarny;
liczbaElementow--;
pobierzCzas();
}

}
};
int main()
{
srand(time(NULL));
bool naPoczatek = true;
while (naPoczatek == true){

int wybor;
cout << "Wybierz strukture do testow" << endl
<< "1. Tablica" << endl << "2. Lista" << endl << "3. Kopiec" << endl << "4. Drzewo czerwono-czarne" << endl;
cin >> wybor;


system("cls");
switch (wybor)
{
case 1:
{
naPoczatek = false;
Tablica* tablica;
tablica = new Tablica();
int ile;
while (naPoczatek == false)
{
cout << "Tablica - " << tablica->liczbaElementow << " elementow" << endl << "Co chcesz zrobic z ta struktura?" <<
endl << "1. Zbuduj z pliku " << endl << "2. Wylosuj tablice" << endl << "3. Usun" << endl << "4. Dodaj" << endl << "5. Wyszukaj" <<
endl << "6. Wyswietl" << endl << "7. Zniszcz strukture" << endl << "8. Wroc do wyboru struktury" << endl << "9. Zakoncz program" << endl;
cin >> wybor;

switch (wybor)
{
case 1:{
string nazwa;
tablica = new Tablica();
cout << "Podaj nazwe pliku do wczytania danych" << endl;
cin >> nazwa;
cout << endl;
tablica->zbudujZPliku(nazwa);
} break;
case 2:
{

while (true)
{
cout << "Ilu elementowa tablice stworzyc?" << endl;
cin >> ile;
if (ile <= 0) cout << "Podaj liczbe wieksza od zera!" << endl;
else break;
}
tablica = new Tablica();
cout << endl;
tablica->zapelnijLosowo(ile);
}break;
case 3:{
int wartosc;
cout << "1. Usun z poczatku " << endl << "2. Usun z konca" << endl << "3. Usun wybrany element" << endl;
cin >> wybor;
switch (wybor)

{

case 1:
{
tablica->usunZPoczatku();

}break;

case 2:
{
tablica->usunZKonca();
}break;
case 3:{
while (true)
{
cout << "Podaj indeks elementu do usuniecia" << endl;
cin >> ile;
cout << endl;
if (ile < 0) cout << "Podaj liczbe wieksza od zera!" << endl;
else break;
}

tablica->usun(ile);

}break;

}

}break;
case 4:{
int wartosc;
cout << "1. Dodaj na poczatek " << endl << "2. Dodaj na koniec" << endl << "3. Dodaj na wybranym miejscu" << endl;
cin >> wybor;
switch (wybor)

{

case 1:
{
cout << "Podaj wartosc nowego elementu" << endl;
cin >> wartosc;
cout << endl;
licznik = 0;
czasStart();
tablica->dodajNaPoczatek(wartosc);
pobierzCzas();

}break;

case 2:
{
cout << "Podaj wartosc nowego elementu" << endl;
cin >> wartosc;
cout << endl;
tablica->dodajNaKoniec(wartosc);
}break;
case 3:{
while (true)
{
cout << "Podaj indeks miejsca, gdzie ma byc wstawiony nowy element" << endl;
cin >> ile;
cout << endl;
if (ile < 0) cout << "Podaj liczbe wieksza od zera!" << endl;
else break;
}

cout << "Podaj wartosc nowego elementu" << endl;
cin >> wartosc;
cout << endl;
tablica->dodaj(ile, wartosc);

}break;

}


}break;
case 5:{
int wartosc;
cout << "Podaj wartosc, ktora chcesz sprawdzic, czy jest w tablicy" << endl;
cin >> wartosc;
cout << endl;
tablica->szukaj(wartosc);
}break;
case 6:{
tablica->wyswietl();
}break;
case 7:{
tablica->~Tablica();
tablica = new Tablica();
}break;
case 8:{
delete tablica;
system("cls");
naPoczatek = true;
}break;
case 9:{
delete tablica;
return 0;
}break;
}
}
}break;
case 2:{
naPoczatek = false;
unsigned ile;
Lista* lista;
lista = new Lista();

while (naPoczatek == false){
cout << "Lista - " << lista->liczbaElementow << " elementow" << endl << "Co chcesz zrobic z ta struktura?" <<
endl << "1. Zbuduj z pliku " << endl << "2. Wylosuj liste" << endl << "3. Usun" << endl << "4. Dodaj" << endl << "5. Wyszukaj" <<
endl << "6. Wyswietl" << endl << "7. Zniszcz strukture" << endl << "8. Wroc do wyboru struktury" << endl << "9. Zakoncz program" << endl;
cin >> wybor;
switch (wybor)
{
case 1:{
lista->~Lista();
lista = new Lista();
string nazwa;
cout << "Podaj nazwe pliku do wczytania danych" << endl;
cin >> nazwa;
cout << endl;
lista->zbudujZPliku(nazwa);
}break;
case 2:{
lista->~Lista();
while (true)
{
cout << "Ilu elementowa liste stworzyc?" << endl;
cin >> ile;
cout << endl;
if (ile <= 0) cout << "Podaj liczbe wieksza od zera!" << endl;
else break;
}
lista = new Lista();
lista->zapelnijLosowo(ile);
}break;
case 3:{
int wartosc;
cout << "1. Usun z poczatku " << endl << "2. Usun z konca" << endl << "3. Usun wybrany element" << endl;
cin >> wybor;
switch (wybor)

{

case 1:
{
lista->usunZPoczatku();

}break;

case 2:
{
lista->usunZKonca();
}break;
case 3:{

cout << "Co usunac (klucz elementu)?" << endl;
cin >> ile;
cout << endl;
lista->usun(ile);

}break;

}

}break;

case 4:{
int wartosc;
cout << "1. Dodaj na poczatek " << endl << "2. Dodaj na koniec" << endl << "3. Dodaj za wybranym elementem" << endl;
cin >> wybor;
switch (wybor)

{
case 1:
{
cout << "Podaj klucz nowego elementu" << endl;
cin >> wartosc;
cout << endl;
licznik = 0;
czasStart();
lista->dodajNaPoczatek(wartosc);
pobierzCzas();

}break;

case 2:
{
cout << "Podaj klucz nowego elementu" << endl;
cin >> wartosc;
cout << endl;
licznik = 0;
czasStart();
lista->dodajNaKoniec(wartosc);
pobierzCzas();
}break;
case 3:{
int klucz;
cout << "Podaj klucz elementu do wstawienia" << endl;
cin >> klucz;
cout << endl;
cout << "Za ktorym elementem chcesz wstawic nowy (podaj klucz)?" << endl;
cin >> ile;
cout << endl;
lista->dodajNowyElementZaElementemOPodanymKluczu(ile, klucz);

}break;

}



}break;
case 5:{
cout << "Podaj klucz, ktory chcesz sprawdzic, czy jest na liscie" << endl;
cin >> ile;
cout << endl;
licznik = 0;
czasStart();
lista->szukaj(ile);
pobierzCzas();
if (lista->szukaj(ile)) cout << "Szukany element znajduje sie na liscie" << endl;
if (!lista->szukaj(ile)) cout << "Szukego elementu nie ma na liscie" << endl;


}break;
case 6:{
lista->wyswietl();
}break;
case 7:{
lista->~Lista();
lista = new Lista();


}break;
case 8:{
delete lista;
system("cls");
naPoczatek = true;

}break;
case 9:{
delete lista;
return 0;
}break;

}


}break;
}break;
case 3:{
naPoczatek = false;
int ile;
system("cls");
Kopiec *kopiec;
kopiec = new Kopiec();
while (naPoczatek == false)
{
cout << "Kopiec - " << kopiec->liczbaElementow << " elementow" << endl << "Co chcesz zrobic z ta struktura?" <<
endl << "1. Zbuduj z pliku " << endl << "2. Wylosuj kopiec" << endl << "3. Usun" << endl << "4. Dodaj" << endl << "5. Wyszukaj" <<
endl << "6. Wyswietl" << endl << "7. Zniszcz strukture" << endl << "8. Wroc do wyboru struktury" << endl << "9. Zakoncz program" << endl;
cin >> wybor;

switch (wybor)
{
case 1:{
string nazwa;
cout << "Podaj nazwe pliku do wczytania danych" << endl;
cin >> nazwa;
cout << endl;
kopiec = new Kopiec();
kopiec->zbudujZPliku(nazwa);
}break;

case 2:
{
while (true)
{
cout << "Ilu elementowa strukture stworzyc?" << endl;
cin >> ile;
if (ile > 0) break;
else cout << "Podaj liczbe wieksza od zera!" << endl;

}
kopiec = new Kopiec();
kopiec->zapelnijLosowo(ile);
}break;
case 3:{
cout << "Co usunac (klucz)?" << endl;
cin >> ile;
cout << endl;
kopiec->usun(ile);

}break;

case 4:{
cout << "Podaj klucz elementu do wstawienia" << endl;
cin >> ile;
cout << endl;
kopiec->dodaj(ile);


}break;

case 5:{
cout << "Podaj wartosc, ktora chcesz sprawdzic, czy jest w kopcu" << endl;
cin >> ile;
cout << endl;
licznik = 0;
czasStart();
kopiec->szukaj(ile);
pobierzCzas();
if (kopiec->szukaj(ile)) cout << "Szukany element znajduje sie w kopcu" << endl;
if (!kopiec->szukaj(ile)) cout << "Szukego elementu nie ma w kopcu" << endl;
}break;
case 6:{
kopiec->wyswietl(" ", " ", 1);
}break;
case 7:{
kopiec->~Kopiec();
kopiec = new Kopiec();
}break;
case 8:{
system("cls");
delete kopiec;
naPoczatek = true;
}break;
case 9:{
delete kopiec;
return 0;
}break;
}
}

}break;
case 4:
{
naPoczatek = false;
int ile;
system("cls");
DrzewoCzerwonoCzarne *drzewo;
drzewo = new DrzewoCzerwonoCzarne();

while (naPoczatek == false)
{
cout << "Drzewo czerwono-czarne - " << drzewo->liczbaElementow << " elementow" << endl << "Co chcesz zrobic z ta struktura?" <<
endl << "1. Zbuduj z pliku " << endl << "2. Wylosuj drzewo" << endl << "3. Usun" << endl << "4. Dodaj" << endl << "5. Wyszukaj" <<
endl << "6. Wyswietl" << endl << "7. Zniszcz strukture" << endl << "8. Wroc do wyboru struktury" << endl << "9. Zakoncz program" << endl;
cin >> wybor;
switch (wybor)
{
case 1:{
drzewo->~DrzewoCzerwonoCzarne();
drzewo = new DrzewoCzerwonoCzarne();
string nazwa;
cout << "Podaj nazwe pliku do wczytania danych" << endl;
cin >> nazwa;
cout << endl;
drzewo->zbudujZPliku(nazwa);
}break;

case 2:
{
drzewo->~DrzewoCzerwonoCzarne();
while (true)
{
cout << "Ilu elementowa strukture stworzyc?" << endl;
cin >> ile;
if (ile > 0) break;
else cout << "Podaj liczbe wieksza od zera!" << endl;
}
drzewo = new DrzewoCzerwonoCzarne();
drzewo->zapelnijLosowo(ile);

}break;
case 3:{
cout << "Co usunac?" << endl;
cin >> ile;
cout << endl;
drzewo->usun(ile);

}break;

case 4:{
cout << "Podaj wartosc elementu do wstawienia" << endl;
cin >> ile;
cout << endl;
licznik = 0;
czasStart();
drzewo->dodaj(ile);
pobierzCzas();

}break;

case 5:{
cout << "Podaj wartosc, ktora chcesz sprawdzic, czy jest w drzewie" << endl;
cin >> ile;
cout << endl;
licznik = 0;
czasStart();
drzewo->sprawdzCzyJest(ile);
pobierzCzas();
if (drzewo->sprawdzCzyJest(ile)) cout << "Szukany element znajduje sie w drzewie" << endl;
if (!drzewo->sprawdzCzyJest(ile)) cout << "Szukego elementu nie ma w drzewie" << endl;
}break;
case 6:{
drzewo->wyswietl(" ", "", drzewo->korzen);
}break;
case 7:{
drzewo->~DrzewoCzerwonoCzarne();
drzewo = new DrzewoCzerwonoCzarne();
}break;
case 8:{
delete drzewo;
system("cls");
naPoczatek = true;
}break;
case 9:{
delete drzewo;
return 0;
}break;
}
}

}break;
}
}
system("pause");
return 0;
}

Wyszukiwarka