2013-04-12 2 views
0

C++에서 해시 트리를 코딩하고 있는데, 여기에는 두 가지 유형의 노드가 필요합니다. 즉, 비 리프에 대해 하나는 자식 노드를 가리키고 다른 노드는 필수 정보를 포함하는 리프 노드를 가리 킵니다.두 가지 다른 유형의 노드에 대한 포인터

제가 직면 한 문제는 비 리프 노드에서 포인터를 선언 할 수 있다는 것입니다. 일부 비 리프 노드는 다른 비 리프 노드를 가리키고 일부는 리프 노드를 가리켜 야하기 때.입니다. 그래서 잎이 아닌 노드의 포인터에 하나의 포인터 유형을 선언 할 수 없습니다.

도움을 주시면 감사하겠습니다.

+0

C 또는 C++로 코딩하고 있습니까? – NPE

+0

기본적으로 C++의 @NPE이지만 두 가지 모두에서 편안합니다. –

답변

2

이 포인터는 문제의 포인터가 노드 또는 리프를 가리키고 있는지 여부를 알려주는 머리글의 유니온과 플래그로 접근합니다.

struct Header 
{ 
    int isLeaf; 
} 

struct Leaf 
{ 
    struct Header header; 
    struct LeafBody body; 
} 

struct Node 
{ 
    struct Header header; 
    struct NodeBody body; 
} 

union Entity 
{ 
    struct Header header; 
    struct Node node; 
    struct Leaf leaf; 
} 
+0

그러면 노드의 구조가 어떻게 될지 조금 더 설명 할 수 있습니까? –

+0

위의 편집 도움이 되셨습니까? 아니면 더 필요하십니까? 'NodeBody'는'Entity'의 인스턴스에 대한 포인터 일 수 있습니다. –

0

여기에는 몇 가지 해결책이 있습니다. 잎에서 잎이 아닌 잎을 단순히 만들어서 다형성으로 처리 할 수 ​​있습니다. 또는 유니온과 플래그를 사용하여 사용할 유니 코드와 플래그를 결정하십시오. 또는 모든면에서 가장 더럽지 만 때로는 유효하지만 간단한 무효 *는 언제든지 원하는대로 다시 캐스트 할 수 있습니다. 특정 요구에 따라 : 유니온이 가장 잘 수행되고, 다형성이 가장 판독 가능하며, void *는 유니온과 동일한 성능을 나타내고, 맛에 따라 유니온을 싫어하는 사람에게는 더 깨끗한 코드가됩니다.

3

리프 노드와 리프 노드가없는 것보다 데이터 포인터가있는 노드 클래스를 하나만 가질 수 있습니다. 노드가 리프 노드가 아닌 경우 데이터 포인터는 NULL이됩니다. 노드가 리프 노드이면 Node*NULL이됩니다.

struct Node 
{ 
    Node *child; // NULL if leaf node 
    Data *data; // NULL if not leaf node 
}; 
+0

일반적인 응용 프로그램에서는 문제가 아닌 큰 트리의 중요한 문제 일 수있는 유일한주의 사항이 있습니다. 이 접근법은 항목 자체를 할당하는 것 이외에 1/2이 사용되지 않는 테이블의 모든 항목에 대해 두 개의 포인터를 할당해야합니다. 가능성이 큰 문제는 ... 테이블이 거대하면 잠재적으로 매우 큰 메모리 싱크입니다. –

관련 문제