Advertisement
Guest User

coach

a guest
Oct 18th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int* InterpolationSearch(int *arrkey, int *arrvalid, int duzina, int x) {
  5.  
  6. int start, end, pos, r;
  7. start = 0; end = duzina - 1;
  8.  
  9. while (start <= end && x >= arrkey[start] && x <= arrkey[end]) {
  10. if ((x - arrkey[start]) !=0) {
  11. pos = start + (((end - start) / (arrkey[end] - arrkey[start])*(x - arrkey[start])));
  12. }
  13. else { pos = start; }
  14. if ((arrkey[pos] == x) && (arrvalid[pos] == 1)) { return pos; }
  15. else if ((arrkey[pos] == x) && (arrvalid[pos] == 0)) {
  16. for (r = pos - 1; ; r--) {
  17. if ((arrkey[r] == x) && (arrvalid[r] == 1)) { return r; }
  18. }
  19. }
  20. else if (x > arrkey[pos]) start = pos + 1;
  21. else end = pos - 1;
  22. }
  23. return -1;
  24. }
  25.  
  26. int* InterpolationSearchM(int *arrkey, int *arrvalid, int duzina, int y) {
  27.  
  28. int start, end, pos=0, r, max;
  29. start = 0; end = duzina - 1;
  30. max = end;
  31. while (start <= end && y >= arrkey[start] && y <= arrkey[end]) {
  32.  
  33. pos = start + (((end - start) / (arrkey[end] - arrkey[start])*(y - arrkey[start])));
  34. if ((arrkey[pos] == y) && (arrvalid[pos] == 1)) { return pos; }
  35. else if ((arrkey[pos] == y) && (arrvalid[pos] == 0)) {
  36. for (r = pos - 1; ; r--) {
  37. if ((arrkey[r] == y) && (arrvalid[r] == 1)) { return r; }
  38. }
  39. }
  40. else if (y > arrkey[pos]) start = pos + 1;
  41. else end = pos - 1;
  42. }
  43. if (y < arrkey[0]) { return pos = 0; }
  44. else if (y > arrkey[max]) { return pos = max; }
  45. else { return pos; }
  46. }
  47.  
  48. int FreeLocation(int *arrvalid, int duzina, int npos) {
  49.  
  50. for (int i = npos; i < duzina; i++) if (arrvalid[i] == 0) return 1;
  51. return 0;
  52. }
  53.  
  54. int* InsertKey(int *arrkey, int *arrvalid, int duzina, int y) {
  55.  
  56. int npos, p = 0, z, o;
  57. if (InterpolationSearch(arrkey, arrvalid, duzina, y) != -1) {
  58. printf("\nKljuc koji zelimo da umetnemo postoji ");
  59. return arrkey, arrvalid;
  60. }
  61. else {
  62. npos = InterpolationSearchM(arrkey, arrvalid, duzina, y);
  63. if (arrvalid[npos] == 1) {
  64. if (FreeLocation(arrvalid, duzina, npos) == 1) {
  65. int t, i;
  66. t = npos;
  67. if (y < arrkey[npos]) {
  68. npos += 1;
  69. while (arrvalid[npos] == 1) {
  70. npos++;
  71. }
  72. for (i = npos; i >= t; i--) {
  73. arrkey[i] = arrkey[i - 1];
  74. arrvalid[i] = arrvalid[i - 1];
  75. }
  76. }
  77. else {
  78.  
  79. npos -= 1;
  80. while (arrvalid[npos] == 1) {
  81. npos--;
  82. }
  83. for (i = npos; i<=t; i++) {
  84. arrkey[i] = arrkey[i + 1];
  85. arrvalid[i] = arrvalid[i + 1];
  86. }
  87. }
  88. arrkey[t] = y;
  89. arrvalid[t] = 1;
  90. printf("\nNpvi niz elemenata je: ");
  91. for (i = 0; i < duzina; i++) {
  92. printf("%d ", arrkey[i]);
  93. }
  94. printf("\nNovi niz elemenata je: ");
  95. for (i = 0; i < duzina; i++) {
  96. printf("%d ", arrvalid[i]);
  97. }
  98. return arrkey, arrvalid;
  99. }
  100. else {
  101. int duzina2, j = 0, j2 = 0, l, brj = 0, k = 0, i, u, t; duzina2 = 2 * (duzina+1);
  102. for (l = 0; l < duzina; l++) {
  103. if (arrvalid[l] == 1) brj++;
  104. }
  105. brj += 1;
  106. int *niz = calloc(brj, sizeof(int));
  107. for (l = 0; l < (duzina+1); l++) {
  108. if (arrvalid[l] == 1) {
  109. niz[j] = arrkey[l];
  110. j++;
  111. }
  112. if ((brj-1) == l) { niz[j] = y; }
  113. }
  114.  
  115. for (i = 0; i < brj - 1; i++)
  116. for (u = i + 1; u < brj; u++)
  117. if (niz[i] > niz[u]) {
  118. t = niz[i];
  119. niz[i] = niz[u];
  120. niz[u] = t;
  121. }
  122.  
  123. arrkey = realloc(arrkey, duzina2 * sizeof(int));
  124. arrvalid = realloc(arrvalid, duzina2 * sizeof(int));
  125.  
  126. int fu = duzina2 / brj;
  127. for (j = 0; j < brj; j++) {
  128. int br1 = 0;
  129. while (br1 < fu) {
  130. arrkey[k] = niz[j];
  131. br1++;
  132. k++;
  133. }
  134. }
  135. printf("\nNiz elemenata je: ");
  136. for (i = 0; i < duzina2; i++) {
  137. printf("%d ", arrkey[i]);
  138. }
  139. for (i = 0; i < brj; i++) {
  140. int br2 = 0;
  141. arrvalid[j2] = 1;
  142. while (br2 < fu) {
  143. j2++;
  144. arrvalid[j2] = 0;
  145. br2++;
  146. }
  147. }
  148. printf("\nNiz elemenata je: ");
  149. for (i = 0; i < duzina2; i++) {
  150. printf("%d ", arrvalid[i]);
  151. }
  152. return arrkey, arrvalid, duzina2;
  153. }
  154. }
  155. else {
  156. o = npos;
  157. while (arrvalid[--o] == 0) {
  158. p++;
  159. }
  160. p = p / 2;
  161. z = npos - p;
  162. arrkey[z] = y;
  163. arrvalid[z] = 1;
  164. z += 1;
  165. while (arrvalid[z] == 0) {
  166. arrkey[z] = y;
  167. arrvalid[z] = 0;
  168. z += 1;
  169. }
  170. printf("\nNpvi niz elemenata je: ");
  171. for (int i = 0; i < duzina; i++) {
  172. printf("%d ", arrkey[i]);
  173. }
  174. printf("\nNovi niz elemenata je: ");
  175. for (int i = 0; i < duzina; i++) {
  176. printf("%d ", arrvalid[i]);
  177. }
  178. return arrkey, arrvalid;
  179. }
  180. }
  181.  
  182. }
  183.  
  184.  
  185.  
  186. void Delete(int *arrkey, int *arrvalid, int duzina, int e) {
  187.  
  188. int npos, p = 0, z, o;
  189. if (InterpolationSearch(arrkey, arrvalid, duzina, e) == -1) {
  190. printf("\nKljuc koji zelimo da obrisemo ne postoji ");
  191. return arrkey, arrvalid;
  192. }
  193. else {
  194. npos = InterpolationSearch(arrkey, arrvalid, duzina, e);
  195. if (npos == 0) {
  196. arrvalid[npos] = 0;
  197. npos += 1;
  198. while (arrvalid[npos] == 0) {
  199. npos++;
  200. }
  201. int d = arrkey[npos];
  202. npos -= 1;
  203. while (arrvalid[npos] == 0) {
  204. arrkey[npos] = d;
  205. npos--;
  206. }
  207. }
  208. else {
  209. arrvalid[npos] = 0;
  210. int t = npos, k;
  211. npos -= 1;
  212. k = arrkey[npos];
  213.  
  214. while (arrvalid[t] == 0) {
  215. arrkey[t] = k;
  216. t++;
  217. }
  218. }
  219. }
  220. return arrkey, arrvalid;
  221. }
  222.  
  223. int main() {
  224.  
  225. int *niz, i, j = 0, n, fu, k = 0, index, x, t, u, y, nkey, izbor, e;
  226.  
  227. while (1) {
  228. printf("\n1. Inicijalno formiranje povecane tabele\n"
  229. "2. Pretraga elementa\n"
  230. "3. Ubacivanje elementa\n"
  231. "4. Brisanje elementa\n"
  232. );
  233. scanf("%d", &izbor);
  234.  
  235. switch (izbor) {
  236.  
  237. case 1: printf("Duzina niza je: ");
  238. scanf("%d", &n);
  239.  
  240. niz = calloc(n, sizeof(int));
  241. if (niz == NULL) {
  242. printf("Greska u alokaciji!\n");
  243. exit(1);
  244. }
  245.  
  246. printf("Faktor uvecanja je: ");
  247. scanf("%d", &fu);
  248. printf("Niz elemenata je: ");
  249. for (i = 0; i < n; i++) {
  250. scanf("%d", &niz[i]);
  251. }
  252. printf("Niz elemenata je: \n");
  253. for (i = 0; i < n; i++) {
  254. printf("%d ", niz[i]);
  255. }
  256.  
  257. for (i = 0; i < n - 1; i++)
  258. for (u = i + 1; u < n; u++)
  259. if (niz[i] > niz[u]) {
  260. t = niz[i];
  261. niz[i] = niz[u];
  262. niz[u] = t;
  263. }
  264.  
  265. printf("\nSortirani niz elemenata je: ");
  266. for (i = 0; i < n; i++) {
  267. printf("%d ", niz[i]);
  268. }
  269.  
  270. int duzina;
  271. duzina = n * fu;
  272. int *arrkey, *arrvalid;
  273.  
  274. arrkey = calloc(n * fu, sizeof(int));
  275. if (arrkey == NULL) {
  276. printf("Greska u alokaciji!\n");
  277. exit(1);
  278. }
  279.  
  280. for (i = 0; i < n; i++) {
  281. int br1 = 0;
  282. while (br1 < fu) {
  283. arrkey[k] = niz[i];
  284. br1++;
  285. k++;
  286. }
  287. }
  288. printf("\nNiz elemenata je: ");
  289. for (i = 0; i < duzina; i++) {
  290. printf("%d ", arrkey[i]);
  291. }
  292.  
  293. arrvalid = calloc(n * fu, sizeof(int));
  294. if (arrvalid == NULL) {
  295. printf("Greska u alokaciji!\n");
  296. exit(1);
  297. }
  298.  
  299. for (i = 0; i < n; i++) {
  300. int br2 = 0;
  301. arrvalid[j] = 1;
  302. while (br2 < fu) {
  303. j++;
  304. br2++;
  305. }
  306. }
  307. printf("\nNiz elemenata je: ");
  308. for (i = 0; i < duzina; i++) {
  309. printf("%d ", arrvalid[i]);
  310. }
  311. break;
  312. case 2:printf("\nPotrebno je naci element: ");
  313. scanf("%d", &x);
  314. index = InterpolationSearch(arrkey, arrvalid, duzina, x);
  315.  
  316. printf("Element je na poziciji: %d", index);
  317. break;
  318. case 3: printf("\nElement koji zelimo da umetnemo: ");
  319. scanf("%d", &y);
  320. nkey = InsertKey(arrkey, arrvalid, duzina, y);
  321. /* printf("\nNpvi niz elemenata je: ");
  322. for (i = 0; i < duzina; i++) {
  323. printf("%d ", arrkey[i]);
  324. }
  325. printf("\nNovi niz elemenata je: ");
  326. for (i = 0; i < duzina; i++) {
  327. printf("%d ", arrvalid[i]);
  328. }*/
  329. break;
  330. case 4: printf("\nElement koji zelimo da obrisemo: ");
  331. scanf("%d", &e);
  332. Delete(arrkey, arrvalid, duzina, e);
  333. printf("\nNpvi niz elemenata je: ");
  334. for (i = 0; i < duzina; i++) {
  335. printf("%d ", arrkey[i]);
  336. }
  337. printf("\nNovi niz elemenata je: ");
  338. for (i = 0; i < duzina; i++) {
  339. printf("%d ", arrvalid[i]);
  340. }
  341. break;
  342.  
  343. }
  344. }
  345. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement