Похоже, вы пытались использовать указатель на функцию. Для этого вам нужно будет объявить указатель на функцию к функции, которые возвращают Tree*
, а не Tree*
непосредственно:
if(choose==0) {
Tree* (*CreateTree)(void);
CreateTree = &GetNewTreeInt;
}
Однако, ваши две функции идентичны, так как линия *((int*)newTree->data);
не имеет побочных эффектов. Вы можете просто создать функцию, как это вместо:
Tree* GetNewTreeInt(void){
Tree* newTree = (Tree*)malloc(sizeof(Tree));
newTree->left = newTree->right = NULL;
return newTree;
}
Это когда вы получаете доступ tree->data
, что вам нужно, чтобы бросить void *
к указателю типа вы знаете, он содержит. Если вы не знаете, какой тип дерева у вас снаружи, вы должны добавить еще одно поле в свою структуру, которое означает, какой тип данных хранится. Если вы только сохраняете небольшие типы данных, такие как int
и char
Я бы рекомендовал использовать объединение вместо указателя void, так как объединение будет хранить данные внутри Дерева в памяти. В любом случае вам все равно потребуется что-то в вашем дереве, чтобы указать, какой тип данных он хранит.
typedef struct Tree {
// 0 means there is an int in tree->data.i,
// 1 means there is a char in tree->data.c
int type;
union {
int i;
char c;
} data;
struct Tree *left;
struct Tree *right;
} Tree;
Тогда ваши две функции становятся:
Tree* GetNewTreeInt(void){
Tree* newTree = (Tree*)malloc(sizeof(Tree));
newTree->type = 0;
newTree->data.i = 0; // Set an initial value
newTree->left = newTree->right = NULL;
return newTree;
}
Tree* GetNewTreeChar(void){
Tree* newTree = (Tree*)malloc(sizeof(Tree));
newTree->type = 1;
newTree->data.c = '\0'; // Set an initial value
newTree->left = newTree->right = NULL;
return newTree;
}
И вы можете использовать указатель на функцию так же, как это:
if(choose==0) {
Tree* (*CreateTree)(void);
CreateTree = &GetNewTreeInt;
Tree* tree = CreateTree();
tree->data.i = 7;
}
Каждое дерево будет иметь либо data.i
или data.c
, но не оба, позже, когда вы пересекаете свои деревья, вы можете проверить их тип, чтобы узнать, какие:
if (tree->type == 0) {
int data = tree->data.i;
} else if (tree->type == 1) {
char data = tree->data.c;
}
EDIT
Если вы действительно хотите использовать void *
, вы можете добавить int type
к вашей структуры, и при прохождении вы могли бы сделать что-то вроде этого:
if (tree->type == 0) {
int data = *(int *)tree->data;
} else if (tree->type == 1) {
char data = *(char *)tree->data;
}
Вы сдаете на другой стороне задания ... 'root = (void *) CreateTree()' – user590028
Строка '* ((int *) newTree-> data);' не имеет никакого эффекта make' GetNewTreeInt 'и' GetNewTreeChar' точно такие же функции. – nwellnhof
@nwellnhof инициализация переменных будет выполняться позже после ввода от пользователя – gbox