Jednosmerný lineárny zoznam

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


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