Witajcie. Od długiego już czasu borykam się z problemem. Szybko i na temat, najprostszy przykład kodu:
**Jak za pomocą funkcji qsort posortować tablicę wskaźników w ten sposób, aby wartości oryginalnej tablicy nie zostały zmienione? **Moja implementacja podejrzewam, że zamienia wartości wskaźników, a nie adresy. Jak to zmienić? Nie chcę implementować żadnego innego algorytmu, to potrafię, ale chcę skorzystać z wbudowanej funkcji, która będzie zamieniać same wskaźniki. Czy jest to w ogóle możliwe? Podejrzewam, że funkcja porównaj powinna wyglądać inaczej, ale nie potrafię sobie tego wyobrazić, ani zaimplementować.
#include <stdio.h>
#include <stdlib.h>
void print(int *t, int rozmiar){
for(int i=0; i<rozmiar; i++)
printf("%d ",t[i]);
printf("\n");
}
int porownaj(const void *w1, const void *w2);
int main() {
printf("Hello, World!\n");
int tab[10] = {9,8,7,6,5,4,3,2,1,0};
int *wskazniki[10];
for(int i=0; i<10; i++)
wskazniki[i] = &tab[i];
printf("Przed sortowaniem[tab]: ");
print(tab,10);
printf("Przed sortowaniem[wskazniki]: ");
print(*wskazniki,10);
qsort(*wskazniki,10,sizeof(int),porownaj);
printf("Po sortowaniu[tab]: ");
print(*wskazniki,10);
printf("Po sortowaniu[wskazniki]: ");
print(tab,10);
return 0;
}
int porownaj(const void *w1, const void *w2){
int *a1 = (int*) w1;
int *a2 = (int*) w2;
if(*a1<*a2)
return -1;
if(*a1==*a2)
return 0;
else
return 1;
}
**Wyniki w kompilatorze: **
Przed sortowaniem[tab]: 9 8 7 6 5 4 3 2 1 0
Przed sortowaniem[wskazniki]: 9 8 7 6 5 4 3 2 1 0
Po sortowaniu[tab]: 0 1 2 3 4 5 6 7 8 9
Po sortowaniu[wskazniki]: 0 1 2 3 4 5 6 7 8 9