2014-03-28 56 views
1

我试图用数据结构和算法制作我自己的库。问题是我不知道用什么类型的数据变量。有一天,我可能需要用这个来保存整数,另一个用于字符串。任何想法该怎么办?当我不知道我需要的数据类型时,该怎么办?

例子:

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

但是,如果我想使用的字符串,我应该手动更改数据类型或者有一种方法来申报数据的其他方式?

+0

我认为你的问题缺乏详细的描述。给出一个你想要实现的例子 –

+6

你可以尝试使用'void *'。但你应该分享你的情况的更多细节。 – Aliou

+1

也许库函数'qsort'可以作为灵感。 http://www.cplusplus.com/reference/cstdlib/qsort/ –

回答

0

有可能我说的话可能只是胡说八道,但我的想法如下:工会呢?

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

这不是你想要的或多或少想要的吗?一块内存,可用作intchar *。让我简要解释一下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.后面访问都ic

我希望这一切都不是废话,实际上变得有用,嘿。

+0

这是一个体面的妥协,但它掩盖了对API /界面设计的糟糕计划。如果它是单个字符或大量结构体的联合,它也可能是非常浪费的。 – DevNull

+0

@Dogbert结构数组只有一个指针的大小,不能超过char *或任何其他指针......但是,如果同时存在一个“double”和“char” ,那么你会浪费一些空间。 – ThoAppelsin

+0

我不同意。您实际上可以在一个结构中分配一个完整的数组,这个数组在堆栈中自动分配。更有效的方法是在堆上动态初始化一个指向结构的指针,但它仍然是可能的。而且,并非所有的指针都是相同的大小(即:函数指针vs原始数据类型指针)。 – DevNull

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; 
} 
相关问题