[ danijel_markic @ 28.01.2006. 09:58 ] @
Imao sam za izraditi ovaj program:

Code:
Napisati funkciju za punjenje memorijski rezidentnog binarnog stabla
u čije čvorove treba upisati: cijena artikla (realni broj) i naziv artikla (15+1 znakova).
Stablo treba sortirati po cijeni artikala; lijevi jeftiniji, desni skuplji.
Napisati funkciju za ispis elementa za koju je ulazni argument korijen stabla. 
Ispis treba biti poredan po cijeni od najjeftinijeg do najskupljeg artikla. 
Napisati funkciju koja ispiše sve proizvode čija je cijena manja od neke određene 
vrijednosti koja se unese u glavnoj funkciji programa tijekom izvršavanja programa.


Ovo sam uspio napraviti
Code:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct s_element
{
    char* ime;
    double cijena;
} Element;

typedef struct s_node
{
    struct s_node* parent;
    struct s_node* left;
    struct s_node* right;
    Element el;
} Node;

Node* Posadi(Element p_el, Node* roditelj);
Node* Napravi_Lijevo(Element p_el, Node* korijen);
void PrintOut(Node* korijen);
void Ubaci(Element p_el, Node* korijen);
void PrintOutCijena(Node* korijen, double cijena);

int main()
{
    int j;
    FILE *test;
    Node* root;
    Element element;
    printf("TEST\n");
    test = fopen ("Binarno drvo.txt", "r");
    if (!test) {
    printf ("Nema ulaznih podataka\n");
        exit (1);
    }
    j = 1;
    root = NULL;
  while (fscanf (test, "%s %f", element.ime, &element.cijena) != EOF) {
    printf ("%2d. ulazni podatak je %-15s %6.2f\n", j++, element.ime, element.cijena);
    root = Posadi (element, root);
  }
    float d;
    printf("Upisi trazenu cijenu: ");
    scanf("%f",&d);    
    printf("\n");
    PrintOutCijena(root,d);    
    return 0;
}

Node* Posadi(Element p_el, Node* roditelj)
{
    
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->parent = roditelj;
    temp->left=0;
    temp->right=0;
    temp->el = p_el;
    return temp;
}


Node* Napravi_Lijevo(Element p_el, Node* korijen)
{
    if (!korijen->left)
    {
        Node* temp = korijen->left = Posadi(p_el,korijen);
        return temp;
    }
    return 0;
}


Node* Napravi_Desno(Element p_el, Node* korijen)
{
    if (!korijen->right)
    {
        Node* temp = korijen->right = Posadi(p_el,korijen);
        return temp;
    }
    return 0;
}

void PrintOut(Node* korijen)
{
    if (korijen)
    {
        PrintOut(korijen->left);
        printf("ARTIKL: %s\tCIJENA: %f\n",korijen->el.ime, korijen->el.cijena);
        PrintOut(korijen->right);
    }
}

void PrintOutCijena(Node* korijen, double cijena)
{
    if (korijen)
    {
        PrintOutCijena(korijen->left,cijena);
        if (korijen->el.cijena < cijena)
            printf("ARTIKL: %s\tCIJENA: %f\n",korijen->el.ime, korijen->el.cijena);
        PrintOutCijena(korijen->right, cijena);
        
    }
    
}

void Ubaci(Element p_el, Node* korijen)
{
    if (korijen)
    {
        if (p_el.cijena < korijen->el.cijena)
        {
            if (korijen->left)
            {
                Ubaci(p_el,korijen->left);
                return;
            }
            korijen->left = Posadi(p_el,korijen);
        }
        else
        {
            if (korijen->right)
            {
                Ubaci(p_el,korijen->right);
                return;
            }
            korijen->right = Posadi(p_el,korijen);
        }
    }
    else
        return;
}



Sada imam problem kada iskompajliram program (prodje bez problema) i pokrenem ga program, jednostavno zablokira... Moze li netko pomoci?...

Unaprijed hvala
[ Buffy @ 28.01.2006. 13:12 ] @
Nisam gledao kod, ali najvjerovatnije imas gresku u koriscenju pointera posto se to meni mnogo puta desavalo. Na primjer: pointer umjesto da pokazuje na odredjenu adresu u memoriju, on pokazuje na NULL ili na memoriju koja nije alocirana. Jos jednom dobro prekontrolisi kod. Pozdrav!
[ NrmMyth @ 28.01.2006. 21:51 ] @
Debuger!!
[ dragansm @ 29.01.2006. 18:24 ] @
Code:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct s_element
{
    char ime[100]; //#
    float cijena; //#
} Element;

typedef struct s_node
{
    struct s_node* parent;
    struct s_node* left;
    struct s_node* right;
    Element el;
} Node;

Node* Posadi(Element p_el, Node* roditelj);
Node* Napravi_Lijevo(Element p_el, Node* korijen);
void PrintOut(Node* korijen);
void Ubaci(Element p_el, Node* korijen);
void PrintOutCijena(Node* korijen, double cijena);

int main()
{
    int j;
    FILE *test;
    Node* root;
    Element element;
    printf("TEST\n");
    test = fopen ("Binarno drvo.txt", "r");
    if (!test) {
        printf ("Nema ulaznih podataka\n");
        exit (1);
    }
    j = 1;
    root = NULL;
    while (fscanf (test, "%s %f", element.ime, &element.cijena) != EOF) {
        printf ("%2d. ulazni podatak je %-15s %6.2f\n", j++, element.ime, element.cijena);
        if ( root == NULL ) root = Posadi (element, root); //#
        else Ubaci( element, root ); //#
    }
    float d;
    printf("Upisi trazenu cijenu: ");
    scanf("%f",&d);    
    printf("\n");
    PrintOutCijena(root,d);    
    return 0;
}

Node* Posadi(Element p_el, Node* roditelj)
{

    Node* temp = (Node*)malloc(sizeof(Node));
    temp->parent = roditelj;
    temp->left=0;
    temp->right=0;
    temp->el = p_el;
    return temp;
}


Node* Napravi_Lijevo(Element p_el, Node* korijen)
{
    if (!korijen->left)
    {
        Node* temp = korijen->left = Posadi(p_el,korijen);
        return temp;
    }
    return 0;
}


Node* Napravi_Desno(Element p_el, Node* korijen)
{
    if (!korijen->right)
    {
        Node* temp = korijen->right = Posadi(p_el,korijen);
        return temp;
    }
    return 0;
}

void PrintOut(Node* korijen)
{
    if (korijen)
    {
        PrintOut(korijen->left);
        printf("ARTIKL: %s\tCIJENA: %f\n",korijen->el.ime, korijen->el.cijena);
        PrintOut(korijen->right);
    }
}

void PrintOutCijena(Node* korijen, double cijena)
{
    if (korijen)
    {
        PrintOutCijena(korijen->left,cijena);
        if (korijen->el.cijena < cijena)
            printf("ARTIKL: %s\tCIJENA: %f\n",korijen->el.ime, korijen->el.cijena);
        PrintOutCijena(korijen->right, cijena);

    }

}

void Ubaci(Element p_el, Node* korijen)
{
    if (korijen)
    {
        if (p_el.cijena < korijen->el.cijena)
        {
            if (korijen->left)
            {
                Ubaci(p_el,korijen->left);
                return;
            }
            korijen->left = Posadi(p_el,korijen);
        }
        else
        {
            if (korijen->right)
            {
                Ubaci(p_el,korijen->right);
                return;
            }
            korijen->right = Posadi(p_el,korijen);
        }
    }
    else
        return;
}


Izmenjeni delovi koda su oznaceni sa //#