qsort с функцией сравнения различных - PullRequest
1 голос
/ 13 апреля 2019

Мне нужна помощь с функцией сравнения в qsort.Сравните массив G-> orden, но сравнив его с элементом порядка, который служит индексом в другом массиве, и сравнением вставки G.

struct VerticeSt {
    u32 nombre;
    u32 color;
    u32 grado;
    u32 *vecinos;
};
struct GrafoSt {
    u32 n;
    u32 m;
    u32 nc;
    u32 delta;
    Vertices v;
    u32 *orden;
};

int Compare(const void* a, const void* b) {
     u32* x1 = (u32*) a;
     u32* x2 = (u32*) b;
     if(G->v[G->orden[x1]] < G->v[G->orden[x2]]) 
         return -1;
     else
     .
     .
     .
}
qsort(G->orden, G->n, sizeof(u32), Compare);

1 Ответ

3 голосов
/ 13 апреля 2019

Предполагая (из вашего вызова qsort()), что G->orden указывает на базу массива значений типа u32 с длиной G->n, тогда значения, передаваемые в вашу функцию сравнения, будут указателями на элементыиз этого массива.Ваша функция Compare() должна приводить переданные ей указатели void* к указателям на тип, о котором она знает, и затем разыменовывать их, чтобы получить фактические значения, которые она будет сравнивать.

Вот короткая программа, котораяпоказывает все в действии:

#include <stdio.h>
#include <stdlib.h>

typedef unsigned long u32;

int Compare(const void* a, const void* b) {
    u32 x1 = *(u32*)a;   // Get the array element that a points to
    u32 x2 = *(u32*)b;   // Get the array element that b points to

    if (x1 < x2)         // Compare the values and return result
        return -1;
    else if (x1 == x2)
        return 0;
    else return 1;
}

void printArray(char* label, u32* a, int n) {
    printf("%s", label);
    for (int i = 0; i < n; i++)
        printf("\t%lu", (unsigned long)a[i]);
    printf("\n");
}

int main(int argc, const char* argv[]) {
    u32 array[5] = {9, 3, 27, 18, 6};
    printArray("unsorted: ", array, 5);
    qsort(array, 5, sizeof(u32), Compare);
    printArray("  sorted: ", array, 5);
    return 0;
}

И вот результат:

unsorted:   9   3   27  18  6
  sorted:   3   6   9   18  27

Сравните в qsort получите два параметра const void a, const void b.Мне нужно, чтобы Compare получил три параметра const void a const void b Grafo G.

В этом случае qsort(), вероятно, не совсем подходящая для вас функция.Есть также qsort_r() и qsort_b().qsort_r() принимает дополнительный параметр void*, который также передается в функцию сравнения, и это звучит ближе всего к тому, что вам нужно - вы можете передать указатель на ваш G в этом параметре.qsort_b() принимает вместо функции блок сравнения (он же замыкание), и этот блок может захватывать контекст из вызывающей стороны.

...