Drzewo BST

0

Witam, mam problem z implementacją BST w języku C, miała to być książka telefoniczna. Napisałem program, działał bez problemu pod windowsem (kompilowałem w Code::Blocks), natomiast pod linuxem wywalało naruszenie ochrony pamięci, dokonałem pewnych zmian, lecz teraz program nic nie wypisuje, nie dodaje żadnych elementów do drzewa. Nie mam żadnego pomysłu dlaczego tak się dzieję, byłbym wdzięczny za jakąś podpowiedź.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>




struct osoba{
        char nazwisko[25];
            char imie[20];
            long int numer1;
            long int numer2;
};
struct wezel{
      struct osoba wpis;
      struct wezel *lewy;
      struct wezel *prawy;
      };



struct wezel*  insert(struct wezel *wezel,char nazw[],char im[],int num1, int num2){
   struct wezel *pom;
   pom=NULL;
   if (wezel==NULL){
   wezel=(struct wezel*)malloc(sizeof(struct wezel));
   if (pom!=NULL){
   wezel=pom;
   strcpy(wezel->wpis.nazwisko,nazw);
   strcpy(wezel->wpis.imie,im);
   wezel->wpis.numer1=num1;
   wezel->wpis.numer2=num2;
   wezel->lewy=NULL;
   wezel->prawy=NULL;
   }
   else printf("Nie udalo sie zaalokowac pamieci\n");
  }

  else{
          if(strcmp(wezel->wpis.nazwisko,nazw)>0)
          insert(wezel->lewy,nazw,im,num1,num2);
          else
             insert(wezel->prawy,nazw,im,num1,num2);
       }
return wezel;
}

void inorder(struct wezel *wezel){
  if (wezel){
     inorder(wezel->lewy);
     printf("%s     %s     %ld     %ld\n\n\n",wezel->wpis.nazwisko,wezel->wpis.imie,wezel->wpis.numer1,wezel->wpis.numer2);
     inorder(wezel->prawy);
}
}

void min(struct wezel *wezel){
    if(wezel->lewy)
        min(wezel->lewy);
    else{
       printf("\n\nOstatnia osoba na liscie:\n");
       printf("%s     %s     %ld     %ld\n",wezel->wpis.nazwisko,wezel->wpis.imie,wezel->wpis.numer1,wezel->wpis.numer2);
}
}

void max(struct wezel *wezel){
    if(wezel->prawy)
        min(wezel->prawy);
    else{
       printf("\n\nPierwsza osoba na liscie:\n");
       printf("%s     %s     %ld     %ld\n",wezel->wpis.nazwisko,wezel->wpis.imie,wezel->wpis.numer1,wezel->wpis.numer2);
}
}
int il_wez(struct wezel *wezel){
    static int i;
    if (wezel){
        i++;
        il_wez(wezel->lewy);
        il_wez(wezel->prawy);
    }
return i;
}
void szukaj(struct wezel *wezel,char *n2){
    if (wezel){
        if (strcmp(wezel->wpis.nazwisko,n2)<0)
            szukaj(wezel->prawy,n2);
        if (strcmp(wezel->wpis.nazwisko,n2)>0)
            szukaj(wezel->lewy,n2);
        if (strcmp(wezel->wpis.nazwisko,n2)==0)
printf("*  %s           %s           %ld          %ld\n",wezel->wpis.nazwisko,wezel->wpis.imie,wezel->wpis.numer1,wezel->wpis.numer2);
        }
    else
    printf("\n\n                                 Nie ma takiego wpisu.\n\n\n");
}

int wysokosc(struct wezel *wezel){
    static int i=0,j=0;
    if (wezel){
        wysokosc(wezel->lewy);
        wysokosc(wezel->prawy);
        i++;
    if (i>j)
    j=i;
    }
    return i;
}

void menu(struct wezel *wezel){
    int wyb;
    char odp;
    char nazw[25],im[20];
    char n2[25];
    long  int num1,num2;

do{
    system("clear");
    printf("\n\nDrzewo poszukiwan binarnych KSIAZKA TELEFONICZNA\n\n\n"
            "****************************************************\n\n"
            "Wybor Funkcji\n"
            "-------------\n"
            " [0]  Koniec\n"
            " [1]  Dodaj wezly\n"
            " [2]  Wypisz liste osob w ksiazce telefonicznej\n"
            " [3]  Wyszukaj osobe\n"
            " [4]  Znajdz pierwsza osobe na liscie\n"
            " [5]  Znajdz ostatnia osobe na liscie\n"
            " [6]  Ilosc wpisanych osob\n"
            " [7]  Wysokosc drzewa\n"
            "--------------\n"
            "Twoj wybor : ");
            scanf("%d",&wyb);
            if (wyb<0 || wyb>9) continue;
    switch(wyb)
{
      case 1 : do{
          getchar();
          printf("Podaj nazwisko: ");
          gets(nazw);
          if (islower(nazw[0]))
          nazw[0]=toupper(nazw[0]);
          printf("Podaj Imie: ");
          gets(im);
          if (islower(im[0]))
          im[0]=toupper(im[0]);
          printf("Podaj pierwszy numer telefonu: ");
          scanf("%ld",&num1);
          getchar();
          printf("Podaj drugi numer telefonu: ");
          scanf("%ld",&num2);
          getchar();
          insert(wezel,nazw,im,num1,num2);
          printf("\n\nWpisz t jesli chcesz dodac nastepny wpis, lub dowolny inny znak w przeciwnym wypadku\n\n");
        }
          while ((odp=getchar())=='t');break;
      case 2 : inorder(wezel);
               getchar();break;
      case 3 : printf("\n\nPodaj szukane nazwisko: ");
               getchar();
               gets(n2);
               if (islower(n2[0]))
               n2[0]=toupper(n2[0]);
               szukaj(wezel,n2);
               getchar();break;
      case 4 : min(wezel);
               getchar();break;
      case 5 : max(wezel);
               getchar();break;
      case 6 : printf("\n\nIlosc wpisanych osob:   %d\n",il_wez(wezel));
               getchar();break;
      case 7 : printf("\n\n\nWysokosc drzewa: %d\n\n",wysokosc(wezel));
               getchar();break;
      default: break;

    }
}
          while (wyb!=0);
}
int main(void){
    struct wezel *root;
    root=NULL;
    menu(root);
    return 0;

}




0

Tragedia niestety, funkcja dodajaca nie ma prawa dzialac dla wiekszej ilosci elementow. Kodu nie analizowalem wiecej.
Zobacz moj temat na forum sprzed tygodnia w dziale C++ pod tytulem "BST - optymalizacja", tam masz jak drzewo w C powinno wygladac.

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