//---------------------------------------------------------------------------
#ifndef KlyngeListeH
#define KlyngeListeH
//---------------------------------------------------------------------------
#include <conio.h>
#include <cstring.h>
#include <iostream.h>
//#include "KontrolListe.h"
#include "data.h"
#include "sort&search.h"
//---------------------------------------------------------------------------
const int MaxAntal = 200; //Angiver det makismale antal i listen...!

template <class type>
class Klyngeliste
{
public:
  //Konstruktør
    Klyngeliste();

  //Update funktioner.
    //Funktionen indsætter et objekt på listen
    bool Indsaet(type indsat);

    //Funktionen nulstiller IntSlot[3] variablen til 0...
	void NulstilLokaleType();

  //Find funktioner.
    //Funktionen Finder en given streng på listen ved et givent datanr, som står
    //for slotfocus'et. Funktionen returnere det fundne objekt i det overførte objekt
    bool Find(Klyngeliste<type>& Fundet, string Find, int dataNr);

    //Funktionen finder en given integer ved et givent daranr, der står for det
    //det slot focus som variablen tilhører. Funktionen returnere det fundneobjekt
    //i det overførte.
    bool Find(Klyngeliste<type>& Fundet, int Find, int dataNr);

    //Funktionen finder et givent decimal tal i et givent slotnr (datanr). Hvis
    //tallet findes returneres dennes objekt i FUndet.
    bool Find(Klyngeliste<type>& Fundet, double Find, int dataNr);

    ///Funktionen finder et givent objekt (d), i slotfocuset, indenfor intervallet
    //[fra,til] i listen..
	bool Find(int SlotFocus, data d, int fra, int til);

    //Funktionen søger efter den sektion [start, slut] som et givent objekt (Find) dækker i
    //listen. Der skelnes imellem om listen iforvejen er sorteret i stigende eller
    //faldende orden (type = 0/1).
	bool SektionSoegning(int SlotFocus, data Find, int& start, int& slut, char type = 'h');

    //Funktionen søger lineært igennem listen for at finde indekset på det søgte
    //objekt.
    bool LinearSoegning(int SlotFocus, data find, int& index);

  //Hent funktioner.
    //Funktionen henter det objekt på listen som er identisk med det overførte ("find")
    bool Hent(data*& d, data find, int dataNr);

    //Funktionen henter næste objekt på listen dersom der er flere.
	bool HentNaeste(data*& d);

    //Funktionen henter det objekt som variablen PEjer På pejer på i listen.
    bool HentPejerPaa(data* ptr);

  //Sorterings funktioner
    //Funktionen sortere listen i stigene orden efter efter det angivne slotfocus
    void SorterKL(SlotFocus);

    //Funktionen sortere en del af listen i intervallet [fra,til] i den angiven
    //orden (type), med et givent slot focus.
	void SorterDel(int SlotFocus, int fra, int til, int type = 1);

    //Funktionen udskiller alle stamlokaler på lægge listen... Kan kun anvendes i denne
    //forbindelse.
    int UdskilStamLokaler();

    //Funktionen udskiller det søgte objekt således at alle identiske objekter
    //enten kommer til at ligge i første del (b) eller den sidste del(s) af
    //listen.
    int Udskil(int SlotFocus, data& Find, char del);

  //Bi funktioner
    void reset(int PejerPaa_ = 0) { PejerPaa = PejerPaa_; }
    int Optael(int SlotFocus, data d, int fra, int til);

  //Udskrivs funktion.
    void Udskriv();

  //Offentlige variable
    search<data> TilSoegning;  //Objekt til søge klassen
    sort<data> TilSortering;   //Objekt til sorterings klassen
    data TilData;              //Objekt til data klassen.
    int PejerPaa;     //Pejer på en bestemt plads i listen
    int Brugt;        //Angiver antallet af objekter på listen
    int n;
    int Pladsering;   //Angiver pladseringen af et bestemt objekt.
    int count;
    type Liste[MaxAntal];  //Den faktiske liste...!
};
//----------------------------------------------------------------------------
#include "KlyngeListeTpl.tpl"
#endif

