File: Stare vježbe/vjezbe10/61__malloc_1Dpolja.c

  1. /*
  2.   61__malloc_1Dpolja.c
  3.   Rad s dinamicki alociranim jednodimenzionalnim poljima,
  4.   Uvodjenje funkcije realloc.
  5.   -----
  6.   Prototip funkcije realloc:
  7.   void* realloc(void* memblock, size_t size);
  8.   Pomocu funkcije realloc mozemo realocirati blok memorije -- realloc ce
  9.   vratiti void* pointer na realocirani (i eventualno premjesteni) komad
  10.   memorije na koga je prethodno pokazivao pointer memblock.
  11.   Sadrzaj realociranog bloka memorije ostat ce nepromijenjen do manje od
  12.   nove i stare velicine.
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <malloc.h>
  18.  
  19. int main() {
  20. int m, n, foo, i, j, pos, OK, *polje;
  21.  
  22. printf("Koliko brojeva zelite unijeti: ");
  23. scanf("%d", &n);
  24. /* Alociramo memoriju za n elemenata polja.
  25.   Buduci ce nam pojedini element polja biti tipa int, potrebno je
  26.   alocirati n*sizeof(int) byteova. */
  27. polje = (int*) malloc(n*sizeof(int));
  28. if(polje == NULL) {
  29. printf("Greska u alokaciji memorije!\n");
  30. exit(1);
  31. }
  32. for(i=0; i<n ; i++) {
  33. printf("%d. broj: ", i+1);
  34. scanf("%d", &polje[i]);
  35. /* ili: scanf("%d", polje+i); */
  36. }
  37.  
  38. printf("Ispis polja:\n");
  39. for(i=0; i<n; i++)
  40. printf("%d ", polje[i]);
  41.  
  42. printf("\n\nKoliko jos brojeva zelite unijeti: ");
  43. scanf("%d", &m);
  44. /* Pomocu funkcije realloc povecati cemo trenutnu velicinu
  45.   jednodimenzionalnog polja polje za m mjesta (odnosno m*sizeof(int)
  46.   byteova). */
  47. polje = (int*) realloc(polje, (m+n)*sizeof(int));
  48. if(polje == NULL) {
  49. printf("Greska u alokaciji memorije!\n");
  50. exit(1);
  51. }
  52.  
  53. for(i=0; i<m; i++) {
  54. printf("%d. broj: ", i+1);
  55. scanf("%d", &foo);
  56. OK = 0;
  57. while(!OK) {
  58. OK = 1;
  59. printf("Na koje mjesto u polju (-1 za na kraj polja): ");
  60. scanf("%d", &pos);
  61. if(pos == -1)
  62. *(polje+n+i) = foo;
  63. /* ili: polje[n+i] = foo */
  64. else if(pos<0 || pos > n+i) {
  65. printf("Greska: Neispravna pozicija!\n");
  66. OK = 0;
  67. }
  68. else {
  69. /* Pomicemo sve elemente polja od pozicije pos pa nanize */
  70. for(j=n+i ; j>pos ; j--)
  71. polje[j] = polje[j-1];
  72. polje[pos] = foo;
  73.  
  74. }
  75. }
  76. printf("Ispis polja:\n");
  77. for (j=0; j<n+i+1; j++)
  78. printf("%d ", polje[j]);
  79. printf("\n");
  80. }
  81.  
  82. free(polje);
  83.  
  84. return 0;
  85. }
  86.