C drzewo binarne wyszukiwanie

Odpowiedz Nowy wątek
2014-03-28 12:03

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

Witam
Zacząłem pisać program do drzewa binarnego, jednak po wywołaniu funkcji Search, crashuje mi się program. Bardzo proszę o pomoc
Pozdrawiam

#include <stdio.h>
#include <string.h>
#define ILOSC_NUMEROW 20        

typedef struct dane{
    char imie[20];
    char nazwisko[20];
    int numer[ILOSC_NUMEROW];
}Dane;

typedef struct drzewo{
    struct drzewo *lewy;
    struct drzewo *prawy;
    Dane dane;
}Drzewo;

void Insert(Drzewo *drzewo);  
void InOrder(Drzewo *root, Drzewo *temp);
//void SearchMin(Drzewo *drzewo);
//void SearchMax(Drzewo *drzewo);
void Search(Drzewo *root); 
//void Wysokosc(Drzewo *drzewo);
Drzewo *Compare(Drzewo *root, char *nazwisko);

int main(){

    fprintf(stderr, "test");
    int liczba_wezlow = 0;
    int wysokoc = 0;
    char ch;
    Drzewo root;
    root.lewy = NULL;
    root.prawy = NULL;

    printf("Wpisz a - aby dodac dane, b - aby wyszukac minimalne, "
        "c - aby wyszukac maksymalne, d - wyszukac, q - aby wyjsc\n");

    while ((ch = getchar()) != 'q'){

        switch (ch){
            case 'a':
                Insert(&root);
                break;
            case 'b':
                //SearchMin(&root);
                break;
            case 'c':
                //SearchMax(&root);
                break;
            case 'd':
                Search(&root);
                break;
            case 'e':
                //Wysokosc(&root);
                break;
            case 'f':
                printf("%d", liczba_wezlow);
                break;
            default:
                printf("Blad w instrukcji switch!\n");

        }
        printf("Wpisz a - aby dodac dane, b - aby wyszukac minimalne, "
        "c - aby wyszukac maksymalne, d - wyszukac, e - ilosc wezlow "
        "f - wysokosc, q - wyjscie\n");

        while(getchar () != '\n')
            continue;

        }

    return 0;
}

//WPROWADZA NOWA POZYCJE
void Insert(Drzewo *root){

    printf("insert!\n");
    int i, ilosc;
    Drzewo temp;

    printf("Podaj imie");
    scanf("%s", temp.dane.imie);
    printf("Podaj nazwisko");
    scanf("%s",temp.dane.nazwisko);
    printf("Podaj liczbe numerow ktore chcesz dodac");
    scanf("%d", &ilosc);

    for (i = 0; i < ilosc; i++)
        scanf("%d", &(temp.dane.numer[i]));

    temp.lewy = NULL;
    temp.prawy = NULL;

    InOrder(root, &temp);
    printf("Koniec Insert");
}

//REKURENCYJNIE PRZECHODZI PO DRZEWIE I DODAJE POZYCJE 
void InOrder(Drzewo *root, Drzewo *temp){
    printf("jest!");
    if (strcmp(temp->dane.nazwisko, root->dane.nazwisko) > 0){
        if (root->prawy == NULL)
             root->prawy = temp;
        InOrder(root->prawy, temp);
    }
    else if (strcmp(temp->dane.nazwisko, root->dane.nazwisko) < 0){
        if (root ->lewy == NULL)
            root->lewy = temp;
        InOrder(root->lewy, temp);
    }
}

//WYSZUKIWANIE POZYCJI
void Search(Drzewo *root){

    char nazwisko[20];
    Drzewo *temp;

    printf("Wpisz nazwisko do wyszukania: ");
    scanf("%s", nazwisko);

    temp = Compare(root, nazwisko);
    if (temp == NULL)
        fprintf(stderr, "Brak pozycji!");

    printf("Imie: %s", temp->dane.imie);

}

//REKURENCYJNIE SPRAWDZA CZY JEST POZYCJA
Drzewo *Compare(Drzewo *root, char *nazwisko){
    printf("compare!");
    if (strcmp(nazwisko, root->dane.nazwisko) > 0){
        if (root->prawy == NULL){
            printf("brak pozycji!");
            return NULL;
        }
        Compare(root->prawy, nazwisko);
    }
    else if (strcmp(nazwisko, root->dane.nazwisko) < 0){
        if (root ->lewy == NULL){
            printf("brak pozycji!");
            return NULL;
        }
        Compare(root->lewy, nazwisko);
    }
    else
        return root;
} 

Pozostało 580 znaków

2014-03-28 12:14

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

2

Przerób to w ten sposób:

...
typedef struct galaz
  {
   struct galaz *lewy,*prawy;
   Dane dane;
  } Galaz;
typedef struct drzewo
  {
   struct galaz *korzen;
  } Drzewo;

void Insert(Drzewo *drzewo,Dane dane);
void InOrder(Galaz *root);
void Search(Drzewo *drzewo,const char *nazwisko);
int Compare(Galaz *root,const char *nazwisko);

