【问题标题】:C Linked lists storing different data types? [duplicate]C链表存储不同的数据类型? [复制]
【发布时间】:2018-10-15 23:15:23
【问题描述】:

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

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)并且基本上只是复制和重命名与列表一起使用的一半函数?并有 initList2(struct list2 *)...

或者我应该创建类似的东西:

struct data
{
    void *data;
    char *data_type;
};

并将其存储在列表中?

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

【问题讨论】:

  • void * 技术可能需要大小和指针。主要问题是确保存储在每个列表中的数据是同质的(因为如果不是,您需要信息来告诉您列表中每个条目的类型,这仍然会变得更加复杂)。另一个建议可以很好地工作,特别是如果您可以使界面对客户端不透明。对每种类型的函数集的名称要严格系统化。考虑一下是否应该迁移到 C++ 并支持模板。考虑是否在 C 中模拟模板。
  • 当你使用 C++(我希望你这样做)你会觉得'啊哈,这就是他们有模板和泛型的原因,......我不得不在 C 中艰难地做到这一点'
  • @JonathanLeffler 在这个问题中没有 typedefs 和不完整的结构声明......我仔细检查过......你可以继续写一个答案。
  • 我知道C++和它的模板,但是因为它是一个学校项目,我必须用C来做。
  • stackoverflow.com/questions/18577404/…。问题是关于数组的,但这里可以使用相同的技术。

标签: c linked-list


【解决方案1】:

看看联合类型Union

【讨论】:

  • 工会有问题。例如,如果您有struct list_item { struct list_item *next; union u data; };union u { int i; double d; char s[1024]; };,那么在使用intdouble 时会浪费大量空间。您还需要一个鉴别器来告诉您给定元素中存储了什么。
  • @JonathanLeffler 有没有更好的方法通过为联合中的最大类型保留空间而不浪费空间?
  • @Barmar:在字符串(数组)的特定情况下,您将在联合中存储一个指针和可能的长度,并单独分配大空间。这也可能适用于结构类型。另一个问题是知道你存储的指针是什么——C 不在乎,但你的程序会。
  • @JonathanLeffler 好点,您应该使用char *s 而不是char s[SIZE]。这很重要,因为您必须担心复制和释放字符串。这就是我们得到大笔报酬的原因:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多