Obojsmerný lineárny zoznam

Faktoriál


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 prvok {
	char cifra;
	struct prvok *predch;
	struct prvok *nasled;
} TPrvok;
-------------------------------------------------------------------------------------------
int vypis(TPrvok **prva, TPrvok **posl) {
	int pocet = 0;
	TPrvok *pom;

	while (*prva != NULL) {
		pocet++;
		printf("%d", (*prva)->cifra);      /* vypíše hodnotu */
		pom = *prva;                       /* zruší uzol */
		*prva = (*prva)->nasled;
		free((void*)pom);
	}
	*prva = *posl;
	return (pocet);   /* vráti počet cifier vo výsledku */
}
-------------------------------------------------------------------------------------------
void main(void) /* hlavný program */
{
	TPrvok *cislica, *prva, *posl;
	int n, i;
	int prenos = 0;
	int sucin = 1;

	/* vstup */
	clrscr();
	printf("Vypocitam hodnotu n!\n");
	printf("n = ");
	scanf("%d", &n);

	/* vytvorenie prvého prvku zoznamu, sucin == 1 */
	prva = (TPrvok*)malloc(sizeof(TPrvok));
	prva->cifra = 1;
	prva->predch = NULL;
	prva->nasled = NULL;
	posl = prva;

	/* výpočet n! */
		for (i = 1; i <= n; i++) {
			cislica = posl;
			while (cislica != NULL) {
				sucin = cislica->cifra * i + prenos;
				cislica->cifra = sucin % 10;
				prenos = sucin / 10;
				cislica = cislica->predch;
			}
			while (prenos != 0) {
				cislica = (TPrvok*)malloc(sizeof(TPrvok));
				cislica->predch = NULL;
				cislica->nasled = prva;
				prva->predch = cislica;
				prva = cislica;
				cislica->cifra = prenos % 10;
				prenos = prenos / 10;
			}
	}

	/* výstup */
	printf("Vysledok: ");
	int poc = vypis(&prva, &posl);
	printf("\nPocet cifier vo vysledku: %d", poc);
	getch();
}