gpt4 book ai didi

C:使用 qsort 对指向 ADT(结构)的指针数组进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:21 25 4
gpt4 key购买 nike

我一直在尝试使用 qsort() 对 ADT(名为 SSET)的指针数组进行排序,但我得到了一个奇怪的结果。这是我的功能:

extern void sset_sort_sets(SSET *sets[], int n) {
qsort(sets, n, sizeof(SSET *), sset_cmp);
}

sset_cmp() 中,我放置了一条语句来打印它正在比较的 SSET

int sset_cmp(const void *a, const void *b){
SSET *pa = (SSET *) a;
SSET *pb = (SSET *) b;

printf("sset_cmp called:\n");
printf(" a = "); sset_display(pa);
printf(" b = "); sset_display(pb);
printf("\n");

// More stuff...

我创建了一个包含两个 SSET 的数组(在 main() 中)

SSET *s[2];
int a[] = {-4, 0, 3, 3, 22};
int c[] = { 1, 2, 3, 4, 5};
s[0] = sset_from_array(c, n); // { 1 2 3 4 5 }
s[1] = sset_from_array(a, n); // { -4 0 3 22 }

int i;
printf("Before sort:\n");
for (i = 0; i < 2; i++)
sset_display(s[i]);
printf("\n");

sset_sort_sets(s, 2);

printf("After sort\n");
for (i = 0; i < 2; i++)
sset_display(s[i]);

但这是我在输出中得到的:

Before sort:
{ 1 2 3 4 5 }
{ -4 0 3 22 }

sset_cmp called:
a = { -1589621936 -4 0 3 22 }
b = { -1589621568 }

After sort
{ 1 2 3 4 5 }
{ -4 0 3 22 }

我想我在调用 qsort() 时弄乱了指针,但我不确定是怎么回事。

我想我包含了所有相关代码。告诉我您是否需要找到我的错误的任何其他部分。

最佳答案

qsort() 将指向数组元素的指针传递给比较函数。因此,如果您有一个 int 数组,比较函数将接收到 int *

您正在尝试对指向 SSET 的指针数组进行排序,即 SSET * 的数组。因此,比较函数将接收指向 SSET 的指针(因此,SSET **)。

所以你需要改变这个:

SSET *pa = (SSET *) a;
SSET *pb = (SSET *) b;

收件人:

SSET *pa = *(SSET **) a;
SSET *pb = *(SSET **) b;

此外,通常最好不要将类型名称硬编码为 sizeof 的操作数。如果类型发生变化,这是您以后必须更新的另一个地方,并且您可能会出错,因为您必须记住使用正确的类型。

考虑更改此行:

qsort(sets, n, sizeof(SSET *), sset_cmp);

收件人:

qsort(sets, n, sizeof(sets[0]), sset_cmp);

关于C:使用 qsort 对指向 ADT(结构)的指针数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32618857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com