Jednosmerný lineárny zoznam

Súčet veľkých prirodzených čísel


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 uzol {
   int cifra;
   struct uzol *dalsi;
} TUzol;

-----------------------------------------------------------------------------
void pridaj(TUzol **z, int c) /* pridanie prvku na začiatok zoznamu */
{
   TUzol *novy = (TUzol*)malloc(sizeof(TUzol));
   novy->cifra = c;
   novy->dalsi = *z;
   *z = novy;
}
-----------------------------------------------------------------------------
void precitaj_cislo(TUzol **z, FILE *f) /* zo súboru */
{
   int c;

   while ((c = getc(f)) != EOF) {
      c = c - '0';   /* prevod prečítaného znaku na číselnú hodnotu */
      pridaj(z, c); 
   }
}
-----------------------------------------------------------------------------
void vypis(TUzol *p)
{
  while (p != NULL) {
    printf("%d", p->cifra);
    p = p->dalsi;
  }
}
-----------------------------------------------------------------------------
void sucet(TUzol **s, TUzol *z1, TUzol *z2)
{
    int pom;
    int prenos = 0;

    while ((z1 != NULL) && (z2 != NULL)) {
      pom = z1->cifra + z2->cifra + prenos;
      pridaj(s, pom % 10);
      prenos = pom / 10;
      z1 = z1->dalsi;
      z2 = z2->dalsi;
    }

    if ((z1 == NULL) && (z2 == NULL) && (prenos != 0)) pridaj(s, prenos);
    else
      if (z1 != NULL) {
        while (z1 != NULL) {
            pom = z1->cifra + prenos;
            pridaj(s, pom % 10);
            prenos = pom / 10;
            z1 = z1->dalsi;
         }
        if (prenos != 0) pridaj(s, prenos);
       }
       else {
         while (z2 != NULL) {
            pom = z2->cifra + prenos;
            pridaj(s, pom % 10);
            prenos = pom / 10;
            z2 = z2->dalsi;
         }
         if (prenos != 0) pridaj(s, prenos);
       }
}
-----------------------------------------------------------------------------
void main(void) /* hlavný program */
{
   TUzol *a, *b, *sucet;
   FILE *fr1, *fr2;

   /* vytvorenie prázdnych zoznamov */
   a = NULL;
   b = NULL;
   sucet = NULL;

   /* otvorenie vstupných suborov - bez testu návratovej hodnoty funkcie fopen! */
   fr1  = fopen ("a.txt", "rt");
   fr2  = fopen ("b.txt", "rt");

   clrscr();

   /* vstup */
   precitaj_cislo(&a, fr1);
   precitaj_cislo(&b, fr2);
   
   /* výpočet */
   sucet(&sucet, a, b);
   
   /* výstup */
   printf("\na + b = ");
   vypis(sucet);

   fclose(fr1);
   fclose(fr2);
   getch();
}