Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem u funkciji - binarno stablo

[es] :: C/C++ programiranje :: Problem u funkciji - binarno stablo

[ Pregleda: 1979 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Aleksandar Vasic
Web Administrator, Uspon d.o.o
Čačak

Član broj: 91692
Poruke: 1226
*.dynamic.isp.telekom.rs.

Sajt: www.vasictech.net


+1 Profil

icon Problem u funkciji - binarno stablo18.02.2011. u 10:52 - pre 160 meseci
Pozdrav,

imam jedan malo cudan problem sa funkcijom za sabiranje svih elemenata binarnog stabla.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct tnode
{
    int data;
    struct tnode *lchild, *rchild;
};


void zbir(struct tnode *p)
{
    int zbirel;
    zbirel=0;
    if(p != NULL)
    {
        zbir(p->lchild);
        zbirel = zbirel + p->data;
        zbir(p->rchild);
    }
    printf("%d", zbirel);
}


struct tnode *insert(struct tnode *p,int val)
{
    struct tnode *temp1,*temp2;
    if(p == NULL)
    {
        p = (struct tnode *) malloc(sizeof(struct tnode));
        if(p == NULL)
        {
            printf(" Greska \n");
            exit(0);
        }
        p->data = val;
        p->lchild=p->rchild=NULL;
    }
    else
    {
        temp1 = p;
        while(temp1 != NULL)
        {
            temp2 = temp1;
            if( temp1 ->data > val)
                temp1 = temp1->lchild;
            else
                temp1 = temp1->rchild;
        }
        if( temp2->data > val)
        {
            temp2->lchild = (struct tnode*)malloc(sizeof(struct tnode));
            temp2 = temp2->lchild;
            if(temp2 == NULL)
            {
                printf(" Greska \n");
                exit(0);
            }
            temp2->data = val;
            temp2->lchild=temp2->rchild = NULL;
        }
        else
        {
            temp2->rchild = (struct tnode*)malloc(sizeof(struct tnode));
            temp2 = temp2->rchild;
            if(temp2 == NULL)
            {
                printf(" Greska \n");
                exit(0);
            }
            temp2->data = val;
            temp2->lchild=temp2->rchild = NULL;
        }
    }
    return(p);
}


void main()
{
    struct tnode *root = NULL;
    int n,x,zbirr;
    printf("\nUneti broj cvorova u drvetu \n");
    scanf("%d",&n);
    while( n > 0)
    {
        printf(" Uneti vrednost koja se smesta u cvor \n");
        scanf("%d",&x);
        root = insert(root,x);
        n--;
    }
    zbir(root);
    getch();
}


Rekurzivna funkcija zbir bi trebalo da prodje kroz sve elemente stabla i da ih sabere, a zatim ispise vrednost, medjutim
dobija se nesto sasvim cudno, za elemente stabla 1,2,3 dobija se zbir 0000123.
Ukoliko umesto reda
Code:
zbirel = zbirel + p->data;

napisem
Code:
printf("%d", p->data);

dobijem 1,2,3 sto znaci da funkcija prolazi dobro kroz elemente stabla, ali ne sabira kako treba?

[Ovu poruku je menjao Mihajlo Cvetanović dana 18.02.2011. u 12:22 GMT+1]
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem u funkciji - binarno stablo18.02.2011. u 11:24 - pre 160 meseci
Funkcija zbir je rekurzivna. Ona treba da vraća rezultat, ali ne i da ga ispisuje, inače će ispisivati i međurezultate. U glavnoj funkciji treba da se ispisuje rezultat.
 
Odgovor na temu

Aleksandar Vasic
Web Administrator, Uspon d.o.o
Čačak

Član broj: 91692
Poruke: 1226
*.dynamic.isp.telekom.rs.

Sajt: www.vasictech.net


+1 Profil

icon Re: Problem u funkciji - binarno stablo18.02.2011. u 11:31 - pre 160 meseci
Hvala na brzom odgovoru, probao sam i to

da funkcija bude int zbir(); i da ima povratnu vrednost return zbirel;

medjutim dobije se rezultat 1

opet greska!?

edit: sad sam skontao :))
resio sam tako sto sam promenljivu zbirel postavio kao globalnu i u main samo odradio ispis :)

hvala puno
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem u funkciji - binarno stablo18.02.2011. u 11:47 - pre 160 meseci
Mešanje globalnih promenljivih sa rekurzivnim funkcijama ponekad može da napravi probleme. U ovom slučaju to nije potrebno. Funkcija zbir je vrlo jednostavna, i bez pomoći sa strane:

Code:
int zbir(struct tnode *p)
{
    return p != NULL ? zbir(p->lchild) + p->data + zbir(p->rchild) : 0;
}
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Problem u funkciji - binarno stablo18.02.2011. u 12:41 - pre 160 meseci
Napiši čoveku ljudski

Code:
int zbir(struct tnode *p) {
    if (p == NULL) {
        return 0;
    }

    return p->data + zbir(p->lchild) + zbir(p->rchild);
}

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Aleksandar Vasic
Web Administrator, Uspon d.o.o
Čačak

Član broj: 91692
Poruke: 1226
*.dynamic.isp.telekom.rs.

Sajt: www.vasictech.net


+1 Profil

icon Re: Problem u funkciji - binarno stablo18.02.2011. u 13:15 - pre 160 meseci
Hvala :)
 
Odgovor na temu

[es] :: C/C++ programiranje :: Problem u funkciji - binarno stablo

[ Pregleda: 1979 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.