当我不知道我需要的数据类型时,我该怎么办?

时间:2014-03-28 16:28:32

标签: c data-structures

我试图使用数据结构和算法创建自己的库。问题是我不知道用于数据变量的类型。有一天,我可能需要使用它来保持整数,另一个用于字符串。知道该怎么办吗?

示例:

typedef struct tree{
    int data;
    struct tree *left;
    struct tree *right;
}tree;

但是如果我想使用字符串,我应该手动更改数据类型还是有办法以其他方式声明数据?

2 个答案:

答案 0 :(得分:2)

如果您只是更改自己程序的内部内容,则可以通过typedef定义自己的数据类型。

typedef int myDataType;
typedef struct tree{
    myDataType data;
    struct tree *left;
    struct tree *right;
} tree;

你真的需要事先决定数据类型是什么(整数,浮点,字符串),或者你以后必须做大量的重写。但是,使用额外的typedef可以节省您的时间并帮助您追踪直接操作或读取数据的所有位置。

此外,如果您只是将结构强制转换为(void*),则可以使用接受(void*)作为参数的泛型函数,然后在函数体中重新构造参数。

int myFunction(void* input) {
  tree* data;
  if (!input) {
    return (-1);
  }
  data = (tree*)input;
  ...
  return 0;
}

int main(void) {
  tree myTree;
  myFunction((void*)&myTree);
  ...
  return 0;
}

答案 1 :(得分:0)

我所说的可能只是胡说八道,但这就是我的想法:工会怎么样?

typedef struct tree{
    union {
        int i;
        char * c;
    } data;
    struct tree *left;
    struct tree *right;
}tree;

这个东西不是你或多或少想要拥有的东西吗?一块内存,可用作intchar *。让我简要解释一下union是什么:当创建union变量时,内存位置与内部最大的一样大。由于union中的所有子变量都将使用相同的内存位置,因此它们将相互覆盖。

例如,如果我要直接从上面创建一个tree,就像这样:

tree asd;

我可以使用data内部以下列方式存储整数:

asd.data.i = 123;

然后我可以在左边创建一个分支,在里面存储一个字符串:

asd.left = malloc( sizeof asd );
asd.left->data.c = malloc( 10 );
memcpy( asd.left->data.c, "kek", 4 );

如果你不喜欢中间的data,你可以省略它!但首先,你必须在声明中省略它。

typedef struct tree{
    union {
        int i;
        char * c;
    };          // <-- removed the data
    struct tree *left;
    struct tree *right;
}tree;

然后,您可以访问ic,而无需在后面写data.

我希望所有这些都不是废话,实际上变得有用,呵呵。