【问题标题】:Building parse tree from prefixed expression in c从c中的前缀表达式构建解析树
【发布时间】:2015-05-24 21:34:01
【问题描述】:

我正在尝试创建这样的二叉树:link

输入将由用户作为前缀输入并作为字符串读取,然后放入二叉树。

这是我目前所拥有的:

struct node{
   char val;
   struct node *left;
   struct node *right;
};
typedef struct node root;
typedef root *tree;

主要:

void main(){
    int i;
    tree tr;
    char* s;
    s=input(); //input function
    tr=create_empty_tree(); 
    for(i=0;s[i]!='\0';i++){
        tr=add_root(s[i],ab);
    }
    convert_infix(tr);
}

这是我几天来一直在苦苦挣扎的部分;我似乎无法正确构建树。 这是我目前所拥有的:

tree add_root(char val, tree tr){
    if ( tr == NULL ){
        tr= create_root(val);
    }
    else{
        if(val=="*" || val=="+" || val=="-" || val=="/"){
            tr->left= add_root(val, tr->left);
        }
        else{
            if(tr->left == NULL){
                tr->left= add_root(val, tr->left);
            }
            else{
                tr->right= add_root(val, tr->right);
            }
        }
    }
    return tr;
}

我在网上查了一下,知道是我的功能不对,我试过这样做:

  • 插入新节点,每次向左移动,直到插入操作数。

  • 回溯到最后一个算子,将下一个节点放到它的右边。

  • 以同样的方式继续。

但我不知道如何回溯。 我已经在这几天了,我快疯了;我只是编程的初学者,所以请不要评判。

【问题讨论】:

  • 实际上并不清楚您实际上在做什么。输入的格式是什么?如果您构建语法树,则节点包含不同的数据:例如运算符和操作数(对于简单的计算器)。操作数总是叶子,操作符总是分支。但这只是一个粗略的猜测。

标签: c data-structures binary-tree prefix infix-notation


【解决方案1】:

你有一个问题,char 不是字符串char*,所以你不能做类似charchar * 之间的比较...... 当"" 用于c 字符串时'' 用于char 即char * 所以替换这个:

    if(val=="*" || val=="+" || val=="-" || val=="/")

通过以下代码

    if(val=='*' || val=='+' || val=='-' || val=='/')

【讨论】:

  • 这当然是一个问题,也是编译器应该警告的一个问题。 @Hanae,您应该注意编译器的警告。在这个阶段,您对 C 的了解不如您的编译器那么多,因此请将它告诉您的内容视为对应该修复的问题的准确诊断。
【解决方案2】:

简单示例(错误检查已被简化)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct node{
   char op;
   int val;
   struct node *left;
   struct node *right;
};

typedef struct node Tree;

char *get_token(char **p){
    while(**p && isspace(**p)){//skip spaces
        ++*p;
    }
    char *ret = *p;
    if(!*ret){//empty
        return NULL;
    }
    while(**p && !isspace(**p)){
        ++*p;
    }
    if(!**p){
        **p = 0;
        ++*p;
    }
    return ret;
}

Tree *make_tree(char **p){
    char *token = get_token(p);

    if(token){
        Tree *tree = malloc(sizeof(*tree));

        switch(*token){//token[1] == '\0' ??
        case '*':
        case '/':
        case '+':
        case '-':
            tree->op = *token;
            tree->val = 0;
            tree->left = make_tree(p);
            tree->right = make_tree(p);
            break;
        default:
            tree->op = 'N';
            tree->val = atoi(token);
            tree->left = tree->right = NULL;
        }
        return tree;
    }
    return NULL;
}

void release(Tree *tree){
    if(tree){
        release(tree->left);
        release(tree->right);
        free(tree);
    }
}

void print_infix(Tree *tree){
    if(tree){
        switch(tree->op){
        case '*':
        case '/':
        case '+':
        case '-':
            putchar('(');print_infix(tree->left);printf(" %c ", tree->op);print_infix(tree->right);putchar(')');
            break;
        case 'N':
            printf("%d", tree->val);
            break;
        default:
            fprintf(stderr, "\nerror!\n");//this should never be executed
        }
    }
}

int main(void){
    char line[256];

    while(fgets(line, sizeof(line), stdin)){
        char *s = line;
        Tree *tree = make_tree(&s);
        print_infix(tree);
        putchar('\n');
        release(tree);
    }
    return 0;
}
#if 0
* + 7 3 - 5 2
((7 + 3) * (5 - 2))
* 3 + 1  2
(3 * (1 + 2))
/ + 1 + 2 3 5
((1 + (2 + 3)) / 5)
^Z
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多