通用列表中的C-Void指针(包含结构)

时间:2014-04-14 13:11:15

标签: c list pointers generics structure

我有两种不同的结构,但我需要将它们包含在相同的通用列表中。

结构是:

     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;

我需要使用相同的列表实现,但列表需要处理两个 结构类型。我无法弄清楚如何初始化列表并将一些元素放在列表中。任何建议都会有所帮助。

4 个答案:

答案 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::listboost::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;