komediruzecki

Zadatak--Pointer to Pointer

May 9th, 2016
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.71 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. #include<string.h>
  5. #include<math.h>
  6.  
  7.  
  8. #define MAX_LEN 100
  9.  
  10. int first_bigger(const void *first, const void *second) {
  11.     return strcmp((const char *)first, (const char *)second);
  12. }
  13.  
  14.  
  15. void shell_sort_hibbard(char *A[], int n) {
  16.  
  17.     int i = 0, j = 0, step = 1;
  18.     char *temp = NULL;
  19.     //char temp[MAX_LEN + 1];
  20.     int exp = 2;
  21.  
  22.     while (exp <= n) {
  23.         exp *= 2;
  24.     }
  25.     exp /= 2;
  26.     // Pošto u funkciji imamo double pointer, možemo mijenjati na što pokazuje pojedini pointer
  27.     // Dovoljno je mijenjati ono na što oni pokazuju, nema smisla kopirati znakovne nizove!
  28.     for (step = exp - 1; step > 0; step = exp - 1) {
  29.         for (i = step; i < n; i++) {
  30.             temp = A[i];// strcpy(temp, A[i]);
  31.             for (j = i; (j >= step) && (first_bigger(A[j - step], temp) < 0); j -= step) {
  32.                 A[j] = A[j - step];// strcpy(A[j], A[j - step]);
  33.             }
  34.             A[j] = temp; // strcpy(A[j], temp);
  35.         }
  36.         exp /= 2;
  37.     }
  38. }
  39. // Printanje znakovnih nizova (stringova) na koje pokazuju pointeri
  40. // Pošto u funkciji imamo double pointer, jednostavno svaki od pointera referenciramo oznakom A[i] za i-ti pointer
  41. void printing_shell_hibbard(char *A[], int size) {
  42.    
  43.     int i = 0;
  44.  
  45.     for (i = 0; i < size; i++) {
  46.         printf("This is %d. series: %s\n", (i + 1), A[i]);
  47.     }
  48.  
  49. }
  50.  
  51.  
  52. int main(void) {
  53.  
  54.     int check = 0, count = 0;
  55.     int i = 0, size = 0;
  56.  
  57.     char **series = NULL;
  58.  
  59.     printf("Type in your size: ");
  60.     scanf("%d", &size);
  61.  
  62.     // Alociraj dvostruki pointer na niz pointera (kojih ima size)
  63.     series = (char **)malloc(size * sizeof(char *));
  64.  
  65.     if (series == NULL) {
  66.         printf("Malloc failed!");
  67.         exit(1);
  68.     }
  69.    
  70.     // Alociraj svakog pointera iz niza na broj elemenata koji su nam potrebni (u ovom slučaju MAX + 1 jer se radi o znakovnom nizu)
  71.     for (i = 0; i < size; i++) {
  72.         series[i] = (char *)malloc((MAX_LEN + 1) * sizeof(char));
  73.         if (series[i] == NULL) {
  74.             printf("Malloc failed!");
  75.             exit(2);
  76.         }
  77.     }
  78.     // Pridruži određenom pointeru vrijednosti
  79.     do {
  80.         //printf("Type \"0\" to exit: ");
  81.         //scanf("%d", &check);
  82.  
  83.         if (check == 0) {
  84.             ;//break;
  85.         }
  86.         // Pridružujemo vrijednosti pointerima 0, 1, 2, 3 (pridružujemo im znakovni niz (string))
  87.         printf("Type in your %d. series: ", (count + 1));
  88.         scanf(" %[^\n]", series[count++]);
  89.  
  90.     } while (count < size);
  91.  
  92.     printf("\n**This is your series before sorting** \n");
  93.     printing_shell_hibbard(series, size);
  94.     // Poziv funkcije
  95.     shell_sort_hibbard(series, size);
  96.  
  97.     printf("\n**This is your series after sorting** \n");
  98.     printing_shell_hibbard(series, size);
  99.  
  100.     // Oslobađanje svakog od pointera, naredbom free  
  101.     for (i = 0; i < size; i++) {
  102.         free(series[i]);
  103.     }
  104.     // Oslobađanje dvostrukog pointera
  105.     free(series);
  106.  
  107.     return 0;
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment