繁体   English   中英

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

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

我正在使用此功能遍历二叉树。 我很确定正确地将新值(跳到“当前输出”)保存到节点会导致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);

    }
    }

更多信息

我正在处理由叶节点创建的二叉树-数字和运算节点,在这种情况下为*和+。 我的目标是将每个operation_node-> name更改为原始ID。

原始树看起来像:

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

我想要的是:

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

所需的输出(类似汇编程序):

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

电流输出:

DEFVAR var1
MUL var1 1 2

DEFVAR var2
MUL var2 3 4

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

如果有人愿意解释为什么这种情况持续发生(并可能提供一些解决方案),我将不胜感激。

可以推测,随着计数器的递归和函数堆栈的递增,计数器必须保持先前递归调用的旧值。 要验证递归调用返回时的递减计数器。

暂无
暂无

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

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