====== 1. domácí úloha ====== [[wp>Linked_list|Linked list]] void InitList (tList *L) { L -> act = NULL; //prazdny aktualni L -> frst = NULL; //prazdny konec } void DisposeList (tList *L) { while (L -> frst != NULL) { //dokud nezrusim vsechny prvky tElemPtr x = L -> frst; //nastav docasny ukazatel na prvni prvek L -> frst = L -> frst -> ptr; //nastav prvni prvek na druhy prvek free(x); //zrus docasny ukazatel (byvaly prvni prvek) } L -> act = NULL; } void InsertFirst (tList *L, int val) { tElemPtr prvek; //novy prvek if ((prvek = malloc(sizeof(struct tElem))) == NULL ) { //jeho alokace Error(); //a osetreni chyby return; } prvek -> data = val; //nastaveni hodnoty noveho prvku prvek -> ptr = L -> frst; //novy prvni prvek musi ukazovat na ten stary L -> frst = prvek; //a novy prvni je skutecne prvni } void First (tList *L) { L -> act = L -> frst; //aktualni ukazuje na prvni } void CopyFirst (tList *L, int *val) { if (L -> frst == NULL) { //kdyz je prazdny Error(); //vyvola chybu return; } *val = L -> frst -> data; //precte a vrati hodnotu } void DeleteFirst (tList *L) { if (L -> frst == NULL) { //kdyz je prazdny return; //nic nedelej } if (L -> act == L -> frst) { //kdyz je prvni aktivni L -> act = NULL; //deaktivuj ho } tElemPtr x = L -> frst; //zalozni ukazatlen na prvni L -> frst = L -> frst -> ptr; //prvni bude ted druhy free(x); //zrus stary prvni } void PostDelete (tList *L) { if (L -> act == NULL || L -> act -> ptr == NULL) { //neni aktivni nebo je posledni prvek return; //nic nedelej } tElemPtr x = L -> act -> ptr; //docasny ukazatel na nasledujici prvek L -> act -> ptr = L -> act -> ptr -> ptr; //ukazatel na nasledujici musi ukazovat na ten jeste dalsi nasledujici free(x); //zrusit stary nasledujici } void PostInsert (tList *L, int val) { if (L -> act == NULL) { //neni aktivni return; //nedlej nic } tElemPtr prvek; //novy prvek if ((prvek = malloc(sizeof(struct tElem))) == NULL ) { //zkusime naalokovat Error(); //nebo skoncime return; } prvek -> data = val; //naplnime hodnotu prvek -> ptr = L -> act -> ptr; //ukazeme na nasledujici prvek L -> act -> ptr = prvek; //a novy nasledujici bude nas novy prvek } void Copy (tList *L, int *val) { if (L -> act == NULL) { //kdyz neni nic aktivni Error(); //zarveme return; //a skoncime } *val = L -> act -> data; //precteme aktivni data } void Actualize (tList *L, int val) { if (L -> act == NULL) { //kdyz neni aktivni return; //konec } L -> act -> data = val; //zapise nova data do aktivniho prvku } void Succ (tList *L) { if (L -> act == NULL) { //nic neni aktivni return; //konec } L -> act = L -> act -> ptr; //presuneme aktivitu na nasledujici } int Active (tList *L) { /* if (L -> act == NULL) { return 0; } else { return 1; } */ return L -> act != NULL; } void queueInit ( tQueue* q ) { if (q == NULL) { //kdyz nic queueError(QERR_INIT); //tak zarvat } else { for (unsigned int i = 0; i < QUEUE_SIZE; i++) { //vyprazdneni q -> arr[i] = '?'; } q -> f_index = 0; //vynulovani indexu q -> b_index = 0; } } int nextIndex ( int index ) { return (index + 1) % QUEUE_SIZE; } int queueEmpty ( const tQueue* q ) { return q -> f_index == q -> b_index; } int queueFull ( const tQueue* q ) { return q->f_index == nextIndex(q->b_index); } char queueFront ( const tQueue* q ) { if (queueEmpty(q) != 0) { // kdyz prazdna queueError(QERR_FRONT); //zarvat return -1; //zkoncit } else { return q -> arr[q -> f_index]; //vratit znak na prvnim miste } } void queueRemove ( tQueue* q ) { if (queueEmpty(q) != 0) { //kdyz prazdna queueError(QERR_REMOVE); //zarvat } else { q -> f_index = nextIndex(q -> f_index); //bude prvni nasledujici znak (protoci frontu) } } char queueGet ( tQueue* q ) { if (queueEmpty(q) != 0) { //kdyz prazdna queueError(QERR_GET); //zarvi return -1; //umri } else { char x = queueFront(q); //uloz prvni znak queueRemove(q); //odstrank prvni znak return x; //vrat byvaly porvni znak } } void queueUp ( tQueue* q, char c ) { if (queueFull(q) != 0) { //kdyz prazdna queueError(QERR_UP); //zarvi } else { q -> arr[q -> b_index] = c; //nacpi na prazdne misto znak q -> b_index = nextIndex(q -> b_index); //posun na dalsi prazdne misto } } 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; }