정확하게 이해한다면이 질문은 디자인 질문이며 C++의 연결된 목록과는 아무런 관련이 없습니다.
- 는
N
동영상이 있습니다 : 구현의 나머지 부분 , 나는 다음과 같은 가정합니다.
- 현재
K
임대입니다 (0 <= K <= N
).
- 고객이
M
입니다. N
과 M
사이에는 관계가 없지만 대부분의 경우 비디오보다 더 많은 고객이있을 수 있다고 가정하는 것이 안전 할 수 있습니다. 대부분의 비디오는 대여되지 않습니다 (M
). 훨씬 더 큰 N
보다 큽니다. K
).
- 수업을 시작하기 때문에 수업에 대해 잘 모르는 경우
std::string
또는 std::list
입니다.
다음 구조체/클래스가 있습니다.
고객 { int account_number; char * name; // ... 다른 고객 정보 ... }};
struct 비디오 { char * title; // ... 기타 동영상 정보 ... };
해결 방법 1 : 대여
의 고객 당 목록은 Customer
클래스는 "대여 목록"을 추가합니다. 이 방법은 고객이 대여 한 제품을 나열하는 데 편리하지만 비디오가 아직 대여되지 않았 음을 확인해야하는 경우 문제가됩니다. 첫 번째는 상수 시간이지만 두 번째는 M+K
에서 선형입니다 (모든 고객에 대해 반복 한 다음 각 고객의 임대를 반복합니다).
#define MAX_RENTALS 5
struct Customer {
// regular fields, see above.
// ...
Video rentals[MAX_RENTALS];
int rental_count;
};
해결 방법 2 : 당 비디오 포인터 고객
에 당신의 Video
클래스의 "고객에게 포인트"를 추가합니다. 비디오가 아직 대여되지 않았는지 확인하려면 일정 시간이 필요합니다 (video->customer
이 C가 아닌 NULL
, Java의 경우 null
, Python의 경우 None
등)으로 설정되어 있지만 특정 고객이 대여 한 영화 목록은 linear in N
.
struct Video {
// regular fields, see above.
// ...
Customer * rented_to;
};
해결 방법 3 : 대여
의 목록은 별도로 대여를 추적 할 수있는 3 목록을 추가합니다. 포인터가 Customer
이고 포인터가 Video
인 Rental
클래스를 정의하십시오. 그런 다음 임대 목록을 정의하십시오. 고객이 대여 한 모든 대여 항목을 나열하고 이미 대여 한 동영상인지 확인하려면 K
에서 선형입니다.
#define MAX_RENTALS 100
struct Rental {
Video * video;
Customer * customer;
};
Rental rentals[MAX_RENTALS];
int rental_count = 0;
이 솔루션은 당신에게 최고의 알고리즘의 복잡성을 제공하고 또한 더 밀접하게 당신이 비디오 가게의 고객, 비디오 및 대여를 추적하는 실제 상용 응용 프로그램에서 SQL 데이터베이스와 함께 할 거라고 모방 발생합니다.
을 이것은 C++ 프로젝트이기 때문에, 어쩌면 처음부터 연결리스트를 구현할 필요가 없습니다. [STL 목록] (http://www.cplusplus.com/reference/stl/list/)을 사용할 수 있습니다. – bits
그러나 물론 당신이 물론 당신이 연결된 목록의 구현을 가르치는 것을 의미 할 수도있는 경우에만 알 수 있습니다. 그렇다면 그 경우 이전 주석을 무시하십시오. – bits