Advertisement
mkurtagic

Untitled

Apr 18th, 2015
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <new>
  4.  
  5. using namespace std;
  6. //pravim matricu koristeci fragmentirani postupak alokacije
  7. template<typename tip>
  8. tip **Fragmentirana(tip broj_redova, tip broj_kolona)
  9. {
  10. tip **p = new tip*[broj_redova]; //pokazivac na niz pokazivaca
  11. for(int i = 0; i < broj_redova; i++)
  12. p[i] = nullptr;
  13.  
  14. try
  15. {
  16. for(int i = 0; i < broj_redova; i++)
  17. {
  18. p[i] = new tip[broj_kolona]; //svakom pokazivacu unutar niza dodjeljujem niz na koji ce pokazivati, to su kolone
  19. }
  20. }
  21. catch(bad_alloc)
  22. {
  23. for(int i = 0; i < broj_redova; i++) //ako alokacija ne uspije, obrisi sta si dosad zauzeo (kolone)
  24. delete[] p[i];
  25. delete[] p; //obrisi i niz pokazivaca
  26. throw bad_alloc(); //baci izuzetak
  27. }
  28.  
  29. return p;
  30. }
  31.  
  32. template<typename tip>
  33. tip **Kontinualna(tip **matrica, tip broj_redova, tip broj_kolona)
  34. {
  35. tip **q = new tip*[broj_redova]; //alociraj jedan veliki blok memorije, jedan niz velicine "broj redova"
  36.  
  37. try
  38. {
  39. q[0] = new tip[broj_kolona*broj_kolona]; //kao prvi element stavi jedan ogroman niz koji ces kasnije parcati na manje nizove
  40. }
  41. catch(bad_alloc)
  42. {
  43. delete[] q; //ako ne uspije, sve sto smo dosad zauzeli je samo ovaj veliki niz, pa njega samo treba i obrisati
  44. throw bad_alloc(); //baci izuzetak
  45. }
  46.  
  47. for(int i = 1; i < broj_redova; i++)
  48. {
  49. q[i] = q[i-1] + broj_kolona; //ovim parcam onaj ogromni niz na manje podnizove velicine broja kolona, sve kolone su u kontinualnom poretku
  50. }
  51.  
  52. for(int i = 0; i < broj_redova; i++) //prepisujem iz pocetne u novokreiranu
  53. {
  54. for(int j = 0; j < broj_kolona; j++)
  55. {
  56. q[i][j] = matrica[i][j];
  57. }
  58. }
  59.  
  60. for(int i = 0; i < broj_redova; i++) //brisem pocetnu, posto je fragmentirano alocirana, brisem kolone, pa niz pokazivaca
  61. delete[] matrica[i];
  62. delete[] matrica;
  63. matrica = q;
  64.  
  65. return matrica;
  66. }
  67.  
  68. int main()
  69. {
  70. cout << "Unesite broj redova matrice: ";
  71. int broj_redova;
  72. cin >> broj_redova;
  73. cout << "Unesite broj kolona matrice: ";
  74. int broj_kolona;
  75. cin >> broj_kolona;
  76. vector<vector<int>> matrica{{1,2,3}, {2,3,4}, {4,5,6}}; //ovo mi je da ne unosim sa tastature
  77.  
  78. try
  79. {
  80. int** p = Fragmentirana(broj_redova, broj_kolona);
  81. for(int i = 0; i < broj_redova; i++) //prepisujem ovo iz vector<vector<int>> u dinamicki (fragmentirano) alociranu
  82. for(int j = 0; j < broj_kolona; j++)
  83. p[i][j] = matrica[i][j];
  84.  
  85. int **q = Kontinualna(p, broj_redova, broj_kolona); //posto sam p vec gore obrisao, ne moram opet
  86. for(int i = 0; i < broj_redova; i++)
  87. {
  88. for(int j = 0; j < broj_kolona; j++)
  89. cout << q[i][j] << " ";
  90. cout << endl;
  91. }
  92.  
  93. delete[] q; //brisem samo onaj velikacki niz
  94.  
  95. }
  96. catch(bad_alloc)
  97. {
  98. cout << "Alokacija kontinualne nije uspjela";
  99. }
  100. catch(bad_alloc)
  101. {
  102. cout << "Alokacija fragmentirane nije uspjela";
  103. }
  104.  
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement