我一直在谷歌搜索并试图整天这样做,但没有成功。还有其他类似问题的主题,但我似乎无法使其发挥作用。
这是代码:
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是最后添加Stock的指针,我通过go(* head) - &gt;访问其他股票。接下来,它是一个链接结构。
这是memLoc:
int memLoc(void **var, int size)
{
if (NULL == (*var = malloc(size)))
{
return 0;
}
else return 1;
}
所以我认为我没有正确使用memLoc而且qsort条件中的某些东西搞砸了,但我纠结了所有的指针。请帮忙?感谢。
答案 0 :(得分:1)
我无法提供解决方案,但我可以看到你的指针已经纠缠在一起了。在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
可能是一个非常大的结构,并且没有必要制作本地副本。