Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<malloc.h>
- #include<string.h>
- #include<math.h>
- #define MAX_LEN 100
- int first_bigger(const void *first, const void *second) {
- return strcmp((const char *)first, (const char *)second);
- }
- void shell_sort_hibbard(char *A[], int n) {
- int i = 0, j = 0, step = 1;
- char *temp = NULL;
- //char temp[MAX_LEN + 1];
- int exp = 2;
- while (exp <= n) {
- exp *= 2;
- }
- exp /= 2;
- // Pošto u funkciji imamo double pointer, možemo mijenjati na što pokazuje pojedini pointer
- // Dovoljno je mijenjati ono na što oni pokazuju, nema smisla kopirati znakovne nizove!
- for (step = exp - 1; step > 0; step = exp - 1) {
- for (i = step; i < n; i++) {
- temp = A[i];// strcpy(temp, A[i]);
- for (j = i; (j >= step) && (first_bigger(A[j - step], temp) < 0); j -= step) {
- A[j] = A[j - step];// strcpy(A[j], A[j - step]);
- }
- A[j] = temp; // strcpy(A[j], temp);
- }
- exp /= 2;
- }
- }
- // Printanje znakovnih nizova (stringova) na koje pokazuju pointeri
- // Pošto u funkciji imamo double pointer, jednostavno svaki od pointera referenciramo oznakom A[i] za i-ti pointer
- void printing_shell_hibbard(char *A[], int size) {
- int i = 0;
- for (i = 0; i < size; i++) {
- printf("This is %d. series: %s\n", (i + 1), A[i]);
- }
- }
- int main(void) {
- int check = 0, count = 0;
- int i = 0, size = 0;
- char **series = NULL;
- printf("Type in your size: ");
- scanf("%d", &size);
- // Alociraj dvostruki pointer na niz pointera (kojih ima size)
- series = (char **)malloc(size * sizeof(char *));
- if (series == NULL) {
- printf("Malloc failed!");
- exit(1);
- }
- // Alociraj svakog pointera iz niza na broj elemenata koji su nam potrebni (u ovom slučaju MAX + 1 jer se radi o znakovnom nizu)
- for (i = 0; i < size; i++) {
- series[i] = (char *)malloc((MAX_LEN + 1) * sizeof(char));
- if (series[i] == NULL) {
- printf("Malloc failed!");
- exit(2);
- }
- }
- // Pridruži određenom pointeru vrijednosti
- do {
- //printf("Type \"0\" to exit: ");
- //scanf("%d", &check);
- if (check == 0) {
- ;//break;
- }
- // Pridružujemo vrijednosti pointerima 0, 1, 2, 3 (pridružujemo im znakovni niz (string))
- printf("Type in your %d. series: ", (count + 1));
- scanf(" %[^\n]", series[count++]);
- } while (count < size);
- printf("\n**This is your series before sorting** \n");
- printing_shell_hibbard(series, size);
- // Poziv funkcije
- shell_sort_hibbard(series, size);
- printf("\n**This is your series after sorting** \n");
- printing_shell_hibbard(series, size);
- // Oslobađanje svakog od pointera, naredbom free
- for (i = 0; i < size; i++) {
- free(series[i]);
- }
- // Oslobađanje dvostrukog pointera
- free(series);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment