Я немного потренировался с деревьями в Си для своих курсов для студентов и получил очень странные результаты.
Это код, который не был выведен должным образом. У меня есть дерево с корнем, являющимся структурным узлом * root, и функция предварительного заказа печатает данные на каждом узле дерева.
struct node{
char data;
struct node * left;
struct node * right;
};
struct node* newNode(char data){
struct node* node = malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
void preorder(struct node * root){
//struct node * start = root;
struct node * L;
struct node * R;
if(root!=NULL){
printf("%c",root->data);
preorder(root->left);
preorder(root->right);
}
}
int main(){
struct node * root = newNode("a");
root->left = newNode("b");
root->right = newNode("c");
root->left->left = newNode("d");
root->left->right = newNode("e");
root->right->left = newNode("f");
root->right->right = newNode("g");
preorder(root);
return 0;
}
Я ожидал, что вывод будет "abdecfg", но вместо этого терминал выводит странный результат как таковой; https://i.imgur.com/LudpUn7.png.
Я получаю предупреждение GCC «Назначение [Warning] делает целое число из указателя без приведения», но я не понимаю, почему.
Если я использую звездочку разыменования на входах символов, ошибка прекращается, и я получаю ожидаемый результат, как этот;
int main(){
struct node * root = newNode(*"a");
root->left = newNode(*"b");
root->right = newNode(*"c");
root->left->left = newNode(*"d");
root->left->right = newNode(*"e");
root->right->left = newNode(*"f");
root->right->right = newNode(*"g");
preorder(root);
return 0;
}
Обратите внимание, что это не сработает [1], если вместо этого я добавлю звездочку разыменования на вход newNode.
Заранее спасибо за любую помощь.