Drzewo BST- Nowa osoba nie jest zapisywana po dodaniu.

0

Cześć, mam napisać drzewo BST na zajęcia z języka C. Mam ściśle powiedziane, które funkcje mają być zrealizowane rekurencyjnie, a które iteracyjnie, więc tych rzeczy nie mogę zmienić. Program kompiluje się elegancko, po czym po wybraniu dowolnej z funkcji z menu, mam "Naruszenie ochrony pamięci". Szczególnie zależy mi na funkcji "dodawanie". Kod Proszę o pomoc.

Edit : Nie wiedzieć czemu scanf wywalał błąd na linuksie. Zmieniam temat i kod, gdyż problem z zapisywaniem nowej osoby nadal aktualny.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define ROZMIAR 100

struct osoba
{
char imie[ROZMIAR];
char nazwisko[ROZMIAR];
int numery[ROZMIAR];
int klucz;
struct osoba *prawy;
struct osoba *lewy;
};

void dodaj(struct osoba *head)
{

int wartosc;
struct osoba *wsk;

wsk=head;

printf("Podaj wartosc klucza dla nowej osoby.\n");

scanf("%d",&wartosc);


while(1)
    {

        if (wsk == NULL)
        {

            wsk=(struct osoba*)malloc(sizeof (struct osoba));
            wsk->lewy=NULL;
            wsk->prawy=NULL;
            printf("Podaj imie nowej osoby.\n");
            scanf("%s",&(wsk->imie));
            printf("Podaj nazwisko nowej osoby.\n");
            scanf("%s",&(wsk->nazwisko));

            int k1;
            for(int i=0;;i++)
                {
                printf("Podaj %d numer telefonu nowej osoby, jesli podales juz wszystkie numery, wpisz 0 zamiast numeru i zatwierdz.\n",i+1);
                scanf("%d",&k1);
                if(k1==0) break;
                else (wsk->numery)[i]=k1;
                }


            break;
        }
    else
        {
        if(wartosc<(wsk->klucz))
            {
            wsk=wsk->lewy;
            }

        else if(wartosc>(wsk->klucz))
            {
            wsk=wsk->prawy;
            }
        else printf("Osoba o danym kluczu jest juz w ksiazce!\n");

        }

    }

}

struct osoba* najmniejszy(struct osoba *head)
{
if(head->lewy != NULL)
    {
    return najmniejszy(head->lewy);
    }
else
    {
    return head;
    }
}

struct osoba* najwiekszy(struct osoba *head)
{
if(head->prawy != NULL)
    {
    return najwiekszy(head->prawy);
    }
else
    {
    return head;
    }
}

int ilosc_osob(struct osoba *head)
{


if(head==NULL)
  {
    return 0;
  }
  else
  {
    if((head->lewy==NULL) && (head->prawy==NULL))
    {
      return 1;
    }
    else
    {
      return (1+ilosc_osob(head->lewy)+ilosc_osob(head->prawy));
    }
  }

}



int wysokosc_drzewa(struct osoba *head)

{
    int lewo, prawo;
    if ( head != NULL )
    {
        lewo = wysokosc_drzewa(head->lewy);
        prawo = wysokosc_drzewa(head->prawy);
        return(1 + (lewo > prawo ? lewo : prawo));
    }
    else
        return 0;
}



void In_Order(struct osoba *head)
{
if(head->lewy != NULL)
In_Order(head->lewy);

printf("%d\n", head->klucz);
fputs(head->imie, stdout);
printf("\n");
fputs(head->nazwisko, stdout);
printf("\n");
for(int i=0;;i++)
    {
    if((head->numery)[i]=='\0') break;
    printf("Numer telefonu o numerze %d to %d\n",i+1,(head->numery)[i]);
    }
if(head->prawy != NULL)
In_Order(head->prawy);
}


struct osoba *konkretny(struct osoba *head, int wartosc)
{
    if(wartosc<(head->klucz)  && head->lewy != NULL)
        {
        return konkretny(head->lewy,wartosc);
        }
    else if(wartosc>(head->klucz)  && head->prawy != NULL)
        {
        return konkretny(head->prawy,wartosc);
        }
    else
        {
        return head;
        }
    return NULL;
}




int main()
{
int liczba;
struct osoba *korzen=NULL;
struct osoba *wskaznik;

char c;
while(c=getchar() && c!='8')
{


printf("Co chcialbys zrobic ze swoim zyciem?\n");
printf("Wybierz 1, jesli chcesz dodac osobe.\n");
printf("Wybierz 2, jesli chcesz przejsc po drzewie InOrder.\n");
printf("Wybierz 3, jesli chcesz znalezc osobe o najmniejszym kluczu.\n");
printf("Wybierz 4, jesli chcesz znalezc osobe o najwiekszym kluczu.\n");
printf("Wybierz 5, jesli chcesz znalezc liczbe osob w drzewie.\n");
printf("Wybierz 6, jesli chcesz znalezc konkretny klucz w drzewie.\n");
printf("Wybierz 7, jesli chcesz znalezc wysokosc drzewa.\n");
printf("Wybierz 8, jesli chcesz zakonczyc przygode.\n");

getchar();


switch(c)
            {
            case('1'):
            dodaj(korzen);
            break;

            case('2'):
            In_Order(korzen);
            break;

            case('3'):
            wskaznik=najmniejszy(korzen);
            printf("Osoba o najmniejszym kluczu to : \n");
            printf("%s\n",wskaznik->imie);
            printf("%s\n",wskaznik->nazwisko);
            for(int i=0;;i++)
            {
                if(wskaznik->numery[i]=='\0') break;
                else printf(" %d\n",wskaznik->numery[i]);
            }
            break;

            case('4'):
            wskaznik=najwiekszy(korzen);
            printf(" Osoba o najwiekszym kluczu to : \n");
            printf(" %s\n",wskaznik->imie);
            printf(" %s\n",wskaznik->nazwisko);
            for(int i=0;;i++)
            {
                if(wskaznik->numery[i]=='\0') break;
                else printf("%d\n",wskaznik->numery[i]);
            }
            break;

            case('5'):
            printf(" Liczba osob w drzewie to %d. \n", ilosc_osob(korzen));
            break;

            case('6'):
            printf("Podaj klucz ktorego szukasz.\n");
            scanf("%d", &liczba);
            wskaznik=konkretny(korzen, liczba);
            printf(" Osoba o konkretnym kluczu to : \n");
            printf(" %s\n",wskaznik->imie);
            printf(" %s\n",wskaznik->nazwisko);
            for(int i=0;;i++)
            {
                if(wskaznik->numery[i]=='\0') break;
                else printf("%d\n",wskaznik->numery[i]);
            }
            break;

            case('7'):
            printf(" Wysokosc drzewa to %d. \n", wysokosc_drzewa(korzen));
            break;

            }

}




return 0;
}

0

wkleiłem to do mojego ide, nic się nie crashuje ponieważ masz spapranego switcha; zobacz co łapiesz w case'ach, a co powinieneś łapać

edit:

popracuj coś nad tym projektem , bo widać jakbyś w ogóle nie kumał co w nim się dzieje

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