[ Hyperborejac @ 18.12.2004. 13:42 ] @
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); } |