阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。 【说明】 设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根节点的值部分(设为一个字符)和用“()”,括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例

admin2009-05-15  19

问题 阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。
【说明】
   设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根节点的值部分(设为一个字符)和用“()”,括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例如下面的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。
        
   本程序输入列表,生成一棵M叉树,并由M叉树输出列表。假定输入无错误。
   【函数5-8】
   #inelude<stdio.h>
   #include<stdlib.h>
   #define M3
   typedef struct node{
         char val;
         street node *subTree[M];
   }NODE;
   char buf[255], *six = buf;
   NODE *d = NULL;
   NODE *makeTree()/*由列表生成M叉树*/
   {
      int k;
      NODE *s;
      s=(1);
      s->val=*six++;
      for(k=0; k<M; k++)s->subTree[k]=NULL;
      if(*str==’(’){
            k=0;
            do{
                  six++;
                  s->subTree[k]=(2);
                  if(*str==’)’){
                         six++;
                         break;
                  }
                  k=k+1;
            }while((3));
      }
      return s;
   }
   void walkTree(NODE *t)/*由M叉数输出列表*/
   {
         int i;
         if(t !=NULL){
               (4);
             if(t->subTree[0]==NULL)return;
             putchar(’(’);
             for(i=0;i<M; i++){
                   (5);
                  if(i !=M-1 && t->subTree[i+1]!=NULL)
                        putchar(’,’);
             }
             putchax(’)’);
        }
   }
   void main()
   {
        prinff("Enter exp:");
        scanf("%s", str);
        d = makeTree();
        walkTree(d);
        putchaW’,n’);
   }

选项

答案(1) (NODE*)malloc(sizeoffNODE)) (2) makeTree() (3) *str==’,’ (4) putchar(t->val) (5) walkTree(t->subTree[i])

解析 本题考查M叉树的应用,是一种二叉树的推广,只是将子树的数目由2推广为M,这样子树需要用一个数组来存储,在此为node结构中的subTree字段。
   函数makeTree是根据列表生成M叉树。空(1)比较简单,变量s已声明为NODE指针,紧接着有对其的引用s->val,将列表中的第一字符赋值给s中的val字段,而指针在引用前需要指向确定的内存单元,此处应该申请内存空间,故空(1)应填(Node*)malloc(sizeof(NODE))。
   接着用for循环将s的子树指针列表初始化为NULL。根据题中说明,列表的结构中子树用括号括起来。因此判断列表中的下一个字符是否为左括号“(”,如果不是,说明没有子树:如果是,则生成子树。通过do-while循环来生成子树列表。根据M叉树的递归性质,可得空 (2)应填makeTree()。
   空(3)相对较难,是while循环继续的条件,循环体的功能就是生成一棵子树,循环继续意味着需要生成另一棵子树。根据列表的结构,子树间是用逗号“,”分隔的,因此循环继续的条件就是此时处理的字符是逗号。故空(3)应填*str==’,’。
   函数walkTree是由M叉树输出列表。根据列表的结构,先输出根节点的值,然后如果有子树的话用括号将其括起来,子树间用逗号分隔,类似于二叉树的前序遍历。因此易得空(4)应填putchar(t->val),或其他等价形式,总之就是输出变量t->val存储的字符。类似空(2),根据M叉树的递归性质,空(5)应填walkTree(t->subTree)。紧接着的if块正是判断是否还有子树,若有就输出逗号。
(1) (NODE*)malloc(sizeoffNODE))
   (2) makeTree()
   (3) *str==’,’
   (4) putchar(t->val)
   (5) walkTree(t->subTree)
转载请注明原文地址:https://kaotiyun.com/show/b5xZ777K
0

最新回复(0)