Răspuns :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Elev
{
double mediaGenerala;
char *numeElev, *prenumeElev;
};
struct Node
{
struct Elev *elevulDinNod;
struct Node *copilStang, *copilDrept;
};
struct ArboreBinar
{
struct Node *radacinaArborelui;
};
struct Elev *creazaElev(void); // Crează Elevul pe care urmează să-l adăugăm în arbore
void afiseazaElev(struct Elev *elevulPentruAfisat); // Afișează elevul ( pentru a verifica traversarea arborelui )
struct Node *creazaNod(struct Elev *elevulPentruAdaugat); // Crează Nodul
void adaugaEleviInArbore(struct ArboreBinar **arboreBinar); // Funcție ce se ocupă de numărul elevilor pe care vrem să-i adăugăm în arbore
void adaugaInArbore(struct Node **nodulCurent, struct Elev *elevulPentruAdaugat); // Funcția care adaugă elevul în arbore
void afiseazaEleviDinArbore(struct Node *nodulCurent); // Afișează elevul ( traversare inorder )
int main()
{
struct ArboreBinar *arboreBinar = (struct ArboreBinar *)malloc(sizeof(struct ArboreBinar)); // alocăm dinamic un pointer spre un arbore binar
arboreBinar->radacinaArborelui = NULL; // îi setăm rădăcina la NULL ( deoarece arborele este GOL )
adaugaEleviInArbore(&arboreBinar); // apelăm această funcție prima dată ( vezi mai jos ce face )
afiseazaEleviDinArbore(arboreBinar->radacinaArborelui); // Afișează elevii din arbore ( inorder )
return 0;
}
void adaugaEleviInArbore(struct ArboreBinar **arboreBinar)
{
int numarElevi; // numărul de Elevi pe care vrem să-i introducem în arbore
struct Elev *elevulCreat;
printf("Cati elevi vrei sa introduci ? >> ");
scanf("%d", &numarElevi);
for (int i = 0; i < numarElevi; i++)
{
elevulCreat = creazaElev(); // crează elevul
adaugaInArbore(&(*arboreBinar)->radacinaArborelui, elevulCreat); // adaugă elevul în arbore
printf("Elevul %s %s a fost adaugat cu succes !\n", elevulCreat->numeElev, elevulCreat->prenumeElev);
}
}
// Practic introduci de la tastatură numele, prenumele și media generală a elevului, returnează un pointer de tip Elev spre structura creată
struct Elev *creazaElev()
{
char numeElev[50], prenumeElev[50];
double mediaGenerala;
// Pasul 1, citim aici numele, prenumele și media generală
printf("Introdu numele elevului >> ");
scanf("%s", numeElev);
printf("Introdu prenumele elevului >> ");
scanf("%s", prenumeElev);
printf("Introdu media generala a elevului >> ");
scanf("%lf", &mediaGenerala);
// Pasul 2, alocăm dinamic memorie pentru cei 2 pointeri din interiorul structurii Elev și
// copiem ce avem din variabilele de mai sus în interiorul variabilelor din interiorul Elevului
struct Elev *elevulCreat = (struct Elev *)malloc(sizeof(struct Elev));
elevulCreat->numeElev = (char *)malloc(strlen(numeElev) + 1);
strcpy(elevulCreat->numeElev, numeElev);
// la fel și mai jos
elevulCreat->prenumeElev = (char *)malloc(strlen(prenumeElev) + 1);
strcpy(elevulCreat->prenumeElev, prenumeElev);
elevulCreat->mediaGenerala = mediaGenerala;
// la final returnezi elevul creat
return elevulCreat;
}
// Crează un nod și salvează datele elevului în interiorul său
struct Node *creazaNod(struct Elev *elevulPentruAdaugat)
{
struct Node *pentruReturnat = (struct Node *)malloc(sizeof(struct Node));
pentruReturnat->copilStang = NULL;
pentruReturnat->copilDrept = NULL;
pentruReturnat->elevulDinNod = elevulPentruAdaugat;
return pentruReturnat;
}
void adaugaInArbore(struct Node **nodulCurent, struct Elev *elevulPentruAdaugat)
{
if ((*nodulCurent) == NULL) // dacă nodulCurent este NULL practic creăm un nou NOD, nodulCurent va „arăta” spre noul nod creat
(*nodulCurent) = creazaNod(elevulPentruAdaugat);
// dacă media generală din nodul curent e mai mare decât media generală a elevului pe care vrem să-l introducem stocăm elevul în copilul stâng al nodului curent
else if ((*nodulCurent)->elevulDinNod->mediaGenerala > elevulPentruAdaugat->mediaGenerala)
adaugaInArbore(&((*nodulCurent)->copilStang), elevulPentruAdaugat);
// altfel stocăm elevul în copilul drept
else
adaugaInArbore(&((*nodulCurent)->copilDrept), elevulPentruAdaugat);
}
// Efectiv printezi datele elevului
void afiseazaElev(struct Elev *elevulPentruAfisat)
{
printf("Elevul %s %s are media generala %0.2lf\n",
elevulPentruAfisat->numeElev, elevulPentruAfisat->prenumeElev, elevulPentruAfisat->mediaGenerala);
}
// Afișarea INORDER
void afiseazaEleviDinArbore(struct Node *nodulCurent)
{
if (nodulCurent != NULL)
{
afiseazaEleviDinArbore(nodulCurent->copilStang);
afiseazaElev(nodulCurent->elevulDinNod);
afiseazaEleviDinArbore(nodulCurent->copilDrept);
}
}