typedef struct punkt {
int x, y;
} **wsp;
To co zrobiłaś tutaj to zrobiłaś typedef struct punkt** wsp. Czyli wsp jest aliasem do podwójnego wskaźnika na struct punkt. Jeśli nie miałaś tego na myśli to popraw :P
Po drugie typedefy przy deklaracji struktury wykorzystuje się po to, żeby nie musieć pisać zawsze tego struct, czyli pisać samo punkt zamiast struct punkt. Ty zrobiłaś typedef (akurat nie do końca dobry :P ) a potem używasz pełnej nazwy struct punkt. Chcesz zrobić coś takiego:
typedef struct punkt {
int x, y;
} punkt;
jest to równoważne z:
struct punkt {
int x, y;
};
typedef struct punkt punkt;
Ale szybciej jest napisać typedefa odrazu przy deklaracji struktury, wiec wszyscy posługują się skróconą wersją.
W obydwu przypadkach możesz potem używać samego punkt zamiast struct punkt w kodzie.
struct punkt **wsp = (struct punkt**)malloc(sizeof(struct punkt)*n);
for (i = 0; i<n; i++)
wsp[i] = (struct punkt*)malloc(sizeof(struct punkt));
Tego kawałka wcale nie rozumiem. Wygląda to tak jakbyś chciała zrobić dwuwymiarową tablicę struktur, ale najpierw alokujesz n struktur, czyli normalną tablice struktur, ale przypisujesz ją do podwójnego wskaźnika, nie rozumiem. Później alokujesz pojedycze struktury i przypisujesz je do elementów tablicy.
Generalnie to stworzyłaś tablicę dwuwymiarową gdzie te bardziej wewnętrzne tablice (wiersze) mają jeden element. A wielkość tablicy zewnętrznej (całości) jest większa niż n, bo zaalokowałaś n* wielkość struktury a nie wskaźnika na strukture. Wielkość struktury to 8 B(lub 16B, ale stawiałbym na 8), a wskaźnika 4B (lub 8B, ale stawiałbym na 4B). Więc masz tablicę dwuwymiarową, która prawdopodobnie jest odpowiednikiem takiej tablicy: struct point tab[n*2][1]. A takie odwołania:
wsp[i]->x
są równoważne z wsp[i][0].x.
Obstawiam, że nie taki był zamiar, jeśli chcesz normalną tablice to zrób tak:
struct punkt tab[n];
;P, a jeśli koniecznie musi być alokowana dynamicznie, co tutaj jest totalnie niepotrzebne to zrób tak:
struct punkt* tab = (struct punkt*) malloc(sizeof(struct punkt) * n);
W ten sposób tworzysz jednowymiarową tablice n struktur na stercie, będąca odpowiednikiem struct punkt tab[n] alokowanej na stosie.
Co do pytania - jeśli dobrze rozumiem to masz problem z wypisaniem wspołrzędnych punktów po sortowaniu. Dlatego, że zrobiłaś sobie ułatwienie wbrew treści zadania :P, które mówi, że masz sortować struktury, a Ty posortowałaś inty. Generalnie na jedno wychodzi, ale wtedy tracisz połączenie między tablicą struktur a intów.
Zrób tak jak mówi zadanie - posortuj tablicę struktur. Ja bym to widział w ten sposób:
int porownaj_struktury(const void* a, const void* b) {
punkt* arg1 = (punkt*)a;
punkt* arg2 = (punkt*)b;
double dlugosc1 = sqrt(pow(arg1->x, 2) + pow(arg1->y, 2));
double dlugosc2 = sqrt(pow(arg2->x, 2) + pow(arg2->y, 2));
if (dlugosc1 < dlugosc2) return -1;
else if (dlugosc1 == dlugosc2) return 0;
else return 1;
}
Zauważ, że wywaliłem wartości bezwzlędne. Przecież wszystko podniesione do kwadratu jest dodatnie :P.
Zamiast liczyć te odległości za każdym razem można też zrobić pole dlugosc w struturze punkt i tam trzymać długość punktu.