lista.h

 avatar
unknown
c_cpp
a year ago
4.3 kB
3
Indexable
#ifndef LISTA_H_INCLUDED
#define LISTA_H_INCLUDED

//#include "memtrace.h"

#define PR(x) std::cout << x << std::endl;
#define PR2(x, y) std::cout << x << y << std::endl;

//Generikus
template <typename Adattipus>
class Lista
{
    struct ListaElem
    {
        Adattipus adat;
        ListaElem* kov;
        ListaElem(Adattipus const &a) :adat(a), kov(NULL) {}
    };

    ListaElem* eleje;
    ListaElem* vege;
    size_t meret;

public:
    Lista() :eleje(NULL), vege(NULL), meret(0) {};
    Lista(Lista const &rhs) : eleje(NULL), vege(NULL), meret(rhs.meret)
    {

        if (rhs.eleje == NULL)
            return;
        else
        {
        PR("Lista copy");
            ListaElem *rhsmozgo = rhs.eleje;

            while(rhsmozgo != NULL)
            {
                this->Add(rhsmozgo->adat);
                rhsmozgo = rhsmozgo->kov;
            }
        }
    }

    Lista& operator=(const Lista& rhs)
    {
        if(this != &rhs)
        {
        PR2("===eleje:", eleje);
        PR2("rhshelyek: ", rhs.GetEleje());
            if (eleje != NULL)
                this->clear();
            ListaElem *rhsmozgo = rhs.eleje;

            while(rhsmozgo != NULL)
            {
                this->Add(rhsmozgo->adat);
                rhsmozgo = rhsmozgo->kov;
            }
            this->meret = rhs.meret;
            PR2("thiseleje:", this->GetEleje());
        }

            PR("ASD");
        return *this;
    }

    size_t const getSize() const {return meret;}
    bool const isNull() const {return eleje == NULL ? true : false;}
    ListaElem* GetEleje() const {return eleje;}

    void Add(Adattipus const &e)
    {
        ListaElem *uj = new ListaElem(e);

        if (eleje == NULL)
        {
            eleje = uj;
            vege = uj;
            meret++;
        }
        else
        {
            //PR2("\nEleje: ", eleje);
            /*PR2("Eleje-kov: ", eleje->kov);
            PR2("Vege: ", vege);
            PR2("Vege->kov: ", vege->kov);
            PR2("Uj: ", uj);*/
            vege->kov = uj;
            vege = vege->kov;
            /*PR2("Vege: ", vege);
            PR2("Vege->kov: ", vege->kov);
            PR("\n");*/
            meret++;
        }
    }

    void Remove(size_t idx)
    {
        if (idx >= meret)
            throw "Rossz index Remove!";
        ListaElem* mozgo = eleje;
        ListaElem* lemarado = eleje;

        if(idx == 0)
        {
            eleje = eleje->kov;
            delete mozgo;
            mozgo = eleje;
            lemarado = eleje;
            return;
        }

        for (size_t i = 0; i < idx; ++i)
        {
            lemarado = mozgo;
            mozgo = mozgo->kov;
        }
        lemarado->kov = mozgo->kov;
        delete mozgo;
    }

    Adattipus& operator[](size_t idx) const
    {
        if (idx >= meret)
            throw "Rossz index Lista[]!";
        //PR2("\nElejeELOTT: ", eleje);
        ListaElem* mozgo = eleje;
        //PR2("Eleje: ", eleje);
        for (size_t i = 0; i < idx; ++i)
            {
                /*PR2("\nEleje: ", eleje);
                PR2("Eleje->kov: ", eleje->kov);
                PR2("mozgo: ", mozgo);
                PR2("mozgo->kov: ", mozgo->kov);*/
                mozgo = mozgo->kov;
            }
        //PR2("ElejeKOV: ", eleje->kov);
        return mozgo->adat;
    }

    size_t Where(Adattipus const &e)
    {
        ListaElem* mozgo = eleje;

        for (size_t i = 0; mozgo != vege; mozgo = mozgo->kov)
        {
            if (mozgo->adat == e)
                return i;
        }
        return -1;
    }

    void clear()
    {
        PR2("this->getSize(): ", this->getSize());
        if(eleje == NULL || this->getSize() == 0)
            return;

        PR("\nLista dtor");
        ListaElem* mozgo = eleje;
        PR2("eleje:", eleje);
        //PR2("eleje kov:", eleje->kov);
        while(mozgo != NULL)
        {

            ListaElem* torlo = mozgo;
            PR2("vege:", vege);
            mozgo = mozgo->kov;

            PR2("Eppen itt:", mozgo);
            PR2("Eppen torlom:", torlo);
            PR2("torlo->kov:", torlo->kov);
            delete torlo;
        }
        eleje = NULL;
        vege = NULL;
        meret = 0;
    }

    virtual ~Lista() {clear();}
};


#endif // LISTA_H_INCLUDED














Editor is loading...
Leave a Comment