qsort没有正确排序指向C中结构的指针数组
qsort not properly sorting array of pointers to struct in C
我正在尝试使用 qsort 按其中一个值对指向结构的指针数组进行排序。
任何帮助将不胜感激,因为我不明白为什么这不起作用。比较功能对我来说似乎是正确的,我想知道无符号整数是否有问题。
结构:
typedef struct node{
unsigned int identifier;
unsigned int value;
}Node;
比较函数:
int compare(const void* a, const void* b){
Node* sum_a = (Node*)a;
Node* sum_b = (Node*)b;
if(sum_a->value > sum_b->value)return 1;
if(sum_a->value == sum_b->value)return 0;
return -1;
}
代码我用过重现问题:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#define SIZE 20
Node* init_node(Node* ins_node,unsigned int identifier,unsigned int value){
ins_node = (Node*)malloc(sizeof(Node));
ins_node->identifier=identifier;
ins_node->value=value;
return ins_node;
}
int main (){
Node*curr_node;
Node*box[SIZE];
box[0]=init_node(curr_node,27,9999);
for(int i = 1;i<SIZE;i++){
box[i]=init_node(curr_node,i,SIZE*2-i);
}
qsort(box,SIZE,sizeof(Node*),compare);
printf("\nsorted:\n");
for(int i = 0;i<SIZE;i++){
printf("%d/%d\n",box[i]->identifier,box[i]->value);
}
}
显然没有排序的输出:
sorted:
27/9999
1/39
2/38
3/37
4/36
5/35
6/34
7/33
8/32
9/31
10/30
11/29
12/28
13/27
14/26
15/25
16/24
17/23
18/22
19/21
提前感谢大家:)
比较函数无效并调用了未定义的行为。数组的元素通过引用传递给函数。所以你需要定义函数至少像
int compare(const void* a, const void* b){
Node* sum_a = *(Node**)a;
Node* sum_b = *(Node**)b;
if(sum_a->value > sum_b->value)return 1;
if(sum_a->value == sum_b->value)return 0;
return -1;
}
函数的第一个参数init_node也没有使用。
像这样定义函数
Node* init_node(unsigned int identifier,unsigned int value){
Node *ins_node = (Node*)malloc(sizeof(Node));
ins_node->identifier=identifier;
ins_node->value=value;
return ins_node;
}
我正在尝试使用 qsort 按其中一个值对指向结构的指针数组进行排序。
任何帮助将不胜感激,因为我不明白为什么这不起作用。比较功能对我来说似乎是正确的,我想知道无符号整数是否有问题。
结构:
typedef struct node{
unsigned int identifier;
unsigned int value;
}Node;
比较函数:
int compare(const void* a, const void* b){
Node* sum_a = (Node*)a;
Node* sum_b = (Node*)b;
if(sum_a->value > sum_b->value)return 1;
if(sum_a->value == sum_b->value)return 0;
return -1;
}
代码我用过重现问题:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#define SIZE 20
Node* init_node(Node* ins_node,unsigned int identifier,unsigned int value){
ins_node = (Node*)malloc(sizeof(Node));
ins_node->identifier=identifier;
ins_node->value=value;
return ins_node;
}
int main (){
Node*curr_node;
Node*box[SIZE];
box[0]=init_node(curr_node,27,9999);
for(int i = 1;i<SIZE;i++){
box[i]=init_node(curr_node,i,SIZE*2-i);
}
qsort(box,SIZE,sizeof(Node*),compare);
printf("\nsorted:\n");
for(int i = 0;i<SIZE;i++){
printf("%d/%d\n",box[i]->identifier,box[i]->value);
}
}
显然没有排序的输出:
sorted:
27/9999
1/39
2/38
3/37
4/36
5/35
6/34
7/33
8/32
9/31
10/30
11/29
12/28
13/27
14/26
15/25
16/24
17/23
18/22
19/21
提前感谢大家:)
比较函数无效并调用了未定义的行为。数组的元素通过引用传递给函数。所以你需要定义函数至少像
int compare(const void* a, const void* b){
Node* sum_a = *(Node**)a;
Node* sum_b = *(Node**)b;
if(sum_a->value > sum_b->value)return 1;
if(sum_a->value == sum_b->value)return 0;
return -1;
}
函数的第一个参数init_node也没有使用。
像这样定义函数
Node* init_node(unsigned int identifier,unsigned int value){
Node *ins_node = (Node*)malloc(sizeof(Node));
ins_node->identifier=identifier;
ins_node->value=value;
return ins_node;
}