使用数组类型C赋值给表达式

时间:2017-11-26 17:16:32

标签: c pointers

我为Algorithms类做了这个任务,为汽车经销商编写一个系统,允许他们搜索他们的库存,这样搜索的复杂性就不是O(n)。为了解决这个问题,我选择使用指向不同车型的二元搜索树,然后使用三个不同的BST来搜索每个模型的价格,里程和年份。

BST是使用数组实现构建的,其中父项的左子项是2 *父项索引+ 1,右项是2 *父项索引+ 2。

我使用的三种结构都是这样定义的:

typedef struct car {

    int inventoryID;
    char* make;
    char* model;
    int year;
    int mileage;
    int price;

} car;

typedef struct car_BST {

    car (**cars)[3];
    int size;

} car_BST;

typedef struct BST {

    car_BST** carModel;
    int size;

} BST;

因此,当我尝试在每棵树上添加一辆汽车时,我会按照这个一般的一步一步的过程进行操作:

while(1){
    if (tmp->cars[val][i[val]] == NULL){
        tmp->cars[val][i[val]] = newCar;
        break;
    }

    if (i[val] > tmp->size)
        incrCar_BSTSize(tmp, i[val]);

    if (newCar->price >= tmp->cars[val][i[val]]->price)
        i[val] = 2 * i[val] + 2;
    else
        i[val] = 2 * i[val] + 1;
}

然而,编译器会报告一个错误,上面写着“使用数组类型赋值给表达式”

有什么明显的东西我错过了,或者我只是做了一些根本错误的事情?

2 个答案:

答案 0 :(得分:2)

当您的索引全部为零时,您尝试取消引用tmp->cars[val][i[val]],这实际上意味着*(*(tmp->cars + val) + i[val])或类似于**(tmp->cars)

car_BST::cars被定义为指向3 car s数组的指针。

因此**(tmp->cars)car数组,因此您无法为其指定值。

它也是car数组,而不是car*数组。这意味着您永远不能将newCar(我假设其类型为car*)分配到**(tmp->cars)[0]

我不太清楚你想在这里实现什么。也许您希望car_BST::cars代替car* cars[3]?或car* (**cars)[3]

答案 1 :(得分:1)

您可以使用typedef来简化任务。

存储指针的单个基于数组的树将如下所示:

typedef car** car_bst;

这只是一个指针数组。

三个这样的事物的数组看起来像这样:

car_bst cars[3];

现在,如果你想一下,这相当于

car **cars[3];

而不是你写的。

请注意,您经常可以在互联网上听到您不应该隐藏typedef背后的指针。请谨慎使用此建议。这只是大部分时间,而不是所有时间。