05_opakovani_iteratory_ADT
Níže je uveden pouze náhled materiálu. Kliknutím na tlačítko 'Stáhnout soubor' stáhnete kompletní formátovaný materiál ve formátu PDF.
b) na začátek
novaKarta = (struct TPackListNode*)malloc( … );
novaKarta->iValue = aVal;
novaKarta->iNext = struktura->iTop;
struktura->iTop = novaKarta;
Karty - Lineární seznam
struct TPackList {
struct TPackListNode *iTop;
struct TPackListNode *iLast;
}
struct TPackListNode {
struct TPackListNode *iNext;
short
iValue;
}
c) Zamíchání
1.
Vytvoříme si 2 ukazatele (pA, pB) na náhodných pozicích v seznamu:
iTop -> … -> pA -> … -> pB -> … -> iLast -> NULL
2.
Provedeme několik změn ve vazbách:
iLast->iNext
= pA->iNext;
pA->iNext
= pB->iNext;
pB->iNext
= NULL;
iLast
= pB;
3.
Opakujeme N-krát
Karty – Pole indexů
struct TPackArray {
size_t iCount;
short iValues[CARD_MAX_COUNT];
short iIndexes[CARD_MAX_COUNT];
}
• Přidali jsme pole indexů iIndexes
• iIndexes určuje pořadí vybírání karet z iValues
• Jak budou vypadat funkce pro:
a) vybrání následující karty?
b) zamíchání?
c) přidání karty (např. z jiného balíčku)?
Iterátory
• Též označováno jako Kurzory
• Návrhový vzor pro procházení datové struktury
• Oddělení implementace od použití
• Vytváří jednotné rozhraní
• Spojeny s příkazy foreach/for/while pro procházení
a vybírání prvků
Iterátory - for
Iterátor {
kontejner;
pozice;
}
for ( iterátor = iterátor_begin();
iterátor_valid(iterátor);
iterátor_next(iterátor);
)
{
vypiš ( iterátor_aktuální_hodnota ( iterátor ) );
}
Iterátory - for
iterátor = iterátor_begin ( )
iterátor_valid ( iterátor )
iterátor_next ( iterátor )
iterátor_aktuální_hodnota ( iterátor )
• Co budou dělat tyto funkce u zásobníku realizovaném:
a) Statickým polem?
b) Jednosměrně lineárně vázaným seznamem?
Iterátory – for – statické pole
struct Tstack {
size_t iCount;
TStackElement iValues[STACK_MAXCOUNT];
}
struct TStackIterator {
const struct TStack *iStack;
size_t iPos;
}
iterátor = iterátor_begin ( )
//vytvoří nový objekt
iterátor_valid ( iterátor )
//došli jsme na konec?
iterátor_next ( iterátor )
//přejdi na další
iterátor_aktuální_hodnota ( iterátor )
//vrátí aktuální hodnotu