2017-11-26 5 views
2

내 Algorithms 클래스에 대한 이러한 지정을 통해 검색의 복잡성이 O (n)이 아닌 자동차 인벤토리를 검색 할 수있는 자동차 판매점 용 시스템을 작성할 수 있습니다. 이 문제를 해결하기 위해 자동차의 다른 모델을 가리킨 다음 3 가지 다른 BST를 사용하여 가격, 마일리지 및 연도에 대한 각 모델 검색을 허용하는 이진 검색 트리를 사용하기로했습니다. 배열 유형 C가있는 표현식에 할당

BST를

*이 상위 인덱스 + 1, 오른쪽 아이가 2 * 상위 인덱스 + 2

세 구조 인 부모의 왼쪽 아이는 2 어레이 구현을 사용하여 구축 I 내가 단계 프로세스에 의해이 일반 단계에 따라 각각의 나무에 자동차를 추가 할 때

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

tmp->cars[val][i[val]]을 역 참조하려고합니다. 색인이 모두 0 일 때 본질적으로 *(*(tmp->cars + val) + i[val])을 의미하거나, 바로 **(tmp->cars)을 의미합니다.

car_BST::cars은 3 car 어레이의 포인터에 대한 포인터로 정의됩니다.

그래서 **(tmp->cars)car 배열이므로 값을 할당 할 수 없습니다.

또한 car 배열이며 car* 배열이 아닙니다. 즉,(car* 유형이 있다고 가정)을 **(tmp->cars)[0]에 할당 할 수 없습니다.

나는 당신이 여기에서 성취하려고 노력하고 있는지 잘 모르겠습니다. 어쩌면 car_BST::carscar* cars[3]으로 바꾸시겠습니까? 또는 car* (**cars)[3].

+0

내가 원하는 것은 'car **'의 배열을 3 개 만드는 것이고, 그 이유는'car_BST'가 3 개의 car ** 배열로 이루어져 있으며, 3 개의 배열은'car *'타입 배열의 3 개 배열입니다. 내 이해에서 올바른 구현,하지만 분명히 잘못되었습니다 – Ohunter

+0

"3 자동차'''''또는''3''자동차''s의 배열인가요? 후자의 경우 'car ** cars [3]'이어야합니다. –

+0

그리고 그것은 내가 얻고있는 오류를 고쳤다. 고맙습니다 – Ohunter

1

typedef를 사용하여 작업을 단순화 할 수 있습니다. 포인터를 저장

단일 어레이 기반 나무는 다음과 같이 보일 것이다 :

typedef car** car_bst; 

그것은 포인터의 단지 배열입니다.

세 가지 같은 것들의 배열은 다음과 같이 보일 것이다 : 당신이 그것에 대해 조금 생각하는 경우

car_bst cars[3]; 

지금, 이것은 당신이 쓴 것과

car **cars[3]; 

하지 동일합니다.

typedef 뒤에 포인터를 숨겨서는 안된다는 것을 인터넷에서 종종들을 수 있습니다. 이 조언을주의 깊게 읽으십시오. 모든 시간이 아닌 대부분의 시간에만 좋은 것입니다.