Grupa od n plesača (na čijim kostimima su redom brojevi od 1 do n) uvežbava svoju plesnu tačku tako što formiraju krug iz kog će redom izlaziti plesači na sledeći način: a) počev od plesača označenog brojem 1, a brojeći udesno (ka plesačima sa večim rednim brojevima), izlazi m-ti plesač nakon isključenja, brojanje otpočinje od sledećeg plesača i to u suprotnom smeru, tj. ako se brojalo udesno, počinje se od desnog suseda isključenog plesača i broji se ulevo izlasci iz kruga se nastavljaju sve dok svi plesači ne budu isključeni Celi brojevi m, n se zadaju kao argumenti komandne linije. Napisati C program koji ispisuje redne brojeve plesača u redosledu napuštanja kruga. #include #include /*element kruga*/ typedef struct covek_cvor { int rbr; /*redni broj plesaca*/ struct covek_cvor *levi, *desni; }covek; main(int argc, char **argv) { int i; /*brojac u petljama */ int N; /*broj ljudi u krugu */ int M; /*redni broj za izbacivanje */ int neparno; /* indikator smera razbrajanja */ covek *prvi,*p,*pom; /*prvi, tekuci/poslednji i pomocni clan kruga */ if( argc != 3 ) { fprintf(stderr,"Nekorektan broj parametara u pozivu programa\n"); exit(10); } sscanf( argv[1], "%d", &N); sscanf( argv[2], "%d", &M); if (N<=0 || M<=0) { fprintf(stderr,"Nekorektna vrednost parametara u pozivu programa\n"); exit(10); } /*prvi clan liste plesaca u krugu */ prvi=(covek*) malloc(sizeof(covek)); prvi->rbr=1; p=prvi; /*formiranje susednih clanova liste */ for(i=2;idesni= (covek*) malloc(sizeof(covek) ) ) == NULL) { printf("Nema u memoriji dovoljno mesta za malloc\n"); exit(1); } p->desni->rbr=i; /*numerisanje kostima plesaca*/ p->desni->levi=p; p=p->desni; /*priprema za dodavanje sledeceg plesaca u krug */ } /*zatvaranje kruga */ p->desni=prvi; prvi->levi=p; /*pocinje razbrajanje ...*/ /* neparana brojanja idu redom, a parna su sa vracanjem */ neparno=1; /*izbacivanje M-tog */ while( p) /*tj. dok ima plesaca u krugu */ { /*ako je brojanje parno...*/ if (neparno < 0) { /* ... broji se sa vracanjem (ulevo) */ for(i=1;ilevi; /*priprema za naredno brojanje koje pocinje od p */ p=prvi->levi; } else /*ako je brojanje parno...*/ { /* ... broji se unapred (desno) */ for(i=1;idesni; /*priprema za naredno brojanje koje pocinje od p*/ p=prvi->desni; } /*ispisuje se redni broj plesaca koji se iskljucuje */ printf("Izbaciti %d\n", prvi->rbr); /*ako je to poslednji plesac, onda prestaje brojanje */ if (p==prvi) p=NULL; else /* inace se iskljucuje iz kruga*/ { pom=prvi; pom->levi->desni=pom->desni; pom->desni->levi=pom->levi; } /*brisanje iskljucenog elementa*/ free(pom); /*naredno brojanje pocinje od p...*/ prvi=p; /*... u suprotnom smeru*/ neparno= (-1) * neparno; } }