catalin_stefann11

AVL

Jul 1st, 2019
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.35 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "malloc.h"
  3. #include "string.h"
  4.  
  5. using namespace std;
  6.  
  7.  
  8. struct Produse {
  9.     char* denumire;
  10.     int cantitate;
  11.     char* unitate_de_masura;
  12. };
  13.  
  14. struct Comanda
  15. {
  16.     int id_comanda;
  17.     char* denumire_client;
  18.     int numar_produse_comanda;
  19.     Produse** vector_produse_comandate;
  20.     char* data_livrare;
  21.  
  22. };
  23.  
  24.  
  25. struct BST
  26. {
  27.     Comanda* info;
  28.     BST* left;
  29.     BST* right;
  30.     int GE;
  31.    
  32. };
  33.  
  34.  
  35. Produse* creareProdus(char* den, int cant, char* um)
  36. {
  37.     Produse* newProdus = (Produse*)malloc(sizeof(Produse));
  38.     newProdus->cantitate = cant;
  39.     newProdus->denumire = (char*)malloc(strlen(den) + 1);
  40.     newProdus->unitate_de_masura = (char*)malloc(strlen(um) + 1);
  41.     strcpy(newProdus->denumire, den);
  42.     strcpy(newProdus->unitate_de_masura, um);
  43.     return newProdus;
  44. }
  45.  
  46. Comanda* creareComanda(int id, char* den, int nr_prod,
  47.     Produse** vector, char*data)
  48. {
  49.     Comanda* newComanda = (Comanda*)malloc(sizeof(Comanda));
  50.     newComanda->id_comanda = id;
  51.     newComanda->numar_produse_comanda = nr_prod;
  52.     newComanda->vector_produse_comandate = (Produse**)malloc(sizeof(Produse*)*nr_prod);
  53.     for (int i = 0; i < nr_prod; i++)
  54.     {
  55.         newComanda->vector_produse_comandate[i] = (Produse*)malloc(sizeof(Produse));
  56.         newComanda->vector_produse_comandate[i] = vector[i];
  57.     }
  58.     newComanda->data_livrare = (char*)malloc(strlen(data) + 1);
  59.    
  60.     newComanda->denumire_client = (char*)malloc(strlen(den) + 1);
  61.     strcpy(newComanda->data_livrare, data);
  62.     strcpy(newComanda->denumire_client, den);
  63.  
  64.     return newComanda;
  65. }
  66.  
  67. BST* creareNod(Comanda* c)
  68. {
  69.     BST* nod = (BST*)malloc(sizeof(BST));
  70.     nod->info = creareComanda(c->id_comanda, c->denumire_client,
  71.         c->numar_produse_comanda, c->vector_produse_comandate, c->data_livrare);
  72.     nod->right = nod->left = NULL;
  73.     return nod;
  74.  
  75. }
  76.  
  77.  
  78.  
  79.  
  80. int calculInaltime(BST* root) {
  81.  
  82.     if (root) {
  83.  
  84.         int hsleft = calculInaltime(root->left);
  85.         int hsright = calculInaltime(root->right);
  86.         return 1 + (hsleft - hsright ? hsleft : hsright);
  87.     }
  88.     else {
  89.         return 0;
  90.     }
  91. }
  92.  
  93. int calculGE(BST* root)
  94. {
  95.     int hsleft = 0, hsright = 0;
  96.     if (root->right != NULL)
  97.         hsright = calculInaltime(root->right);
  98.     if (root->left != NULL)
  99.         hsleft = calculInaltime(root->left);
  100.     return hsright - hsleft;
  101. }
  102.  
  103.  
  104. BST* RotireDreapta(BST* pivot) {
  105.  
  106.     BST* desc = pivot->left;
  107.     pivot->left = desc->right;
  108.     desc->right = pivot;
  109.     pivot = desc;
  110.     return pivot;
  111. }
  112.  
  113. BST* RotireStanga(BST* pivot) {
  114.    
  115.     BST* desc = pivot->right;
  116.     pivot->right = desc->left;
  117.     desc->left = pivot;
  118.     pivot = desc;
  119.     return pivot;
  120.  
  121. }
  122.  
  123.  
  124. BST* reechilibrare(BST* root) {
  125.  
  126.     root->GE = calculGE(root);
  127.     if (root->GE == 2) {
  128.        
  129.         BST* desc = root->right;
  130.         if (desc->GE == 1)
  131.         {
  132.             //simpla rotire la stanga in pivot
  133.             root = RotireStanga(root);
  134.         }
  135.         else
  136.         {
  137.             //simpla rotire la dr in desc
  138.             root->right = RotireDreapta(desc);
  139.             //simpla rotire la stg in pivot
  140.             root = RotireStanga(root);
  141.         }
  142.     }
  143.     else if (root->GE == -2)
  144.     {
  145.         BST* desc = root->left;
  146.         if (desc->GE == -1) {
  147.             root = RotireDreapta(root);
  148.         }
  149.         else {
  150.  
  151.             //simpla rotire la dr in desc
  152.             root->left = RotireStanga(desc);
  153.             //simpla rotire la stanga in pivot
  154.             root = RotireDreapta(root);
  155.  
  156.         }
  157.     }
  158.     return root;
  159. }
  160.  
  161. void inserareNod(BST*& radacina, BST* nod)
  162. {
  163.     if (radacina == NULL)
  164.     {
  165.         radacina = nod;
  166.     }
  167.     else
  168.     {
  169.         if (radacina->info->id_comanda < nod->info->id_comanda)
  170.             inserareNod(radacina->left, nod);
  171.         else
  172.             if (radacina->info->id_comanda > nod->info->id_comanda)
  173.                 inserareNod(radacina->right, nod);
  174.             else
  175.                 printf("Cheie existenta");
  176.     }
  177.     radacina = reechilibrare(radacina);
  178.  
  179. }
  180.  
  181. void creareArboreBinarCautare(BST** radacina, FILE* fisier)
  182. {
  183.     int id_comanda;
  184.     char nume[20];
  185.     int nr_produse;
  186.     char data[20];
  187.     char nume_produs[15];
  188.     int cantitate;
  189.     char unitate_masura[3];
  190.     fscanf(fisier, "%d", &id_comanda);
  191.     while (!feof(fisier))
  192.     {
  193.         Produse** vector_produse = NULL;
  194.         fscanf(fisier, "%s", &nume);
  195.         fscanf(fisier, "%d", &nr_produse);
  196.         vector_produse = (Produse**)malloc(sizeof(Produse*)*nr_produse);
  197.         fscanf(fisier, "%s", &data);
  198.         for (int i = 0; i < nr_produse; i++)
  199.         {
  200.             vector_produse[i] = (Produse*)malloc(sizeof(Produse));
  201.             fscanf(fisier, "%s", &nume_produs);
  202.             fscanf(fisier, "%d", &cantitate);
  203.             fscanf(fisier, "%s", &unitate_masura);
  204.             Produse* p = creareProdus(nume_produs, cantitate, unitate_masura);
  205.             vector_produse[i] = p;
  206.         }
  207.         Comanda* c = creareComanda(id_comanda, nume, nr_produse, vector_produse, data);
  208.         BST* nod = creareNod(c);
  209.         inserareNod(*radacina, nod);
  210.         fscanf(fisier, "%d", &id_comanda);
  211.     }
  212. }
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219. void afisareStructuraInOrdine(BST* radacina)
  220. {
  221.     if (radacina)
  222.     {
  223.         afisareStructuraInOrdine(radacina->left);
  224.         printf("%d\n",radacina->info->id_comanda);
  225.        
  226.         afisareStructuraInOrdine(radacina->right);
  227.     }
  228. }
  229.  
  230. int* IntoareUnVector(BST* radacina, char* data,int &i, int* vector2)
  231. {
  232.    
  233.     int vector[5];
  234.    
  235.     if (radacina) {
  236.         if (strcmp(radacina->info->data_livrare, data) == 0)
  237.         {
  238.             vector[i] = radacina->info->id_comanda;
  239.  
  240.             vector2[i] = vector[i];
  241.             i++;
  242.         }
  243.             IntoareUnVector(radacina->left, data ,i,vector2);
  244.             IntoareUnVector(radacina->right, data,i,vector2);
  245.         }
  246.        
  247.          
  248.    
  249.     return vector2;
  250.    
  251. }
  252.  
  253.  
  254. int NumarNoduriFrunza(BST* radacina, char* nume_client,int &numar)
  255. {  
  256.     if (radacina)
  257.     {
  258.         if(radacina->left==NULL&&radacina->right==NULL)
  259.             if (strcmp(radacina->info->denumire_client, nume_client)==0)
  260.             {
  261.                 numar++;
  262.             }
  263.         NumarNoduriFrunza(radacina->left, nume_client, numar);
  264.         NumarNoduriFrunza(radacina->right, nume_client, numar);
  265.     }
  266.     return numar;
  267. }
  268.  
  269.  
  270. void AfisarePeNiveleFrumos(BST* radacina, int nivel)
  271. {
  272.     if (radacina)
  273.     {
  274.         for (int i = 0; i < nivel; i++)
  275.         {
  276.             printf("\t");
  277.            
  278.         }
  279.        
  280.         printf("%d\n", radacina->info->id_comanda);
  281.        
  282.        
  283.         AfisarePeNiveleFrumos(radacina->left, nivel + 1);
  284.        
  285.        
  286.         AfisarePeNiveleFrumos(radacina->right, nivel + 1);
  287.     }
  288.     else
  289.     {
  290.         for (int i = 0; i < nivel; i++)
  291.         {
  292.             printf("\t");
  293.  
  294.         }
  295.         printf("NULL\n");
  296.  
  297.     }
  298.    
  299. }
  300.  
  301.  
  302. void ModificaProduseComandate(BST** radacina,int numar_produse, char** denumiri, int* cantitati, char** unitati_masura,int id_comanda)
  303. {
  304.     if ((*radacina))
  305.     {
  306.         if ((*radacina)->info->id_comanda == id_comanda)
  307.         {
  308.             free((*radacina)->info->vector_produse_comandate);
  309.             (*radacina)->info->vector_produse_comandate = (Produse**)malloc(sizeof(Produse*)*numar_produse);
  310.             (*radacina)->info->numar_produse_comanda = numar_produse;
  311.  
  312.             for (int i = 0; i < numar_produse; i++)
  313.             {
  314.                 (*radacina)->info->vector_produse_comandate[i] = (Produse*)malloc(sizeof(Produse));
  315.                 (*radacina)->info->vector_produse_comandate[i]->cantitate = cantitati[i];
  316.                 (*radacina)->info->vector_produse_comandate[i]->denumire = (char*)malloc(sizeof(strlen(denumiri[i] + 1)));
  317.                 (*radacina)->info->vector_produse_comandate[i]->unitate_de_masura = (char*)malloc(sizeof(strlen(unitati_masura[i] + 1)));
  318.                 strcpy((*radacina)->info->vector_produse_comandate[i]->denumire, denumiri[i]);
  319.                 strcpy((*radacina)->info->vector_produse_comandate[i]->unitate_de_masura, unitati_masura[i]);
  320.  
  321.  
  322.             }
  323.  
  324.         }
  325.  
  326.         ModificaProduseComandate(&(*radacina)->right, numar_produse, denumiri, cantitati, unitati_masura, id_comanda);
  327.         ModificaProduseComandate(&(*radacina)->left, numar_produse, denumiri, cantitati, unitati_masura, id_comanda);
  328.  
  329.     }
  330. }
  331.  
  332.  
  333.  
  334.  
  335. void main()
  336. {
  337.     BST* radacina = NULL;
  338.     FILE* fisier = fopen("Date.txt", "r");
  339.     char buffer[20];
  340.    
  341.     creareArboreBinarCautare(&radacina, fisier);
  342.     printf("Afisare structura \n");
  343.     //afisareStructuraInOrdine(radacina);
  344.     char data[20] = "15.06.2019";
  345.     int i = 0;
  346.     int* vector2=NULL;
  347.     vector2 = (int*)malloc(sizeof(int) * 5);
  348.     vector2 = IntoareUnVector(radacina,data,i,vector2);
  349.     if (i==0)
  350.         printf("nu exista nicio comanda care sa corespunda");
  351.     else
  352.  
  353.         for (int j = 0; j < i; j++)
  354.             printf("vectorul cu id comenzi : vector[%d]= %d\n", j,vector2[j]);
  355.  
  356.     char nume[20] = "Mihai";
  357.     int numar = 0;
  358.     numar = NumarNoduriFrunza(radacina, nume, numar);
  359.     printf("Numarul de frunze cu numele Mihai%d\n", numar);
  360.    
  361.     printf("=====AFISARE PE NIVELE======\n");
  362.     AfisarePeNiveleFrumos(radacina, 0);
  363.  
  364.     char* denumiri[10] = { "Pepene","Morcov" };
  365.     char* unitati_de_masura[10] = { "kg","kg" };
  366.     int numar_produse = 2;
  367.     int cantitati[2] = { 333,333 };
  368.  
  369.     ModificaProduseComandate(&radacina, numar_produse, denumiri, cantitati, unitati_de_masura, 2);
  370.  
  371.     afisareStructuraInOrdine(radacina);
  372.  
  373.  
  374.  
  375.  
  376. }
Add Comment
Please, Sign In to add comment