int main()
  {
   Drzewo drzewo={NULL};
   ...

bo tak jak zacząłeś to praktycznie nie da rady.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-03-28 12:45

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

A jak funkcja InOrder ma dodać nową pozycję, mając tylko Galaz?

Pozostało 580 znaków

2014-03-28 12:54

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

0
kry5 napisał(a):

A jak funkcja InOrder ma dodać nową pozycję, mając tylko Galaz?

To ciekawa koncepcja! Co ma niby dodawać funkcja InOrder?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-03-28 12:59

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

hmm ma sprawdzać czy pozycja powinna znaleźć się po lewej stronie, czy po prawej i ustawić nową gałąź w odpowiednie miejsce. Dobrze myślę?

Pozostało 580 znaków

2014-03-28 18:34

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

Zrobiłem coś takiego, jednak dalej nie działa...

 #include <stdio.h>
#include <string.h>
#define ILOSC_NUMEROW 20        

typedef struct dane{
    char imie[20];
    char nazwisko[20];
    int numer[20];
}Dane;

typedef struct drzewo{
    struct galaz *korzen;
}Drzewo;

typedef struct galaz{
    struct galaz *lewy, *prawy;
    Dane dane;
}Galaz;

void Insert(Drzewo *drzewo);  
void InOrder(Galaz *root, Galaz *temp);
//void SearchMin(Drzewo *drzewo);
//void SearchMax(Drzewo *drzewo);
void Search(Drzewo *wdrzewo); 
//void Wysokosc(Drzewo *drzewo);
void Compare(Galaz *root, const char *nazwisko, Galaz *temp);

int main(){

    fprintf(stderr, "test");
    int liczba_wezlow = 0;
    int wysokoc = 0;
    char ch;
    Drzewo wdrzewo;
    Galaz root;
    fprintf(stderr, "test");
    root.lewy = NULL;
    root.prawy = NULL;
    wdrzewo.korzen = &root;

    printf("Wpisz a - aby dodac dane, b - aby wyszukac minimalne, "
        "c - aby wyszukac maksymalne, d - wyszukac, q - aby wyjsc\n");

    while ((ch = getchar()) != 'q'){

        switch (ch){
            case 'a':
                Insert(&wdrzewo);
                break;
            case 'b':
                //SearchMin(&root);
                break;
            case 'c':
                //SearchMax(&root);
                break;
            case 'd':
                Search(&wdrzewo);
                break;
            case 'e':
                //Wysokosc(&root);
                break;
            case 'f':
                printf("%d", liczba_wezlow);
                break;
            default:
                printf("Blad w instrukcji switch!\n");

        }
        printf("Wpisz a - aby dodac dane, b - aby wyszukac minimalne, "
        "c - aby wyszukac maksymalne, d - wyszukac, e - ilosc wezlow "
        "f - wysokosc, q - wyjscie\n");

        while(getchar () != '\n')
            continue;

        }

    return 0;
}

//WPROWADZA NOWA POZYCJE
void Insert(Drzewo *wdrzewo){

    printf("insert!\n");
    int i, ilosc;
    Galaz temp;

    printf("Podaj imie");
    scanf("%s", temp.dane.imie);
    printf("Podaj nazwisko");
    scanf("%s",temp.dane.nazwisko);
    printf("Podaj liczbe numerow ktore chcesz dodac");
    scanf("%d", &ilosc);

    for (i = 0; i < ilosc; i++)
        scanf("%d", &(temp.dane.numer[i]));

    temp.lewy = NULL;
    temp.prawy = NULL;

    InOrder(wdrzewo->korzen, &temp);
    printf("Koniec Insert");
}

//REKURENCYJNIE PRZECHODZI PO DRZEWIE I DODAJE POZYCJE 
void InOrder(Galaz *root, Galaz *temp){
    printf("jest!");
    if (strcmp(temp->dane.nazwisko, root->dane.nazwisko) > 0){
        if (root->prawy == NULL)
             root->prawy = temp;
        InOrder(root->prawy, temp);
    }
    else if (strcmp(temp->dane.nazwisko, root->dane.nazwisko) < 0){
        if (root ->lewy == NULL)
            root->lewy = temp;
        InOrder(root->lewy, temp);
    }
}

//WYSZUKIWANIE POZYCJI
void Search(Drzewo *wdrzewo){

    char nazwisko[20];
    Galaz *temp;

    printf("Wpisz nazwisko do wyszukania: ");
    scanf("%s", nazwisko);

    Compare(wdrzewo->korzen, nazwisko, temp);
    if (temp == NULL)
        fprintf(stderr, "Brak pozycji!");

    printf("Imie: %s", temp->dane.imie);

}

//REKURENCYJNIE SPRAWDZA CZY JEST POZYCJA
void Compare(Galaz *root, const char *nazwisko, Galaz *temp){
    printf("compare!");
    if (strcmp(nazwisko, root->dane.nazwisko) > 0){
        if (root->prawy == NULL){
            temp = NULL;
            fprintf(stderr, "Brak pozycji!");
        }
        Compare(root->prawy, nazwisko, temp);
    }
    else if (strcmp(nazwisko, root->dane.nazwisko) < 0){
        if (root ->lewy == NULL){
            fprintf(stderr, "Brak pozycji!");
            temp = NULL;
        }
        Compare(root->lewy, nazwisko, temp);
    }
    else
        temp = root;
}

Pozostało 580 znaków

2014-03-28 22:57

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

0
_13th_Dragon napisał(a):

...

int main()
{
Drzewo drzewo={NULL};
...

Oczywiście możesz ignorować to co piszę częściowo lub w całości, to twoje prawo.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-03-29 00:02

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

Nie zignorowałem, przyznaję się, że nie zauważyłem tej linijki... Jednak co ta linijka zmienia? Stworzyłem zmienną typu Galaz i od razu przypisałem ją drzewu, natomiast jej wskaźniki lewy i prawy ustawiłem na NULL.

Pozostało 580 znaków

2014-03-29 00:21

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

0

... a w nazwisku jakieś śmieci, które porównujesz za pomocą strcmp w funkcji Compare wywołanej z Search


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-03-29 08:32

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

Nic już z tego nie rozumiem...

Pozostało 580 znaków

2014-03-29 11:21

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

0

Podpiąłeś od drzewo jakiś fikcyjny węzeł bez danych i myślisz że nadal to może działać?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0