动态分配一个struct指针数组,指向它们并对它们进行qsort

时间:2014-10-25 13:51:53

标签: c pointers struct

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

这是代码:

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条件中的某些东西搞砸了,但我纠结了所有的指针。请帮忙?感谢。

1 个答案:

答案 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可能是一个非常大的结构,并且没有必要制作本地副本。