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; }