Кажется, что мой qsort не дал правильного результата, почему?

это моя функция сравнения:

int compare (const void * a, const void * b)
 {
 ptnode * ia = (ptnode*)a;
 ptnode * ib = (ptnode*)b;
 return (int)(100.f*ia->x - 100.f*ib->x );
 }

и я назвал qsort следующим:

qsort(sortbase,index,sizeof(ptnode),compare);

sortbase - это массив моего struct ptnode, который определяется как:

typedef struct node
{
 struct node *pre1;
 struct node *pre2;
 struct node *pre;
 ****** x;
 ****** y;
 ****** maxlength;
} ptnode;

sortbase выглядит так:

struct node * sortbase[1000];

Я хочу отсортировать их по их значению x, но до и после qsort ничего не изменилось,

Зачем? заранее спасибо.

2 ответа

Функция сравнения получает указатель на 2 элемента, которые нужно сравнить. Поскольку ваши элементы являются указателями, функция сравнения должна обрабатывать указатель на указатели.

int compare (const void * a, const void * b)
{
 ptnode * ia = *(ptnode**)a;
 ptnode * ib = *(ptnode**)b;
 return (int)(100.f*ia->x - 100.f*ib->x );
}


qsort передает compare адреса (не значения) каждого элемента массива, т.е. передает указатель на указатель на ptnode. Вам нужно изменить первую строку compare:

ptnode * ia = *(ptnode**)a;

а также для второй линии.

licensed under cc by-sa 3.0 with attribution.