我需要有关qsort中的COMPARE函数的帮助。比较数组G-> orden,但与用作另一个数组中索引的order元素进行比较,以及如何在比较中插入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);
答案 0 :(得分:3)
假设(从您对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。我需要比较接收三个参数const void a const void b Grafo G。
在这种情况下,qsort()
可能不适合您。还有qsort_r()
和qsort_b()
。 qsort_r()
需要一个附加的void*
参数,该参数也已传递到比较函数中,听起来似乎最接近您的需要-您可以在此参数中传递指向G
的指针。 qsort_b()
采用比较块(也称为闭包)而不是函数,并且该块可以捕获调用者的上下文。