Cyklický zoznam

Z kola von


Program   EXE

/* pripojenie potrebných hlavičkových súborov */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

/* definícia nového typu */
typedef struct ziak {
     char meno[30];
     struct ziak *dalsi;
} TZiak;

/* globálne premenné */
int  n;                 /* počet žiakov */
int  pocslab;          /* dĺžka riekanky */
---------------------------------------------------------------------------
void vypis(TZiak *z)
{
   printf("\nZiaci v kruhu: ");
   while (z != NULL) {
     printf("\n%s ", z->meno);
     z = z->dalsi;
   }
}
---------------------------------------------------------------------------
void nacitaj_ziaka(TZiak **z, TZiak **k)
{
  TZiak *novy;

  /* pridanie prvého prvku do prázdneho zoznamu */
  if (*z == NULL) {    
     *z = (TZiak*)malloc(sizeof(TZiak));
     printf("meno ziaka: ");
     gets((*z)->meno);
     (*z)->dalsi = NULL;
     *k = *z;
  }
  else {  /* pridanie ďalších prvkov */
     novy = (TZiak*)malloc(sizeof(TZiak));
     printf("meno ziaka: ");
     gets(novy->meno);
     novy->dalsi = NULL;
     (*k)->dalsi = novy;
     (*k) = novy;
  }
}
---------------------------------------------------------------------------
void z_kola_von(TZiak **prvy, TZiak **posl)
{
  TZiak *pred, *ten;
  int i;

  pred = *posl;
  ten = *prvy;

  if (n>1)  {
    do {
     /* riekanka */
     for (i = 1; i < pocslab; i++) {
        pred = pred->dalsi;
        ten = ten->dalsi;
     }
     /* ten ukazuje na žiaka, ktorý vypadáva */

     n--; 
     pred->dalsi = ten->dalsi;
     printf("\nVypadol : %s", ten->meno);
     free((void*)ten);
     ten = pred->dalsi;
   } while (n > 1);
  }
  
  /* v zozname zostal jediný prvok */
  *prvy = pred;
  (*prvy)->dalsi = NULL;
  *posl = *prvy;
}
---------------------------------------------------------------------------
void main(void) /* hlavný program */
{
   TZiak *prvy, *posl;
   int i;
   
   /* vytvorenie prázdneho zoznamu */
   prvy = posl = NULL; 

   /* vstup */
   clrscr();
   printf("Pocet ziakov: ");
   scanf("%d", &n);
   printf("Pocet slabik riekanky: ");
   scanf("%d", &pocslab); getchar();

   for (i = 1; i<= n ; i++) nacitaj_ziaka(&prvy, &posl);
   vypis(prvy);

   /* vytorenie kruhu */
   posl->dalsi = prvy; 

   /* vypočítavanie */
   z_kola_von(&prvy, &posl);
   
   /* výstup */
   printf("\n\nOdpovedat pojde: %s", prvy->meno);
   getch();
}