我有两种不同的结构,但我需要将它们包含在相同的通用列表中。
结构是:
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;
我需要使用相同的列表实现,但列表需要处理两个 结构类型。我无法弄清楚如何初始化列表并将一些元素放在列表中。任何建议都会有所帮助。
答案 0 :(得分: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;
解决方案的技术术语是"歧视联盟"。
答案 1 :(得分:0)
你可以有一个两元素的void指针数组 - 一个指向类型1的结构,另一个指向类型2.这应该有助于使用正确的转换来获得正确的结构。
答案 2 :(得分:0)
要添加列表项,您需要将它们转换为(void *)。
为了在访问时再次确定类型,您可以在列表中添加另一个字段(枚举),用于存储它的类型。
我打赌这是一些培训或家庭作业。如果C ++是可能的: 开始使用std::list或boost::list实施。
答案 3 :(得分: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;