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]
|