2011-09-29 3 views
0

안녕하십니까 저는 CS 과제 (2 학년 C 논문)를 시작하려고합니다.2 개의 개별 ADT를 하나로 결합하기

이 과정에서 이진 검색 트리 ADT와 빨강 검정 트리 ADT를 만들었습니다. 그것들을 사용자 입력에 따라 Red Black Tree 또는 Binary Search Tree 중 하나를 선택하는 하나의 일반 "Tree"ADT로 결합해야합니다.

새로운 열거 형을 정의하여 시작했습니다. treetype_t 어느 RBT 또는 BST로 설정할 수 있습니다 ... 내 첫 번째 질문은 어떻게 ADT가 선택됩니다 모르겠어요 이후 구조체를 선언합니까? 예 :

struct bstnode { 
    char *key; 
    bst left; 
    bst right; 
}; 

을 내 RBT 파일에 내가 가진 : 내 bst.c 파일에 내가 가진

struct rbtnode { 
    char *key; 
    colour_t colour; 
    rbt left; 
    rbt right; 
}; 

내 첫번째 생각은 같은

if (treetype_t == RBT){ 
      struct rbtnode { 
     char *key; 
     colour_t colour; 
     rbt left; 
     rbt right; 
    }; 
    } 
    else{ 

     struct bstnode { 
     char *key; 
     bst left; 
     bst right; 
    }; 
} 

그러나 if 문을 가지고 있었다 나는 이것이 효과가 있다고 생각하지 않는다. 나는 다른 접근법을 생각할 수 없다 - 어떤 생각?

답변

0

코드에서와 같이 런타임에 구조 정의를 변경할 수 없습니다. 사전 처리기의 # if/# ifdef 지시문을 사용하여 컴파일 할 때만 변경할 수 있지만 사용자 입력이 아직 없기 때문에 너무 빠릅니다 (단, 사용자가 직접 소스 코드를 수정하고 다시 컴파일 할 수있는 경우는 제외).).

struct rbtnode { 
    char *key; 
    colour_t colour; 
    rbt left; 
    rbt right; 
}; 

struct bstnode { 
    char *key; 
    bst left; 
    bst right; 
}; 

union bst_or_rbt_node { 
    struct bstnode bst_node; 
    struct rbtnode rbt_node; 
}; 

그런 다음 당신은 노동 조합의 rbt_node 구성원 또는 사용자 입력에 따라 bst_node 멤버 중 하나를 사용 할 수있는 일

조합 키워드를 사용하여 하나에 그 구조를 결합이다.

bst_or_rbt_node에 충분한 공간을 할당했는지 확인하십시오 (가장 안전한 것은 sizeof (bst_or_rbt_node)).

또한 rbt 및 bst가 포인터 유형이되기를 바랍니다.

유니언을 사용할 필요는 없지만 현재 수준에서는 예를 들어 포인터를 사용하는 것보다 다루기가 쉽습니다. void, 포인터 캐스트.

관련 문제