#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#define M 3
typedef struct node
{
char val;
struct node *subTree[M];}NODE;
char buf[255], *str=buf;
NODE *d=NULL;
NODE *makeTree()
{
int k;
NODE *s;
s=new node    ;
s->val=*str++;

for(k=0; k<M; k++) 
s->subTree[k]=NULL;   //先赋初值为null if(*str=='(')
{
k=0;
do
{

str++;
s->subTree[k]=makeTree() ;//makeTree函数递归调用。在执行此语句之前时, 指针S已经有值。 当第一次执行此语句之后, 就会改变指针S的值。也就是说调用makeTree()后, 返回return s; , 再把它赋给s->subTree,是讲不通的。 因为此时,s 的值已经发生了变化。但事实上证明,此程序是正确的, 请问怎样解? 
if(*str==')')
{str++;break;}
k=k+1;
}while(*str==',')    ;

}
return s;
}void main()
{
printf("enter exp:");
scanf("%s", str);
d=makeTree();
cout<<d->val;
}

解决方案 »

  1.   

    s->subTree[k]=makeTree();
    这是递归调用,makeTree()返回的s可不是"s->subTree[k]"中的s,每一次递归都可以理解为调用了另外一个函数.可以这么设想帮助理解,有一个函数func();内容与makeTree一样,返回的s是func()中的那个.
      

  2.   

    to :弥弥。
    可以这么设想帮助理解,有一个函数func();内容与makeTree一样,返回的s是func()中的那个
    这样理解确实是容易接受的。to : 林平之
    你说的,递归调用,栈上的变量不会互相影响 。也是想说两个s的地址是不同的吧,
    你后面那句"栈上的变量不会互相影响 " 好像是高度概括, 又好像难于理解。
    首先,我没有定义什么栈这个东西, 这只是递归调用。两个s 按定义的形式来讲应该是同一个变量才对
      

  3.   

    to :弥弥。
    可以这么设想帮助理解,有一个函数func();内容与makeTree一样,返回的s是func()中的那个
    这样理解确实是容易接受的。to : 林平之
    你说的,递归调用,栈上的变量不会互相影响 。也是想说两个s的地址是不同的吧,
    你后面那句"栈上的变量不会互相影响 " 好像是高度概括, 又好像难于理解。
    首先,我没有定义什么栈这个东西, 这只是递归调用。两个s 按定义的形式来讲应该是同一个变量才对
      

  4.   

    在递归调用中,其局部变量都是重新分配内存空间的,因此这些局部变量虽然有着相同的变量名,但在不同级的函数调用中,其在内存中的地址是不一样的,取值的改变自然也就不会相互影响了。bcpl(林平之) 所言的栈,并非你所定义的栈,而是windows程序调用的时候自动建立的,函数调用时参数等都要依次自动进栈,而函数调用结束后又依次自动出栈。
      

  5.   

    递归(recurrences)是一种分而治之(divide-and-conquer)思想
    建议看一下算法导论
    你就会豁然开朗的
    静下心三个月好好学一下算法
    终身受益
    很多,像弥弥讲的你不一定一下子能理解
    慢慢来
    May you succeed!