C存储不同数据类型的链表?

C存储不同数据类型的链表?,c,linked-list,C,Linked List,我正在做一个学校项目,我需要多个链表,每个链表存储不同类型的值。到目前为止,我有: struct list_element { struct list_element *next; int data; }; struct list { struct list_element *first; }; 还有一些与之配合使用的函数,如initList(struct list*)、deleteList(struct list*)、add(struct list*)等 但我还需要

我正在做一个学校项目,我需要多个链表,每个链表存储不同类型的值。到目前为止,我有:

struct list_element
{
    struct list_element *next;
    int data;
};

struct list
{
    struct list_element *first;
};
还有一些与之配合使用的函数,如initList(struct list*)、deleteList(struct list*)、add(struct list*)等

但我还需要一个列表,它代替int作为数据存储,例如float

在C中,正确的方法是什么?我是否只需要创建另一个结构(list2),基本上只需复制和重命名与list一起工作的一半函数?并使initList2(struct list2*)

或者我应该创建如下内容:

struct data
{
    void *data;
    char *data_type;
};
并将其存储在列表中


这两个我都不喜欢,但我没有其他想法。

看看联合类型

使用
void*
技术可能需要大小和指针。主要的问题是确保存储在每个列表中的数据是同质的(因为如果不是同质的,则需要信息来告诉您列表中每个条目的类型,这会变得更加复杂)。另一个建议可以相当好地工作,特别是如果您可以使接口对客户机不透明的话。对于每种类型的函数集的名称,一定要严格系统化。考虑是否应该迁移到C++,支持模板。考虑一下在C.when中是否模仿模板(C++)(我希望你这样做),你会去“AHA,这就是为什么他们有模板和泛型,……我不得不这么做,在C’@ JONAATEN LIFFLE中,没有这个问题中的类型错误和散乱结构声明。我仔细检查了一下。。。你可以继续写一个答案。我知道C++和它的模板,但是因为它是一个学校项目,所以我必须在C中做。问题是关于数组,但这里也可以使用相同的技术。联合也有问题。例如,如果您有
struct list_item{struct list_item*next;union u data;}
并集u{int i;双d;字符s[1024];}int
double
,则会浪费大量空间。您还需要一个鉴别器来告诉您在给定元素中存储了什么。@JonathanLeffler有没有更好的方法不浪费空间,为联合体中最大的类型保留空间?@Barmar:在字符串(数组)的特定情况下,您应该在联合体中存储指针和长度,并分别分配大空间。这可能也适用于结构类型。另一个问题是知道您存储的指向-C的指针是什么并不重要,但您的程序会关心。@JonathanLeffler很好的一点,您应该使用
char*s
而不是
char[SIZE]
。这是非常重要的,因为这样您就必须担心复制和释放字符串。这就是为什么我们能拿到这么多钱:)