Почему символ должен быть разыменован в этом случае? - PullRequest
0 голосов
/ 28 мая 2019

Я немного потренировался с деревьями в Си для своих курсов для студентов и получил очень странные результаты.

Это код, который не был выведен должным образом. У меня есть дерево с корнем, являющимся структурным узлом * 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.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

двойные кавычки (") в C обозначают строки, которые становятся char * (указатели). Вам нужны одинарные кавычки (') для получения констант символов.

0 голосов
/ 28 мая 2019

Вы пытаетесь преобразовать строку ("") в символ (''). Строка - это const char * или массив символов, или набор символов. Просто переключитесь:

struct node * root = newNode("a");

К

struct node * root = newNode('a');

и так далее для всех ваших конструкторов.

...