Obojsmerný lineárny zoznam

Faktoriál


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