Итак, есть много примеров использования qsort()
со структурами, указателями и т. Д. Но ни один из них, похоже, не правильно сортируется в моей реализации.Как быстро отсортировать массив указателей на структуры в C?
Это обзор моего кода:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
int value;
};
typedef struct node Node;
int compare(const void *p1, const void *p2);
int main()
{
Node *myArray[10];
Node *node1, *node2, *node3;
int i;
node1 = (Node *)malloc(sizeof(Node));
node1->value = 10;
myArray[0] = node1;
node2 = (Node *)malloc(sizeof(Node));
node2->value = 7;
myArray[1] = node2;
node3 = (Node *)malloc(sizeof(Node));
node3->value = 12;
myArray[2] = node3;
for (i=0; i<3; i++) {
printf("Element %i: %i\n", i, myArray[i]->value);
}
printf("-------------\n");
qsort(myArray, 3, sizeof(Node*), compare);
for (i=0; i<3; i++) {
printf("Element %i: %i\n", i, myArray[i]->value);
}
return 0;
}
int compare(const void *p1, const void *p2)
{
Node *node1 = (Node*) p1;
Node *node2 = (Node*) p2;
return node1->value - node2->value;
}
Этот код, чтобы продемонстрировать свою проблему, поэтому, пожалуйста, не напыщенная речь на меня семантику! Дополнительное неиспользуемое пространство в массиве является преднамеренным. : p
Насколько я знаю и от того, что я читаю в Интернете, это должно работать. Но это не так. По какой-то причине он начинает сортировку по значениям мусора в функции сравнения.
Я требую, чтобы массив часто был больше значений внутри него, поэтому надеялся, что второй аргумент функции qsort()
ограничит его только первыми тремя элементами в этом случае. Но, похоже, это игнорирует это.
Любые идеи, что вызывает это странное поведение?
Я думаю, что p1 не указывает на узел, а скорее на элемент массива, то есть на указатель на узел. Возможно, вам придется дважды разыменовать p1 и p2. –
Этот код не компилируется. – JJF
Ваш код не компилируется. 'node-> entries' не определен, а' main' является неполным, а 'compare' объявляется слишком поздно. И он должен печатать узлы в конце. В конечном счете использование '-' в качестве оператора сравнения не имеет смысла, но я не могу сказать, является ли это ошибкой или преднамеренным. Исправьте код, чтобы он компилировал и демонстрировал проблему, пожалуйста. – Schwern