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]
。这是非常重要的,因为这样您就必须担心复制和释放字符串。这就是为什么我们能拿到这么多钱:)