Advertisement
Guest User

Untitled

a guest
Jun 2nd, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int rodzic(int i);
  5. int lewy(int i);
  6. int prawy(int i);
  7. int *kopiec_wstaw(int *A, int key, int *kopiec_rozmiar);
  8. void kopiec_drukuj(int *A, int kopiec_rozmiar);
  9. int *kopiec_przywroc(int *A, int kopiec_rozmiar, int i);
  10. int *kopiec_usun_max(int *A, int *kopiec_rozmiar);
  11.  
  12. int main()
  13. {
  14. int *A;
  15. char z = ' ';
  16. int key = 0;
  17. int kopiec_rozmiar = 0;
  18. A = NULL;
  19.  
  20. while(1)
  21. {
  22. printf("Wybierz opcje:");
  23. printf("\nw - wstaw");
  24. printf("\nd - drukuj");
  25. printf("\nu - usun\n\n");
  26.  
  27. fflush(stdin);
  28. z = getchar();
  29.  
  30. switch(z)
  31. {
  32. case 'w':
  33. {
  34. printf("\nPodaj wartosc: ");
  35. fflush(stdin);
  36. scanf("%d", &key);
  37. A = kopiec_wstaw(A, key, &kopiec_rozmiar);
  38. printf("\n");
  39. break;
  40. }
  41. case 'd':
  42. {
  43. kopiec_drukuj(A, kopiec_rozmiar);
  44. printf("\n");
  45. printf("\n");
  46. break;
  47. }
  48. case 'u':
  49. {
  50. A = kopiec_usun_max(A, &kopiec_rozmiar);
  51. printf("\n");
  52. break;
  53. }
  54. }
  55. }
  56. return 0;
  57. }
  58.  
  59. int rodzic(int i)
  60. {
  61.  
  62. return (i-1) /2;
  63. }
  64.  
  65. int lewy(int i)
  66. {
  67. return (2 * i) + 1;
  68. }
  69.  
  70. int prawy(int i)
  71. {
  72. return (2 * i) + 2;
  73. }
  74.  
  75. int *kopiec_wstaw(int *A, int key, int *kopiec_rozmiar)
  76. {
  77. int i = 0;
  78.  
  79. *kopiec_rozmiar += 1;
  80.  
  81. if(*kopiec_rozmiar == 1)
  82. A = (int *) malloc(sizeof(int));
  83. else
  84. A = (int*) realloc(A, *kopiec_rozmiar * sizeof(int));
  85. i = *kopiec_rozmiar - 1;
  86.  
  87. while (i > 0 && A[rodzic(i)] < key)
  88. {
  89. A[i] = A[rodzic(i)];
  90. i = rodzic(i);
  91. }
  92.  
  93. A[i] = key;
  94.  
  95. return A;
  96. }
  97.  
  98. int *kopiec_przywroc(int *A, int kopiec_rozmiar, int i)
  99. {
  100. int l, r, max, temp;
  101.  
  102. l = lewy(i);
  103. r = prawy(i);
  104. if (l <= kopiec_rozmiar - 1 && A[l] > A[i])
  105. max = l;
  106. else max = i;
  107.  
  108. if(r <= kopiec_rozmiar - 1 && A[r] > A[max])
  109. max = r;
  110. if(max != i)
  111. {
  112. temp = A[i];
  113. A[i] = A[max];
  114. A[max] = temp;
  115. A = kopiec_przywroc(A, kopiec_rozmiar, max);
  116. }
  117. }
  118.  
  119. int *kopiec_usun_max(int *A, int *kopiec_rozmiar)
  120. {
  121. int max;
  122.  
  123. if(*kopiec_rozmiar < 1) printf("\nKopiec pusty.");
  124. else
  125. {
  126. max = A[0];
  127. A[0] = A[*kopiec_rozmiar-1];
  128. *kopiec_rozmiar -= 1;
  129. kopiec_przywroc(A, *kopiec_rozmiar, 0);
  130. }
  131. return A;
  132. }
  133.  
  134. void kopiec_drukuj(int *A, int kopiec_rozmiar)
  135. {
  136. int i;
  137.  
  138. printf("\n");
  139. for (i=0; i < kopiec_rozmiar; i++)
  140. {
  141. printf("%d, ",A[i]);
  142. }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement