试按表头、表尾的分析方法重写求广义表的深度的递归算法。
广义表类型GList的定义:
typedef enum {ATOM,LIST} ElemTag;
typedef struct GLNode{
ElemTag tag;
union {
char atom;
struct {
GLNode *hp, *tp;
} ptr;
}un;
} *GList;
实现函数如下:
int GListDepth(GList ls)
/* Return the depth of list */
{
int max = 0,dep = 0;
GList p;
if(!ls) return 1;//空表深度为1
if(ls -> tag == ATOM)return 0;//原子深度为0
for(max = 0,p = ls; p; p = p -> un.ptr.tp){
dep = GListDepth(p -> un.ptr.hp);//求以p->un.ptr.hp为头结点的子表深度
if(dep > max)
max = dep;
}
return max + 1;//非空表的深度是各元素的深度的最大值加1
}