gpt4 book ai didi

c - 动态分配结构体指针数组,指向它们并对它们进行排序

转载 作者:行者123 更新时间:2023-11-30 20:26:10 25 4
gpt4 key购买 nike

我一整天都在谷歌搜索并尝试这样做,但没有成功。还有其他主题也有类似的问题,但我似乎无法使其发挥作用。

这是代码:

void sort_structs_example(Stock **head, int count)
{
Stock **toSort = NULL;

int i;

memLoc(&toSort, sizeof(toSort)*count);

for (i = 0; count > 0 && i < count && (head != NULL); i++)
{
if (i == 0) toSort[0] = *head;
else
{
toSort[i] = toSort[i - 1]->next;
}
}

qsort(toSort, count, sizeof(Stock), struct_cmp_by_product);

for (i = 0; count > 0 && i < count && (head != NULL); i++)
{
printColor(-1, i, toSort[i]->name, 'G', 'B');
}

system("pause");
free(toSort);
}

int struct_cmp_by_product(const void *Ap, const void *Bp)
{
Stock A = *(Stock *)Ap;
Stock B = *(Stock *)Bp;
return strcmp((&A)->name, (&B)->name);
}

Stock 是一个结构体,其中包含变量“name”和“next”。参数“count”接收当前 Stock 结构的数量。参数 **head 是最后添加的股票的指针,我通过 (*head)->next 访问其他股票,它是一个链接结构。

这是 memLoc:

int memLoc(void **var, int size)
{
if (NULL == (*var = malloc(size)))
{
return 0;
}
else return 1;
}

所以我认为我没有正确使用 memLoc,并且 qsort 条件中的某些内容弄乱了,但我对所有指针都感到困惑。请帮助?谢谢。

最佳答案

我无法提供解决方案,但我可以看到您的指针陷入困境。在 struct_cmp_by_product() 中,您已将结构体值复制到局部变量,然后将它们用作指针。

return strcmp((&A)->name, (&B)->name);

直接使用本地结构会更好

return strcmp(A.name, B.name);

更好的是,它会重新转换指针类型(而不是它们指向的类型)。

int struct_cmp_by_product(const void *Ap, const void *Bp)
{
return strcmp( ((Stock *)Ap)->name, ((Stock *)Bp)->name );
}

这样做更好的原因是因为 Stock 可能是一个非常大的结构,并且没有必要制作本地副本。

关于c - 动态分配结构体指针数组,指向它们并对它们进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563130/

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