4. Cyklický zoznam
4.2 Problém – Z kola von
Študenti potrebujú spomedzi seba vybrať „dobrovoľníka,“ ktorý sa obetuje za triedu a prihlási sa na hodine fyziky. Nikto sa však neučil, všetci sa boja. Preto sa dohodli na riekanke. Postavia sa do kruhu a na koho padne posledná slabika, ten z kruhu vypadne. Posledný, kto zostane v kruhu, musí sa prihlásiť, či sa mu to páči alebo nie. Napíšte program, ktorý pre zadanú dĺžku riekanky (počet slabík) a mená študentov, ktorí utvoria kruh, vypíše poradie, v akom jednotliví študenti z kola vypadávali a samozrejme aj meno „šťastného“ víťaza.
Riešenie
Použijeme cyklický lineárny zoznam tvorený prvkami typu TZiak
typedef struct ziak {
char meno[30];
struct ziak *dalsi;
} TZiak;
Zo vstupu načítame počet žiakov v kruhu a počet slabík riekanky. Mená jednotlivých žiakov stojacich v kruhu budú prvkami lineárneho zoznamu – prvky pridávame na koniec zoznamu – zachováme tak poradie žiakov.
 Na začiatku pointer ten bude ukazovať na prvého v kruhu (toho, od ktorého sa začína vypočítavať), pointer pred ukazuje na predchodcu tohto prvku. Samotné vypočítavanie sa realizuje v cykle takto:
for (i = 1; i < pocslab; i++) {
pred = pred->dalsi;
ten = ten->dalsi;
}
Po skončení cyklu ten ukazuje na žiaka, na ktorého padla posledná slabika a vypadol z kola von – príslušný prvok teda zo zoznamu odstránime:
pred->dalsi = ten->dalsi;
printf("\nVypadol : %s", ten->meno);
free((void*)ten);
ten = pred->dalsi;
 Vypočítava sa ďalej, postupne vypadávajú z kola všetci žiaci – posledný ktorý v zozname zostane sa stáva „víťazom.“
[Program]
|