[ osmania @ 16.01.2013. 22:41 ] @
molim za pomoc:

Sta je lose u ovom Insertu greska sljedeca:

warning C4033: 'insert' must return a value
warning C4172: returning address of local variable or temporary
warning C4715: 'insert' : not all control paths return a value

uradio sam return p u insert funkciji;

ali mozda kod pozivanja insert nesto ne valja jer ne snimam nigdje ali kad stavim w= insert (5,w) onda mi pokrene baci rezultat 5 i zakuca se program...


Code:
#include <stdio.h>
#include <math.h>
#include <malloc.h>

typedef struct TNode
{
    int data;
    struct TNode * pleft;
    struct TNode * pright;
}
TNode;

void* insert(int x, TNode* p);
int min(TNode * p);
int max(TNode * p);
double avg(TNode * p);
int sum(TNode * p);
int count(TNode * p);

int main(int argc, char * argv[])
{
    TNode* w = NULL;

    insert(5, w);   // w = insert(5, w); pokusao sam ovo ali ne radi 
    insert(3, w);
    insert(7, w);
    insert(4, w);
    insert(9, w);
    insert(1, w);
    insert(6, w);
    insert(2, w);

    printf("min: %d\n", min(w));
    printf("max: %d\n", max(w));
    printf("sum: %d\n", sum(w));
    printf("cnt: %d\n", count(w));
    printf("avg: %f\n", avg(w));

    return 0;
}

int min(TNode * p)
{
    if (p->pleft == NULL) return p->data;
    return min(p->pleft);
}
int max(TNode * p)
{
    if (p->pright == NULL) return p->data;
    return max(p->pright);
}
double avg(TNode * p)
{
    return sum(p) / (double)count(p);
}

int sum(TNode * p)
{
    if (p == NULL) return 0;
    return p->data + sum(p->pleft) + sum(p->pright);
}

int count(TNode * p)
{
    if (p == NULL) return 0;
    return 1 + count(p->pleft) + count(p->pright);
}

void* insert(int x, TNode* p)
{
    if (p == NULL)
    { // freier Platz
        TNode * neu = (TNode*)malloc(sizeof(TNode));
        if (neu == NULL) return;
        neu->data = x; 
        neu->pleft = neu->pright = NULL;
        p = neu;
    }
    else
    { // besetzt
        if (x < p->data)
            insert(x, p->pleft);
        else
            insert(x, p->pright);
    }
    return p ;
}
[ glorius @ 17.01.2013. 20:15 ] @
Evo sta se desava ovde...

Ti predajes funkciji pointer na TNode* w koji posle izlaza iz funkcije ostaje nepromenjen.... To se desava zato sto funkcija tada vidi pointer kao lokalnu promenljivu...
Mozes i proveriti, posle poziva insert(5, w) postavi breakpoint i videces da je w = NULL, suprotno tvom ocekivanju da je memorija za w alocirana unutar funkcije.

Da razjasnim...

Ti kad predajes funkciji neku promenljivu i zelis da ona bude promenjena ti predajes adresu te promenljive:

Code:

void promeni(int parametar)
{
    parametar = 5;
}

void main()
{
    int a = 0;
    promeni(a);
}


U ovom slucaju, kao sto znas, a nece biti promenjeno i onda mora da se preda adresa od a.

Code:

void promeni(int* parametar)
{
     *parametar = 5;
}

void main()
{
    int a = 0;
    promeni(&a);
}


Analogno tome, kad zelis da pointer bude promenjen, kao u tvom slucaju, moras da predas adresu pointera.

Code:

void* insert(int x, TNode** p)
{
    if (*p == NULL)
    { // freier Platz
        TNode * neu = (TNode*)malloc(sizeof(TNode));
        if (neu == NULL) return;
        neu->data = x; 
        neu->pleft = neu->pright = NULL;
        *p = neu;
    }
    else
    { // besetzt
        if (x < *p->data)
            insert(x, &p->pleft);
        else
            insert(x, &p->pright);
    }
    return *p ;
}

void main()
{
    TNode* w = 0;
    insert(5, &w);
    // sada je w promenjeno jer si predao adresu od w kao sto bi radio i sa obicnim promenljivama da bi promenio vrednost parametra unutar funkcije
}


Drugi nacin je da se drzis tvog koda i da napises:

w = insert(5, w);

w je sada ok inicijalizovano.

Ja bih ti preporucio prvi nacin bez vracanja vrednosti:

Code:

void insert(int x, TNode** p)
{
    if (*p == NULL)
    { // freier Platz
        TNode * neu = (TNode*)malloc(sizeof(TNode));
        if (neu == NULL) return;
        neu->data = x; 
        neu->pleft = neu->pright = NULL;
        *p = neu;
    }
    else
    { // besetzt
        if (x < *p->data)
            insert(x, &p->pleft);
        else
            insert(x, &p->pright);
    }
}



[Ovu poruku je menjao glorius dana 17.01.2013. u 21:26 GMT+1]
[ osmania @ 18.01.2013. 06:21 ] @
Prijatelju evo sto mene buni:
OVo je jedan test i neko je uslikao.

Sto mene buni ova funkcija Insert

ima return tree;

a funcija je

Code:
void* insert(int x, TNode* p) 
a ne
Code:
void* insert(int x, TNode** p)

malo me to sve sad buni;

i kad pogledas kako se poziva funkcija insert:
Code:
proot =insert(5,proot)