void DLInitList (tDLList *L) {
L -> Act = NULL; //prazdny aktualni
L -> First = NULL; //prazdny prvni
L -> Last = NULL; //prazdny posledni
}
void DLDisposeList (tDLList *L) {
while (L -> First != NULL) { //dokud nezrusim vsechny prvky
tDLElemPtr x = L -> First; //nastav docasny ukazatel na prvni prvek
L -> First = L -> First -> rptr; //nastav prvni prvek na druhy prvek
free(x); //zrus docasny ukazatel (byvaly prvni prvek)
}
L -> Act = NULL; //vymaz zbytky
L -> Last = NULL;
}
void DLInsertFirst (tDLList *L, int val) {
tDLElemPtr prvek; //novy prvek
if ((prvek = malloc(sizeof(struct tDLElem))) == NULL) { //jeho alokace
DLError(); //a osetreni chyby
return;
}
prvek -> data = val; //nastaveni hodnoty noveho prvku
prvek -> rptr = L -> First; //novy prvni prvek musi ukazovat na ten stary
prvek -> lptr = NULL; //prvek je prvni, takze zarucime ze vlevo nic neni
if (L -> First != NULL) {
L -> First -> lptr = prvek; //kdyz novy prvek neni do prazdneho seznamu, bude stary prvni prvek ukazovat na aktualni
} else {
L -> Last = prvek; //vklafani do rpazdneho seznamu
}
L -> First = prvek; //a novy prvni je skutecne prvni
}
void DLInsertLast(tDLList *L, int val) {
tDLElemPtr prvek; //novy prvek
if ((prvek = malloc(sizeof(struct tDLElem))) == NULL) { //jeho alokace
DLError(); //a osetreni chyby
return;
}
prvek -> data = val; //nastaveni hodnoty noveho prvku
prvek -> lptr = L -> Last; //novy posledni prvek musi ukazovat na ten stary
prvek -> rptr = NULL; //prvek je posledni, takze zarucime ze vpravo nic neni
if (L -> Last != NULL) {
L -> Last -> rptr = prvek; //neprazdny seznam
} else {
L -> First = prvek; //prazdny seznam
}
L -> Last = prvek; //a novy prvni je skutecne posledni
}
void DLFirst (tDLList *L) {
L -> Act = L -> First; //aktalni je prvni
}
void DLLast (tDLList *L) {
L -> Act = L -> Last; //aktualni je posledni
}
int DLCopyFirst (tDLList *L) {
if (L -> Last == NULL && L -> First == NULL) { //kdyz je prazdny
DLError(); //vyvola chybu
return -1;
}
return L -> First -> data; //precte a vrati prvni hodnotu
}
int DLCopyLast (tDLList *L) {
if (L -> Last == NULL && L -> First == NULL) { //kdyz je prazdny
DLError(); //vyvola chybu
return -1;
}
return L -> Last -> data; //precte a vrati posledni hodnotu
}
void DLDeleteFirst (tDLList *L) {
if (L -> Last == NULL && L -> First == NULL) { //kdyz je seznam prazdny
return;
}
if (L -> First != NULL) {
tDLElemPtr x = L -> First; //docasny prvek
if (L -> Act == L -> First) { //kdyz je prvni aktivni
L -> Act = NULL; //deaktivuj ho
}
if (L -> First == L -> Last) { //pokud je mazany posledni
L -> First = NULL; //vynuluj
L -> Last = NULL;
} else { //jinak
L -> First = L -> First -> rptr; //dalsi prvni
L -> First -> lptr = NULL; //vlevo nic
}
free(x); //uvolni
}
}
void DLDeleteLast (tDLList *L) {
if (L -> Last == NULL && L -> First == NULL) {
return; //kdyz je seznam prazdny, nedelej nic
}
tDLElemPtr x;
if (L -> Last != NULL) {
x = L -> Last;
if (L -> Act == L -> Last) { //kdyz je prvni aktivni
L -> Act = NULL; //deaktivuj ho
}
if (L -> First == L -> Last) { //kdyz je seznam skoro prazdny
L -> First = NULL; //vynuluj
L -> Last = NULL;
} else {
L -> Last = L -> Last -> lptr; //posledni bude predposledni
L -> Last -> rptr = NULL; //vpravo nic
}
free(x); //uvolni
}
}
void DLPostDelete (tDLList *L) {
if (L -> Act != NULL && L -> Act -> rptr != NULL) { //kdyz je seznam aktivni a je co mazat (aktivni neni posledni)
tDLElemPtr x = L -> Act -> rptr; //zalohuj mazany
L -> Act -> rptr = x -> rptr; //posun ukazatel
if (x == L -> Last) {
L -> Last = L -> Act; //kdyz je mazany posledni, bude posledni i aktualni
} else {
x -> rptr -> lptr = L -> Act; //kdyz ne, cerna magie
}
free(x); //uvolni
}
}
void DLPreDelete (tDLList *L) {
if (L -> Act != NULL && L -> Act -> lptr != NULL) { //kdyz je seznam aktivni a je co mazat (aktivni neni prvni)
tDLElemPtr x = L -> Act -> lptr; //zalohuj mazany
L -> Act -> lptr = x -> lptr; //posun ukazatel
if (x == L -> First) {
L -> First = L -> Act; //kdyz je mazany prvni, bude prvni aktualni
} else {
x -> lptr -> rptr = L -> Act; //kdyz ne, cerna magie
}
free(x); //uvolni
}
}
void DLPostInsert (tDLList *L, int val) {
if (L -> Act != NULL) { // kdyz je seznam aktivni
tDLElemPtr x; //novy prvek
if ((x = malloc(sizeof(struct tDLElem))) == NULL) { //jeho alokace
DLError(); //a osetreni chyby
return;
}
x -> data = val; //napln data
x -> rptr = L -> Act -> rptr;
x -> lptr = L -> Act;
L -> Act -> rptr = x;
if (L -> Act == L -> Last) {
L -> Last = x; // kdyz je aktivni posledni, bude posledni novy
} else {
x -> rptr -> lptr = x; //jinak cerna magie
}
}
}
void DLPreInsert (tDLList *L, int val) {
if (L -> Act != NULL) { //kdyz je seznam aktivni
tDLElemPtr x; //novy prvek
if ((x = malloc(sizeof(struct tDLElem))) == NULL) { //jeho alokace
DLError(); //a osetreni chyby
return;
}
x -> data = val; //napln data
x -> lptr = L -> Act -> lptr;
x -> rptr = L -> Act;
L -> Act -> lptr = x;
if (L -> Act == L -> First) {
L -> First = x; //kdyz je aktivni prvni, bude prvni novy
} else {
x -> lptr -> rptr = x; //jinak cerna magie
}
}
}
int DLCopy (tDLList *L) {
if (L -> Act == NULL) { //kdyz neni nic aktivni
DLError(); //zarveme
return -1; //a skoncime
}
return L -> Act -> data; //precteme aktivni data
}
void DLActualize (tDLList *L, int val) {
if (L -> Act == NULL) { //nic neni aktivni
return; //konec
}
L -> Act -> data = val; //presuneme aktivitu na nasledujici
}
void DLSucc (tDLList *L) {
if (L -> Act == NULL) { //nic neni aktivni
return; //konec
}
L -> Act = L -> Act -> rptr; //presuneme aktivitu na nasledujici
}
void DLPred (tDLList *L) {
if (L -> Act == NULL) { //nic neni aktivni
return; //konec
}
L -> Act = L -> Act -> lptr; //presuneme aktivitu na predchozi
}
int DLActive (tDLList *L) {
return L -> Act != NULL;
}