#include #include /** Struktura predstavujici tabulist */ struct tabulist_s { uint_fast16_t delka; uint_fast16_t max_element; uint_fast16_t pozice; uint_fast16_t *list; uint64_t mapa[]; }; /** Konstruktor - vytvori novy tabulist * @param delka - delka tabulist * @param max_element - max. hodnota elementu v tabulistu. Hodnot vkládané do tabulistu musí být z {1, 2, ... max_element } * @return nový tabulist */ struct tabulist_s *tabulist_new(int delka, int max_element) { struct tabulist_s *tabulist; tabulist = (struct tabulist_s *)calloc(1,sizeof(uint_fast16_t)*delka + sizeof(uint64_t)*(1 + ((max_element+1) >> 6))); tabulist->list = (uint_fast16_t *)calloc(sizeof(uint_fast16_t), delka); tabulist->list[0] = 0; tabulist->delka = delka; tabulist->max_element = max_element; return tabulist; } /** Ověří zda tabulist obsahuje element * @return 0 pokud neobsahuje, jinak nenulovou hodnotu */ int tabulist_obsahuje(const struct tabulist_s* const tabulist, int element) { return tabulist->mapa[ element >> 6 ] & ( 1 << (element & 0x3F ) ); } /** Vypíše tabulist na stdout */ void tabulist_vypis(const struct tabulist_s* const tabulist) { int i; for( i = tabulist->pozice; i < tabulist->delka; i++ ) printf("%d ", tabulist->list[i]); for( i = 0; i < tabulist->pozice; i++ ) printf("%d ", tabulist->list[i]); printf("\n"); } /** Vloží element do tabulistu */ void tabulist_vloz(struct tabulist_s* const tabulist, int element) { if( tabulist_obsahuje(tabulist, element) ){ uint_fast16_t i; for( i = 0; i < tabulist->delka; i++ ) if( tabulist->list[i] == element ){ tabulist->list[i] = 0; break; } } tabulist->mapa[ tabulist->list[ tabulist->pozice ] >> 6 ] &= ~( 1 << (tabulist->list[ tabulist->pozice ] & 0x3F ) ); tabulist->mapa[ element >> 6 ] |= ( 1 << (element & 0x3F ) ); tabulist->list[ tabulist->pozice ] = element; if( ++tabulist->pozice >= tabulist->delka ) tabulist->pozice = 0; } /** Vyprázdní tabulist (stejné jako smazání a vytvoření nového tabulistu) */ void tabulist_vyprazdni( struct tabulist_s * const tabulist ) { memset( tabulist->mapa, 0, sizeof(uint64_t) * (1+ ((tabulist->max_element + 1) >> 6)) ); memset( tabulist->list, 0, sizeof(uint_fast16_t) * tabulist->delka ); tabulist->pozice = 0; } /** Destruktor */ void tabulist_znic( struct tabulist_s *tabulist ) { free( tabulist->list ); free( tabulist ); }