我试图使用数据结构和算法创建自己的库。问题是我不知道用于数据变量的类型。有一天,我可能需要使用它来保持整数,另一个用于字符串。知道该怎么办吗?
示例:
typedef struct tree{
int data;
struct tree *left;
struct tree *right;
}tree;
但是如果我想使用字符串,我应该手动更改数据类型还是有办法以其他方式声明数据?
答案 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;
这个东西不是你或多或少想要拥有的东西吗?一块内存,可用作int
或char *
。让我简要解释一下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;
然后,您可以访问i
和c
,而无需在后面写data.
。
我希望所有这些都不是废话,实际上变得有用,呵呵。