广义表:(A(B(,D(E,F)),C))
按广义表表示二叉树结构生成二叉链表的算法:
BinTNode CreateTree (char str) {
//str为存储广又表的字符串的指针
BinTNode *St [100];
//用指针数组模拟栈
BinTNode *p=NULL;
int top, k, j=0;
top=-1;
//置空栈
char ch=str[j];
BinTNode *b=NULL;
while (ch!='\0') {
//循环读广义表字符串中字符
switch (ch) {
case ' (':
top++;
St[Top]=p;
k=1;
break;
case ') ':
top--;
break;
case ',':
k=2;
break;
default:
p=(BinTNode *) malloc(sizeof (BinTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if (b==NULL)
b=p;
else {
switch (k) {
case 1:
St[top]->lchild=p;
break;
case 2:
St[top]->rchild=p;
break;
}
}
}
j++;
ch=str[j];
return b;
}
}
第一次循环时top值是多少?
第三次循环后top变成多少?
第四次循环时top值是多少,不应该是等于1吗,但St[0]-lchild
被赋的值才是B,这里第四次循环是St[1]-lchild
被赋的值是B,出错在哪了?
请帮忙解释每次循环代码的意义,每次循环栈的变化。
原题目代码没排版太乱了,帮你整理了一下,但似乎 break 的数量还有花括号的数量都不成对儿,不知道是不是你完整的代码。
不过你这里 switch 判断的真的对么……
这咋前后还各有一个空格?