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]