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;
}