2014-04-14 1 views
1

2 가지 다른 구조가 있지만 동일한 일반 목록에 포함해야합니다.C-Void 포인터가 일반 목록에 포함되어 있습니다 (구조체 포함)

 typedef struct Val1{ 
     int num1; 
     int num2; 
     int num3; 
    }Val1; 



    typedef struct Val2{ 
    char name[50]; 
    char surname[50]; 
    int ID; 
    }Val2; 

그리고 목록은 다음과 같습니다 :

구조는

typedef stuct list { 
    void *value; 
    struct node *next; 
}list; 

typedef struct L_head{ 
node *head; 
int num_members; 
}L_head; 

내가 같은리스트의 구현을 사용해야하지만 목록은 strucrure types.I 캔트을 모두 처리해야 목록을 초기화하고 목록에 몇 가지 요소를 추가하는 방법을 알아보십시오. 모든 조언이 도움이 될 것입니다.

+1

은 그래서 실제로 목록은 무효 포인터로 가득 할 것이다 이들 각각 void 포인터는'Val1' 또는'Val2'를 가리 킵니다. 이제 목록에서이 void 포인터 중 하나를 검색한다고 가정 해보십시오. 실제로 이것이 Val1 또는 Val2를 가리키는 지 어떻게 알 수 있습니까? –

답변

0

void 포인터의 두 요소 배열을 가질 수 있습니다. 하나는 유형 1의 구조체를 가리키고 다른 하나는 유형 2를 가리 킵니다. 그러면 올바른 형변환으로 올바른 구조를 얻는 데 도움이됩니다.

+0

그리고 목록에서 포인터를 가져올 때 void 포인터가 가리키는 구조를 어떻게 알 수 있습니까? –

+0

원칙적으로 첫 번째 요소가 struct 1로 표시되고 두 번째 요소가 struct 2로 표시되면? – Prabhu

+0

죄송합니다. 내 첫 번째 의견을 무시하고 쓰레기입니다. 실제로 asker는 ** 같은 ** 목록에 그들을 저장하고 싶었습니다. –

0

목록 항목을 추가하려면 (void *)로 캐스팅해야합니다.

액세스 할 때 다시 유형을 결정하려면 해당 유형을 저장하는 목록에 다른 필드 (열거 형)를 추가 할 수 있습니다.

나는 이것이 약간 훈련 또는 숙제다는 것을 내기했다. C++이 가능한 경우 : std::list 또는 boost::list 구현을 사용하여 시작하십시오.

+2

그리고 void 포인터가 가리키는 구조체의 크기의 크기를 어떻게 확인하겠습니까? –

+0

당신은 짐작했다. 숙제이다. (고마워!) – Hlias

+1

@ user3495204 : 질문은 C가 아니라 C++이기 때문에 std가 향상되지 않는다. –

3

C에 대한 표준 솔루션은 두 구조에 서로 다른 값을 갖는 공통 초기 필드를 추가합니다.

typedef struct Val1 { 
    int discriminator; 
    int num1; 
    int num2; 
    int num3; 
} Val1; 

typedef struct Val2 { 
    int discriminator; 
    char name[50]; 
    char surname[50]; 
    int ID; 
} Val2; 

필요한 경우 새 구조체를 대신 정의 할 수 있습니다. 이전 배치 및 정렬 보장을 유지하는 장점이있다
: 어쨌든

struct packed { 
    int discriminator; 
    union {struct Val1;struct Val2}; 
}; 

, 당신은 직접 노드에 통합 할 수 있습니다 :

typedef stuct node { 
    struct node *next; 
    int discriminator; /* You might want to reserve 0 for no content */ 
    union {struct Val1;struct Val2}; 
} node; 

솔루션의 기술 용어는 "노조 차별 ". 당신이 각 노드의 유형을 구별 할 수있는 경우

0

, 당신처럼, C 조합에 의지 할 수있는 :

typedef struct Val1{ 
    int num1; 
    int num2; 
    int num3; 
} Val1; 

typedef struct Val2{ 
    char name[50]; 
    char surname[50]; 
    int ID; 
} Val2; 

union { 
    Val1 val1; 
    Val2 val2; 
} Val; 
+0

'Val'에 대한 포인터가 있다면 실제로 Val1인지 Val2인지 어떻게 알 수 있습니까? –

+0

그리고 실제로 나는 "당신이 구별 할 수 있다면 ..."이라고 썼습니다. 물론, 응용 프로그램이 더 잘 알지 못하면 추가 플래그가 필수입니다. –