Code:
/* Uradite copy/paste, kompajlirajte gcc-om (trebao bi svaki drugi) i pomozite, ako znate. Pozdrav i hvala.*/
/* Problematican program za gubljenje zivaca. */
/* Sabiranje dvije liste. Problem je u tome kako da izvedem sabiranje tri liste. */
#include <stdio.h>
/* Kreiram klasicnu listu. */
typedef struct anenzi {
int glava;
struct anenzi *rep;
} lista;
/* Funkcija koja vraca duzinu liste. */
int Duzina (lista **l) {
if (*l == NULL) return 0;
else return(1 + (Duzina(& ((*l) -> rep)) ));
}
/* Ispis liste... lista se ispisuje obratno, da bi sabiranje bilo brze (tj. broj 192 se pamti kao 2 -> 9 -> 1) */
void IspisNaopako(lista **l) {
int i, z;
lista *pom;
z = Duzina(l);
while (z) {
pom = *l;
for (i=1;i<z;++i) pom = pom -> rep;
printf("%d -> ", pom -> glava);
z--;
}
printf("\n");
}
/* Funkcija koja unosi element na pocetak liste. */
void NaPocetak(lista **l, int i) {
lista *pom;
pom = (lista *) malloc(sizeof(lista));
pom -> glava = i;
pom -> rep = *l;
*l = pom;
}
/* Funkcija koja rekurzivno sabira dvije liste l i k i njihov rezultat upisuje u zbir. */
void RekurzLakse(lista **l, lista **k, lista **zbir, int prenos) {
if ((*l != 0) && (*k != 0)) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = ((*l) -> glava + (*k) -> glava + prenos)%10;
(*zbir) -> rep = 0;
prenos = ((*l) -> glava + (*k) -> glava + prenos)/10;
RekurzLakse(& ((*l) -> rep), & ((*k) -> rep), & ((*zbir) -> rep), prenos);
}
else if (*l != 0) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = ((*l) -> glava + prenos)%10;
(*zbir) -> rep = 0;
prenos = ((*l) -> glava + prenos)/10;
RekurzLakse(& ((*l) -> rep), k, & ((*zbir) -> rep), prenos);
}
else if (*k != 0) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = ((*k) -> glava + prenos)%10;
(*zbir) -> rep = 0;
prenos = ((*k) -> glava + prenos)/10;
RekurzLakse(l, & ((*k) -> rep), & ((*zbir) -> rep), prenos);
}
else if (prenos) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = 1;
(*zbir) -> rep = 0;
}
}
/* Ovakav izlaz mi treba, tj. treba mi funkcija Saberi2 koja ce imati oblik :
**Saberi2(lista **l, lista **k)
Ovaj program je dio jednog veceg programa u kome mi je bas ovakav oblik funkcije neophodan.
*/
lista **Saberi2(lista **l, lista **k) {
lista **pom;
RekurzLakse(l,k,pom,0);
return(pom);
}
/* PROBLEMATICAN DIO I UJEDNO GLAVNO PITANJE : */
/* Ovaj dio koda normalno sabira 3 liste, ali rezultat prepisuje preko liste k koja mu se zadaje kao argument.*/
/* Kako ga promijeniti tako da i dalje sabira sve 3 liste, ali da ne mijenja argumente? */
lista **Saberi3(lista **l, lista **k, lista **z) {
return(Saberi2((*Saberi2)(l,k), z));
}
main() {
lista *l, *k, *z, *pom, *pom2, *pom3;
int i, b1, b2, b3, cif, n;
pom=NULL;
pom2=NULL;
l = NULL;
k = NULL;
z = NULL;
pom = NULL;
printf("Unesite koliko prvi broj ima cifara :\n");
scanf("%d", &b1);
printf("Unesite cifre prvog broja (iza svake enter...)\n");
for (i=0; i<b1; ++i) {
printf("Cifra %d : ", i+1);
scanf("%d", &cif);
NaPocetak(&l, cif);
}
printf("Unesite koliko drugi broj ima cifara :\n");
scanf("%d", &b2);
printf("Unesite cifre drugog broja (iza svake enter...)\n");
for (i=0; i<b2; ++i) {
printf("Cifra %d : ", i+1);
scanf("%d", &cif);
NaPocetak(&k, cif);
}
printf("Unesite koliko treci broj ima cifara :\n");
scanf("%d", &b3);
printf("Unesite cifre treceg broja (iza svake enter...)\n");
for (i=0; i<b3; ++i) {
printf("Cifra %d : ", i+1);
scanf("%d", &cif);
NaPocetak(&z, cif);
}
printf("\n\n\n\n\nDakle, unijeli ste sledece liste : \n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
printf("Idemo da saberemo prve dvije liste :\n");
pom = *Saberi2(&l, &k);
IspisNaopako(&pom);
printf("Cisto da vidimo da se liste nisu promijenile : \n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
printf("Idemo sad da saberemo ove 3 liste :\n");
pom2 = *Saberi3(&l, &k, &z);
printf("Rezultat je :\n");
IspisNaopako(&pom2);
printf("Cisto da se uvjerimo da se liste l, k i z nisu promijenile :\n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
printf("... I TO NE RADI JER SE LISTA k PROMIJENILA! ZASTO I KAKO DA OTKLONIM?\n");
printf("A sad idem da saberem liste l, k i z opet :\n");
pom3 = *Saberi2( Saberi2(&l, &k)) ,&z);
/* Segmentation fault. Zasto ovo ne moze? Pitanje dva i ujedno poslednje. */
IspisNaopako(&pom3);
printf("Cisto da se uvjerimo da se liste l, k i z nisu promijenile :\n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
}
/* Uradite copy/paste, kompajlirajte gcc-om (trebao bi svaki drugi) i pomozite, ako znate. Pozdrav i hvala.*/
/* Problematican program za gubljenje zivaca. */
/* Sabiranje dvije liste. Problem je u tome kako da izvedem sabiranje tri liste. */
#include <stdio.h>
/* Kreiram klasicnu listu. */
typedef struct anenzi {
int glava;
struct anenzi *rep;
} lista;
/* Funkcija koja vraca duzinu liste. */
int Duzina (lista **l) {
if (*l == NULL) return 0;
else return(1 + (Duzina(& ((*l) -> rep)) ));
}
/* Ispis liste... lista se ispisuje obratno, da bi sabiranje bilo brze (tj. broj 192 se pamti kao 2 -> 9 -> 1) */
void IspisNaopako(lista **l) {
int i, z;
lista *pom;
z = Duzina(l);
while (z) {
pom = *l;
for (i=1;i<z;++i) pom = pom -> rep;
printf("%d -> ", pom -> glava);
z--;
}
printf("\n");
}
/* Funkcija koja unosi element na pocetak liste. */
void NaPocetak(lista **l, int i) {
lista *pom;
pom = (lista *) malloc(sizeof(lista));
pom -> glava = i;
pom -> rep = *l;
*l = pom;
}
/* Funkcija koja rekurzivno sabira dvije liste l i k i njihov rezultat upisuje u zbir. */
void RekurzLakse(lista **l, lista **k, lista **zbir, int prenos) {
if ((*l != 0) && (*k != 0)) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = ((*l) -> glava + (*k) -> glava + prenos)%10;
(*zbir) -> rep = 0;
prenos = ((*l) -> glava + (*k) -> glava + prenos)/10;
RekurzLakse(& ((*l) -> rep), & ((*k) -> rep), & ((*zbir) -> rep), prenos);
}
else if (*l != 0) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = ((*l) -> glava + prenos)%10;
(*zbir) -> rep = 0;
prenos = ((*l) -> glava + prenos)/10;
RekurzLakse(& ((*l) -> rep), k, & ((*zbir) -> rep), prenos);
}
else if (*k != 0) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = ((*k) -> glava + prenos)%10;
(*zbir) -> rep = 0;
prenos = ((*k) -> glava + prenos)/10;
RekurzLakse(l, & ((*k) -> rep), & ((*zbir) -> rep), prenos);
}
else if (prenos) {
*zbir = (lista *) malloc(sizeof(lista));
(*zbir) -> glava = 1;
(*zbir) -> rep = 0;
}
}
/* Ovakav izlaz mi treba, tj. treba mi funkcija Saberi2 koja ce imati oblik :
**Saberi2(lista **l, lista **k)
Ovaj program je dio jednog veceg programa u kome mi je bas ovakav oblik funkcije neophodan.
*/
lista **Saberi2(lista **l, lista **k) {
lista **pom;
RekurzLakse(l,k,pom,0);
return(pom);
}
/* PROBLEMATICAN DIO I UJEDNO GLAVNO PITANJE : */
/* Ovaj dio koda normalno sabira 3 liste, ali rezultat prepisuje preko liste k koja mu se zadaje kao argument.*/
/* Kako ga promijeniti tako da i dalje sabira sve 3 liste, ali da ne mijenja argumente? */
lista **Saberi3(lista **l, lista **k, lista **z) {
return(Saberi2((*Saberi2)(l,k), z));
}
main() {
lista *l, *k, *z, *pom, *pom2, *pom3;
int i, b1, b2, b3, cif, n;
pom=NULL;
pom2=NULL;
l = NULL;
k = NULL;
z = NULL;
pom = NULL;
printf("Unesite koliko prvi broj ima cifara :\n");
scanf("%d", &b1);
printf("Unesite cifre prvog broja (iza svake enter...)\n");
for (i=0; i<b1; ++i) {
printf("Cifra %d : ", i+1);
scanf("%d", &cif);
NaPocetak(&l, cif);
}
printf("Unesite koliko drugi broj ima cifara :\n");
scanf("%d", &b2);
printf("Unesite cifre drugog broja (iza svake enter...)\n");
for (i=0; i<b2; ++i) {
printf("Cifra %d : ", i+1);
scanf("%d", &cif);
NaPocetak(&k, cif);
}
printf("Unesite koliko treci broj ima cifara :\n");
scanf("%d", &b3);
printf("Unesite cifre treceg broja (iza svake enter...)\n");
for (i=0; i<b3; ++i) {
printf("Cifra %d : ", i+1);
scanf("%d", &cif);
NaPocetak(&z, cif);
}
printf("\n\n\n\n\nDakle, unijeli ste sledece liste : \n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
printf("Idemo da saberemo prve dvije liste :\n");
pom = *Saberi2(&l, &k);
IspisNaopako(&pom);
printf("Cisto da vidimo da se liste nisu promijenile : \n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
printf("Idemo sad da saberemo ove 3 liste :\n");
pom2 = *Saberi3(&l, &k, &z);
printf("Rezultat je :\n");
IspisNaopako(&pom2);
printf("Cisto da se uvjerimo da se liste l, k i z nisu promijenile :\n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
printf("... I TO NE RADI JER SE LISTA k PROMIJENILA! ZASTO I KAKO DA OTKLONIM?\n");
printf("A sad idem da saberem liste l, k i z opet :\n");
pom3 = *Saberi2( Saberi2(&l, &k)) ,&z);
/* Segmentation fault. Zasto ovo ne moze? Pitanje dva i ujedno poslednje. */
IspisNaopako(&pom3);
printf("Cisto da se uvjerimo da se liste l, k i z nisu promijenile :\n");
IspisNaopako(&l);
IspisNaopako(&k);
IspisNaopako(&z);
}
Milivojev pas je siledžija. Siledžija!