2011-02-27 9 views
0

내 연결된 목록은 비디오 저장소에 대한 것입니다. 비디오 세부 정보 (이 부분을 알고 있음)와 고객 세부 정보 목록을 작성해야합니다. 이제 CUSTOMER 목록 (두 번째 노드 유형)은 내 문제가있는 곳입니다.중첩 링크 된 목록 구현 (목록 목록)

고객의 이름 (acc no.)을 표시해야합니다. (고객 목록에 비디오 삭제 및 삽입) 내 의심은, 어떻게이 사람의 이름 으로이 동영상의 삭제 및 삽입을 할 수 있습니다 ...

예 : 고객 목록에는 이름이 다르며 고객 번호와 대여 한 동영상이 다른 많은 고객이 있습니다.

하나의 고객 존이 2 개 또는 4 개의 서로 다른 비디오를 대여하고 일부 비디오를 대여했습니다. 난 단지 요한이이 동영상을 (즉 내가 그의 이름 만하지 다른 고객에서 비디오를 삽입했습니다) 나는 사람들이 나를 ... 내가 알고 싶은있어 이제 희망

임대 보여 어떻게 지금

어떻게 할 수 있니?

+0

을 이것은 C++ 프로젝트이기 때문에, 어쩌면 처음부터 연결리스트를 구현할 필요가 없습니다. [STL 목록] (http://www.cplusplus.com/reference/stl/list/)을 사용할 수 있습니다. – bits

+0

그러나 물론 당신이 물론 당신이 연결된 목록의 구현을 가르치는 것을 의미 할 수도있는 경우에만 알 수 있습니다. 그렇다면 그 경우 이전 주석을 무시하십시오. – bits

답변

2

정확하게 이해한다면이 질문은 디자인 질문이며 C++의 연결된 목록과는 아무런 관련이 없습니다.

  1. N 동영상이 있습니다 : 구현의 나머지 부분

    , 나는 다음과 같은 가정합니다.
  2. 현재 K 임대입니다 (0 <= K <= N).
  3. 고객이 M입니다. NM 사이에는 관계가 없지만 대부분의 경우 비디오보다 더 많은 고객이있을 수 있다고 가정하는 것이 안전 할 수 있습니다. 대부분의 비디오는 대여되지 않습니다 (M). 훨씬 더 큰 N보다 큽니다. K).
  4. 수업을 시작하기 때문에 수업에 대해 잘 모르는 경우 std::string 또는 std::list입니다.
  5. 다음 구조체/클래스가 있습니다.

    고객 { 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이고 포인터가 VideoRental 클래스를 정의하십시오. 그런 다음 임대 목록을 정의하십시오. 고객이 대여 한 모든 대여 항목을 나열하고 이미 대여 한 동영상인지 확인하려면 K에서 선형입니다.

#define MAX_RENTALS 100 
struct Rental { 
    Video * video; 
    Customer * customer; 
}; 
Rental rentals[MAX_RENTALS]; 
int rental_count = 0; 

이 솔루션은 당신에게 최고의 알고리즘의 복잡성을 제공하고 또한 더 밀접하게 당신이 비디오 가게의 고객, 비디오 및 대여를 추적하는 실제 상용 응용 프로그램에서 SQL 데이터베이스와 함께 할 거라고 모방 발생합니다.

+0

와우 ... 그쪽은 놀랍고도 복잡해 보이네 ... 흠 .. 내가 할 수있는 일을 볼 수있는 모든 도움을 주셔서 감사합니다.하지만 다시 많이 감사드립니다! – Surya

+0

정확히 #define MAX_RENTALS 100은 ... 익숙한 것 같습니다. 오라클의 SQL입니까? C++에서 작동합니까? – Surya

+0

예, C++입니다. 그것은 C 스타일의 상수 정의입니다. 필요에 맞게 값을 변경하십시오. 고급 프로그래밍 수업을 받으면 교사는 필요한 메모리 양을 미리 결정하지 않도록하는 방법을 보여줍니다. 한 번에 너무 많은 개념을 도입하지 않으려 고했습니다. –

0

두 번째 목록의 머리를 첫 번째 목록의 내용 인 구조 안에 넣으십시오. 전역 변수가 아닙니다.

+0

정확히 글로벌 변수 란 무엇입니까? 그리고 내 첫 번째 목록의 내용 내에서 무엇을 의미합니까? ? – Surya

+0

@Ovas :이 프로그래밍 언어는 처음 사용한 프로그래밍 클래스입니까? 그렇다면 교수님이 너무 빨리 지나가고 있습니다. 그렇지 않다면 글로벌 변수가 무엇인지 어떻게 알 수 있습니까? –

+0

교수님이 너무 빠르기 때문에 꽤 많이 들었습니다.하지만 이걸 잃을 수는 없어요. 내가 올 수있는 정보를 모으고 싶습니다. 'nodetype'이라는 글로벌 변수를 생각한 것 같습니까? – Surya

0

고객 클래스에 Video 포인터의 목록을 유지하십시오.

고객이 비디오를 대여하는 즉시 위에서 언급 한 해당 비디오의 포인터를 추가하십시오. Video 클래스에 Customer 유형의 단일 포인터를 유지하면 누가 대여했는지에 대한 비디오 목록을 조회 할 수 있습니다.

0

고객 노드는 자체 비디오 목록이 필요합니다. 비디오 노드에 대한 포인터를 고객 노드 데이터 구성원으로 추가하여이를 수행하십시오.

이제 사용하려는 검색 용어와 고객 노드에 대한 포인터를 사용하는 재귀 프로 시저를 작성하십시오. 발견 한 경우 고객 노드를 리턴해야합니다. 예 :

// New method to find the right node. 
CustomerNode* find_customer(string name, CustomerNode* p_node) { 

는 고객의 비디오 목록의 끝에 산책 고객 노드에 멤버 메소드를 추가하고 다른 방법 (마지막에 새로운 영상을두고, 새로운 비디오에게 머리를하고 현재 목록을 추가

// New method to add a video to the customer 
void CustomerNode::add_video(VideoNode* p_video) { 

) 그것에 그런 다음 코드에서 다음과 같이 사용합니다 :

CustomerNode* p_john = find_customer("John", customers_head); 
    if (p_john != NULL) 
     p_john->add_video(p_new_video);