我试图用数据结构和算法制作我自己的库。问题是我不知道用什么类型的数据变量。有一天,我可能需要用这个来保存整数,另一个用于字符串。任何想法该怎么办?当我不知道我需要的数据类型时,该怎么办?
例子:
typedef struct tree{
int data;
struct tree *left;
struct tree *right;
}tree;
但是,如果我想使用的字符串,我应该手动更改数据类型或者有一种方法来申报数据的其他方式?
我试图用数据结构和算法制作我自己的库。问题是我不知道用什么类型的数据变量。有一天,我可能需要用这个来保存整数,另一个用于字符串。任何想法该怎么办?当我不知道我需要的数据类型时,该怎么办?
例子:
typedef struct tree{
int data;
struct tree *left;
struct tree *right;
}tree;
但是,如果我想使用的字符串,我应该手动更改数据类型或者有一种方法来申报数据的其他方式?
有可能我说的话可能只是胡说八道,但我的想法如下:工会呢?
typedef struct tree{
union {
int i;
char * c;
} data;
struct tree *left;
struct tree *right;
}tree;
这不是你想要的或多或少想要的吗?一块内存,可用作int
或char *
。让我简要解释一下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;
然后你就可以不用写data.
后面访问都i
和c
。
我希望这一切都不是废话,实际上变得有用,嘿。
这是一个体面的妥协,但它掩盖了对API /界面设计的糟糕计划。如果它是单个字符或大量结构体的联合,它也可能是非常浪费的。 – DevNull
@Dogbert结构数组只有一个指针的大小,不能超过char *或任何其他指针......但是,如果同时存在一个“double”和“char” ,那么你会浪费一些空间。 – ThoAppelsin
我不同意。您实际上可以在一个结构中分配一个完整的数组,这个数组在堆栈中自动分配。更有效的方法是在堆上动态初始化一个指向结构的指针,但它仍然是可能的。而且,并非所有的指针都是相同的大小(即:函数指针vs原始数据类型指针)。 – DevNull
如果你只是改变你自己的程序的内部胆量,你可以通过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;
}
我认为你的问题缺乏详细的描述。给出一个你想要实现的例子 –
你可以尝试使用'void *'。但你应该分享你的情况的更多细节。 – Aliou
也许库函数'qsort'可以作为灵感。 http://www.cplusplus.com/reference/cstdlib/qsort/ –