Advertisement
catalin_stefann11

GRAF

Jul 1st, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.57 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "malloc.h"
  3. #include "string.h"
  4.  
  5.  
  6. struct Fruct
  7.  
  8. {
  9.     char* nume;
  10.     int id;
  11. };
  12.  
  13. struct Nod
  14. {
  15.     Fruct* info;
  16.     Nod* pNext;
  17. };
  18.  
  19.  
  20. struct Graf
  21. {
  22.     Nod** elemente;
  23.     int size;
  24. };
  25.  
  26.  
  27.  
  28. Fruct* creareFructe(int id, char* nume)
  29. {
  30.     Fruct* newFruct = (Fruct*)malloc(sizeof(Fruct));
  31.  
  32.     newFruct->nume = (char*)malloc(strlen(nume) + 1);
  33.     strcpy(newFruct->nume,nume);
  34.     newFruct->id = id;
  35.     return newFruct;
  36. }
  37.  
  38.  
  39. Nod* creareNod(Fruct* info)
  40. {
  41.     Nod* newNod = (Nod*)malloc(sizeof(Nod));
  42.     newNod->info = info;
  43.     newNod->pNext = NULL;
  44.     return newNod;
  45. }
  46.  
  47.  
  48. Graf* initGraf(int size)
  49. {
  50.  
  51.     Graf* graf = (Graf*)malloc(sizeof(Graf));
  52.     graf->elemente = (Nod**)malloc(size * sizeof(Nod*));
  53.     graf->size = size;
  54.     for (int i = 0; i < size; i++)
  55.     {
  56.  
  57.         graf->elemente[i] = NULL;
  58.     }
  59.     return graf;
  60. }
  61.  
  62.  
  63. void adaugareMuchie(Graf** graf, Nod* sursa, Nod* destinatie)
  64. {
  65.     //Nod* sursaDest = (Nod*)malloc(sizeof(Nod));
  66.     Nod* sursaDest = (Nod*)malloc(sizeof(Nod));
  67.     sursaDest->info = destinatie->info;
  68.     sursaDest->pNext = NULL;
  69.     if ((*graf)->elemente[sursa->info->id] == NULL)
  70.         (*graf)->elemente[sursa->info->id] = sursaDest;
  71.     else
  72.     {
  73.         Nod* temp = (*graf)->elemente[sursa->info->id];
  74.         while (temp->pNext)
  75.         {
  76.             temp = temp->pNext;
  77.         }
  78.         temp->pNext = sursaDest;
  79.  
  80.     }
  81.  
  82.    
  83.    
  84.    
  85.     /*sursaDest->info=destinatie->info;
  86.     sursaDest->pNext = (*graf)->elemente[(sursa->info->id)];
  87.     (*graf)->elemente[(sursa->info->id)] = sursaDest;*/
  88.  
  89.  
  90.     Nod* Destsursa = (Nod*)malloc(sizeof(Nod));
  91.     Destsursa->info = sursa->info;
  92.     Destsursa->pNext = NULL;
  93.     if ((*graf)->elemente[destinatie->info->id] == NULL)
  94.         (*graf)->elemente[destinatie->info->id] = Destsursa;
  95.     else
  96.     {
  97.         Nod* temp = (*graf)->elemente[destinatie->info->id];
  98.         while (temp->pNext)
  99.         {
  100.             temp = temp->pNext;
  101.            
  102.         }
  103.         temp->pNext = Destsursa;
  104.  
  105.     }
  106.     //Nod* Destsursa = (Nod*)malloc(sizeof(Nod));//temp2
  107.     //Destsursa->info=sursa->info;
  108.     //Destsursa->pNext = (*graf)->elemente[(destinatie->info->id)];
  109.     //(*graf)->elemente[(destinatie->info->id)] = Destsursa;
  110.  
  111. }
  112.  
  113.  
  114.  
  115. void matriceAdiacenta(Graf* graf, int matrice[5][5])
  116. {
  117.     for (int i = 0; i < 5; i++)
  118.     {
  119.         Nod* temp = graf->elemente[i];
  120.  
  121.         while (temp)
  122.         {
  123.             matrice[i][temp->info->id] = 1;
  124.             temp = temp->pNext;
  125.         }
  126.  
  127.  
  128.     }
  129.  
  130.  
  131. }
  132.  
  133. void printeazaVecini(Graf* graf, int id)
  134. {
  135.  
  136.     for (int i = 0; i < graf->size; i++)
  137.     {
  138.         if (graf->elemente[i])
  139.         {
  140.             if ((i+1) == id)
  141.             {
  142.                 Nod* temp = graf->elemente[i];
  143.  
  144.                 while (temp)
  145.                 {
  146.                     printf("%d ", temp->info->id+1);
  147.                     temp = temp->pNext;
  148.                 }
  149.  
  150.  
  151.                 /*while (graf->elemente[i])
  152.                 {
  153.                     printf("%d ", graf->elemente[i]->info->id + 1);
  154.                     graf->elemente[i] = graf->elemente[i]->pNext;
  155.                    
  156.                 }*/
  157.             }
  158.         }
  159.     }
  160.     printf("\n");
  161. }
  162.  
  163.  
  164. void parcurgerePeLatime(Graf* graf, int nod_start, int matrice[5][5])
  165. {
  166.  
  167.     int pInitial=0;
  168.     int noduri_vizitate=0;
  169.     int vector[5] = { 0,0,0,0,0 };
  170.     vector[nod_start - 1] = 1;
  171.  
  172.     int coada[5];
  173.     coada[0] = nod_start-1;
  174.     while (noduri_vizitate >= pInitial)
  175.     {
  176.         for (int i = 0; i < 5; i++)
  177.         {
  178.             if (matrice[coada[pInitial]][i] == 1 && vector[i] == 0)
  179.             {
  180.                 noduri_vizitate++;
  181.                 coada[noduri_vizitate] = i;
  182.                 vector[i] = 1;
  183.  
  184.             }
  185.            
  186.         }
  187.         printf("%d ", coada[pInitial]+1);
  188.        
  189.         pInitial++;
  190.     }
  191.  
  192.  
  193.     printf("\n");
  194. }
  195.  
  196.  
  197.  
  198. void stergereNodDinVecini(Nod** graf, Nod* nod, int& OK)
  199. {
  200.    
  201.    
  202.         if ((*graf))
  203.         {
  204.             if((*graf)->info)
  205.             if ((*graf)->info->id == nod->info->id)
  206.             {
  207.            
  208.                 Nod* temp = (*graf);
  209.                 (*graf) = (*graf)->pNext;
  210.                 if (OK == 0)
  211.                 {
  212.                     free(temp->info->nume);
  213.                     temp->info = NULL;
  214.                     OK = 1;
  215.                 }
  216.                
  217.             }
  218.  
  219.             else
  220.             {
  221.                 stergereNodDinVecini(&(*graf)->pNext, nod, OK);
  222.             }
  223.         }
  224.    
  225. }
  226.  
  227.  
  228.  
  229. void stergereNod(Graf** graf, Nod* nod, int OK)
  230. {
  231.    
  232.     for (int i = 0; i < (*graf)->size; i++)
  233.     {
  234.        
  235.             if (i == nod->info->id)
  236.             {
  237.                 while ((*graf)->elemente[i])
  238.                 {
  239.  
  240.                     (*graf)->elemente[i] = (*graf)->elemente[i]->pNext;
  241.  
  242.                 }
  243.  
  244.             }
  245.  
  246.             else
  247.             {
  248.                 if ((*graf)->elemente[i])
  249.                 {
  250.                     stergereNodDinVecini(&(*graf)->elemente[i], nod, OK);
  251.                 }
  252.             }
  253.  
  254.  
  255.        
  256.     }
  257.  
  258.  
  259.  
  260. }
  261.  
  262.  
  263. void main()
  264. {
  265.  
  266.  
  267.     Fruct* f1 = creareFructe(0, "para");
  268.     Fruct* f2 = creareFructe(1, "caisa");
  269.     Fruct* f3 = creareFructe(2, "capsuna");
  270.     Fruct* f4 = creareFructe(3, "pepene");
  271.     Fruct* f5 = creareFructe(4, "mar");
  272.  
  273.  
  274.     Nod* n1 = creareNod(f1);
  275.     Nod* n2 = creareNod(f2);
  276.     Nod* n3 = creareNod(f3);
  277.     Nod* n4 = creareNod(f4);
  278.     Nod* n5 = creareNod(f5);
  279.  
  280.  
  281.     Graf* graf = initGraf(5);
  282.  
  283.  
  284.     adaugareMuchie(&graf, n1, n3);
  285.     adaugareMuchie(&graf, n1, n5);
  286.     adaugareMuchie(&graf, n1, n4);
  287.    
  288.     adaugareMuchie(&graf, n3, n5);
  289.     adaugareMuchie(&graf, n4, n3);
  290.  
  291.  
  292.     int matrice[5][5];
  293.     for (int i = 0; i < 5; i++)
  294.  
  295.         for (int j = 0; j < 5; j++)
  296.             matrice[i][j] = 0;
  297.  
  298.  
  299.     matriceAdiacenta(graf, matrice);
  300.  
  301.  
  302.  
  303.     for (int i = 0; i < 5; i++)
  304.     {
  305.         for (int j = 0; j < 5; j++)
  306.             printf("%d ", matrice[i][j]);
  307.         printf("\n");
  308.     }
  309.     printf("\n");
  310.  
  311.     printeazaVecini(graf,5);
  312.     printeazaVecini(graf, 5);
  313.     printeazaVecini(graf, 5);
  314.     printeazaVecini(graf, 4);
  315.  
  316.  
  317.  
  318.  
  319.     parcurgerePeLatime(graf, 1,matrice);
  320.     parcurgerePeLatime(graf, 2, matrice);
  321.     parcurgerePeLatime(graf, 3, matrice);
  322.     parcurgerePeLatime(graf, 4, matrice);
  323.     parcurgerePeLatime(graf, 5, matrice);
  324.  
  325.     int OK = 0;
  326.  
  327.     for (int i = 0; i < 5; i++)
  328.  
  329.         for (int j = 0; j < 5; j++)
  330.             matrice[i][j] = 0;
  331.  
  332.     stergereNod(&graf, n1, OK);
  333.  
  334.     matriceAdiacenta(graf, matrice);
  335.  
  336.     printf("\n");
  337.     for (int i = 0; i < 5; i++)
  338.     {
  339.         for (int j = 0; j < 5; j++)
  340.             printf("%d ", matrice[i][j]);
  341.         printf("\n");
  342.     }
  343.     printf("\n");
  344.  
  345.  
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement