Добавить строковые узлы в дерево выражений - PullRequest
0 голосов
/ 30 апреля 2020

Я потратил много дней, пытаясь рекурсивно добавлять строки из префиксного выражения, например: + 1.5 * 13 2.5 внутри двоичного дерева. Я использую функцию strtok для разделения элементов строки, но как мне добавить элементы в дерево?

Мой код очень похож на пример GeeksForGeeks: https://www.geeksforgeeks.org/building-expression-tree-from-prefix-expression/ , но здесь они только добавляют символы в качестве данных на узле.

 typedef struct node { 
        char * data; 
        struct node *left, *right; 
    } node; 

// Function to recursively build the expression tree 
char* add(node** p, char* a) 
{ 

    // If its the end of the expression 
    if (*a == '\0') 
        return '\0'; 

    while (1) { 
        char* q = "null"; 
        if (*p == NULL) { 

            // Create a node with *a as the data and 
            // both the children set to null 
            node* nn = (node*)malloc(sizeof(node)); 
            nn->data = *a; 
            nn->left = NULL; 
            nn->right = NULL; 
            *p = nn; 
        } 
        else { 

            // If the character is an operand 
            if (*a >= '0' && *a <= '9') { 
                return a; 
            } 

            // Build the left sub-tree 
            q = add(&(*p)->left, a + 1); 

            // Build the right sub-tree 
            q = add(&(*p)->right, q + 1); 

            return q; 
        } 
    } 
} 

int main() 
{ 
    node* s = NULL; 
    char a[] = "3.5 + 4.7";

     // (...) tokens

    add(&s, str); 

    return 0;
}

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 30 апреля 2020

В примере geeksforgeeks они используют char data в структуре. Но на вашей стороне вы используете char * data, поэтому вы должны использовать strcpy для копирования данных из strtok в data структуры. В этом случае вы должны выделить память для data каждого node. Если вы не хотите выделять, вы можете изменить char * data в структуре node на char data[20].

Например:

node* nn = malloc(sizeof(node));
if(!nn) {
   //handle the error
}
nn->data = malloc((sizeof(char)*20) // For example max size of data is equal to 20

char * token = strtok(str, delim); // you choose delim as you want to split the string str
While(token!=NULL) {
   strcpy(nn->data, token);
   token = strtok(NULL, delim);
}
...