我为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;
}
然而,编译器会报告一个错误,上面写着“使用数组类型赋值给表达式”
有什么明显的东西我错过了,或者我只是做了一些根本错误的事情?
答案 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背后的指针。请谨慎使用此建议。这只是大部分时间,而不是所有时间。