/*
Labor - Haladó, kézzel implementált adatstruktúrák C++-ban
Ebben a laborban három, a standard könyvtárban nem, vagy csak részben támogatott adatstruktúra működését és előnyeit vizsgáljuk:
- Intruzív láncolt lista: objektum szintű láncolás, több listába tartozás lehetősége, extra memória allokáció nélkül.
- Fix méretű körkörös puffer: fixen allokált, túlcsorduláskor automatikusan felülíródó buffer.
- Indexelt bináris keresőfa: sorszám szerinti O(log n) indexelés, dinamikusan bővíthető BST-vel.
Minden szerkezet külön .cpp-ben található, részletes kommentárral és bemutató példákkal.
*/
using namespace std;
#include <iostream>
#include <cstddef> // offsetof a print_all()-hoz (intruzív lista)
#include <cassert> // assert a circular bufferhez
#include "intruziv_lista.cpp"
#include "korkoros_buffer.cpp"
#include "indexelt_bkf.cpp"
int main() {
setlocale(LC_ALL, "");
// === Intruzív láncolt lista (hook1 használattal) =======================
cout << "=== Intruzív láncolt lista (hook1) ===\n";
Adat a(1), b(2), c(3), d(4);
IntruzivLista lista;
// Fontos: ez a lista a hook1-et feltételezi (print_all() így van írva)
lista.vegere_beszuras(&a.hook1);
lista.vegere_beszuras(&b.hook1);
lista.vegere_beszuras(&c.hook1);
lista.vegere_beszuras(&d.hook1);
cout << "Kezdeti lista: ";
lista.print_all();
// Töröljük a 'b'-t a közepéről (O(1), mivel pointerünk van rá)
lista.torles(&b.hook1);
cout << "Torles utan (b kiveve): ";
lista.print_all();
// Beszúrunk újra a végére
lista.vegere_beszuras(&b.hook1);
cout << "Ujraszuras utan (b a vegere): ";
lista.print_all();
// Megjegyzés: Ha ugyanaz az Adat egyszerre két listában is szerepeljen,
// a második listának a hook2-t kell kezelnie. A te IntruzivLista::print_all()
// jelenleg a hook1 offsetjét használja, ezért ugyanígy (változtatás nélkül)
// nem alkalmas hook2-őt tartalmazó lista kiírására.
// === Fix méretű körkörös buffer =======================================
cout << "\n=== Fix méretű körkörös buffer ===\n";
Buffer<int, 3> cb;
cb.push(1); cb.push(2); cb.push(3);
cout << "Kezdet: "; cb.print();
cb.push(4); // Felülírja a legrégebbit (1)
cout << "Push(4) utan: "; cb.print();
cout << "Pop: " << cb.pop() << "\n";
cout << "Pop utan: "; cb.print();
// === Indexelt bináris keresőfa (magyar azonosítókkal) ==================
cout << "\n=== Indexelt bináris keresőfa ===\n";
IndexeltBKF bkf;
for (int v : {5, 2, 8, 1, 4, 7, 9})
bkf.beszur(v);
cout << "Rendezett kiiras: ";
bkf.kiiratas();
cout << "k-adik legkisebb lekerdezesek:\n";
for (int k = 0; k < 7; ++k) {
cout << " k=" << k << " -> " << bkf.k_adik_legkisebb(k) << "\n";
}
return 0;
}