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]