Cyklický zoznam

Z kola von


Program Spustiteľná verzia

/* 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();
}