简体   繁体   English

C语言中的递归后序遍历和sprintf

[英]Recursive post-order traversal and sprintf in C

I am traversing binary tree using this function. 我正在使用此功能遍历二叉树。 I am pretty sure the proper saving of new values (skip to 'current output') to nodes keeps failing on sprintf(buffer, "var%i", counter): i wonder why. 我很确定正确地将新值(跳到“当前输出”)保存到节点会导致sprintf(缓冲区,“ var%i”,计数器)失败:我想知道为什么。

static int counter = 1;

void postorder(tASTPointer* Root) {

if (Root == NULL)
    return;
postorder(Root->LeftPointer);
postorder(Root->RightPointer);


if((!strcmp(Root->ID,"*")) || (!strcmp(Root->ID,"+"))) {

    printf("DEFVAR var%i\n",counter);

    if(!strcmp(Root->ID,"*")) // multiplication
        printf("MUL var%i %s %s\n", counter,
               Root->LeftPointer->content->name,
               Root->RightPointer->content->name);
    else if(!strcmp(Root->ID,"+")) // addition
        printf("ADD var%i %s %s\n", counter,
               Root->LeftPointer->content->name,
               Root->RightPointer->content->name);


    char buffer[25];
    for (int i = 0; i < 25; i++)
        buffer[i] = '\0';

    sprintf(buffer, "var%i", counter);
    Root->content->name = buffer;

    //for (int i = 0; i < 25; i++)
    //    buffer[i] = '\0';

    counter++;

    printf("Root contains: %s\n", Root->content->name);
    printf("LeftPointer contains: %s\n", Root->LeftPointer->content->name);
    printf("RightPointer contains: %s\n\n", Root->RightPointer->content->name);

    }
    }

More information 更多信息

I am processing binary tree created by leaf nodes - numbers and operation nodes, in this case * and +. 我正在处理由叶节点创建的二叉树-数字和运算节点,在这种情况下为*和+。 My goal is to change every operation_node->name to original id. 我的目标是将每个operation_node-> name更改为原始ID。

Original tree looks like: 原始树看起来像:

            +
         |     |
         *     *
       |   |  |  |
       1   2  3  4

What I am trying for: 我想要的是:

           var3
         |     |
       var1   var2
       |   |  |  |
       1   2  3  4

Desired output (assembler-like): 所需的输出(类似汇编程序):

DEFVAR var1
MUL var1 1 2 // 1*2, save to var1

DEFVAR var2
MUL var2 3 4

DEFVAR var3
ADD var3 var1 var2 // var1 + var2, save to var3

Current output: 电流输出:

DEFVAR var1
MUL var1 1 2

DEFVAR var2
MUL var2 3 4

DEFVAR var3
ADD var3 var2 var2 // something wrong with buffer?

Question

If anyone would care to explain why this keeps happening (and possibly provide some solution), I would be grateful. 如果有人愿意解释为什么这种情况持续发生(并可能提供一些解决方案),我将不胜感激。

This is guess that as the counter keeps incrementing as recursively function stack keeps increasing counter has to hold old value of previous recursive call. 可以推测,随着计数器的递归和函数堆栈的递增,计数器必须保持先前递归调用的旧值。 To verify just decrement counter on return from recursive call. 要验证递归调用返回时的递减计数器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM