/* ADT Doppelt verkettete Liste (Double Linked List) -- interface */
#pragma once
#include "stdafx.h" 

class DLList {
public:
    /* Erzeugt leere Liste. */
    DLList();

    /* Haengt ein Element hinten an die Liste an. */
    void append(int item);

    /* Loescht das Element, auf dem der Cursor steht. */
    void deleteCurrent();

    /* Loescht das Element an der angegebenen Stelle. */
    void deleteIndex(int index);

    /* Bewegt den Cursor an den Anfang der Liste. */
    void toStart();

    /* Bewegt den Cursor an das Ende der Liste. */
    void toEnd();

    /** Bewegt den Cursor zum naechsten Element in der Liste. */
    void next();

    /** Bewegt den Cursor zum vorherigen Element in der Liste. */
    void prev();

    /* Liest das aktuelle Element in der Liste. */
    int read();

    /* Liest das aktuelle Element in der Liste und bewegt den Cursor eins weiter. */
    int readNext();

    /* Liest das aktuelle Element in der Liste und bewegt den Cursor eins zurueck. */
    int readPrev();

    /* Liefert true zurueck, wenn die Liste nicht leer ist. */
    bool isNonEmpty();

    /* Liefert true zurueck, wenn die Liste nicht voll ist. */
    bool isNonFull();

    /* Liefert true zurueck, wenn der Cursor am Anfang der Liste steht. */
    bool isAtEnd();

    /* Liefert true zurueck, wenn der Cursor am Ende der Liste steht. */
    bool isAtStart();

private:
    struct ListItem;          // Opake Definition eines Listenelements

    ListItem *first;          // Zeiger auf das erste Element der Liste
    ListItem *last;           // Zeiger auf das letzte Element der Liste
    ListItem *current;        // Zeiger auf das aktuelle Element (=Cursor)

    bool nonFull;             // true, wenn Liste nicht voll
    bool nonEmpty;            // true, wenn Liste nicht leer
};

