Informatică, întrebare adresată de clickau791, 8 ani în urmă

Pentru elevii dintr-o clasa se reține nume prenume si media generala, sa se organizeze informațiile sunt forma unui ABC (Arbore Binar de Cautare) după criteriul mediei generale.

Răspunsuri la întrebare

Răspuns de Apollyon
3

#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);

   }

}


andrei750238: Foarte bine explicat.
andrei750238: Desi nu ai mai eliberat memoria alocata dinamic
Alte întrebări interesante