问答题 试编写建立广义表存储结构的算法,要求在输入广义表的同时实现判断、建立。设广义表按如下形式输入:(a 1 ,a 2 ,a 3 ,…,a n ),n≥0,其中a t 或为单字母表示的原子或为广义表,n=0时为只含空格字符的空表。【北京工业大学1998十(15分)】
【正确答案】正确答案:广义表可以看作是扩充的线性表:其元素是原子或表。在读入广义表“表达式”时,遇到左括号‘(’就递归地构造子表;否则,若是原子,就建立原子结点;若读入逗号‘,’,就递归 构造后续子表;直到碰到输入结束符号(‘≠}’)。设广义表的形式定义如下: typedef struct node {int tag; //tag=0为原子,tag=l为子表 struct node*link; //指向后继结点的指针 union f struct node*slink; //指向子表的指针 char data; //原子 }element; }Glist; 算法核心语句段如下: cin>>ch; if(ch==…)gh=null; else{gh=new(Glist); if(ch=="("){gh一>tag=l; //子表 gh一>element.slink=creat();} //递归构造子表 else(gh一>tag=0;gh一>element.data=ch;} //原子结点 } cin>>ch; if(gh!=null) if(ch=="-")gh一>link=creat(); //递归构造后续广义表 else gh->link=null; 需要指出,题中“n=0时为只含空格字符的空表一叙述有误。n=0表示广义表是空表。 空表长度为0,不含任何元素,而不是“只含空格字符的空表”。
【答案解析】