问答题 用类C语言写出求广义表深度以及复制广义表的算法。
【正确答案】正确答案:定义一个广义表类型如下: typedef Struct node{ int flag; union { elemType data; struct node *pointer; }; struct node *1ink; } BSNode,*BSLinkList; //求广义表深度 int genlistDepth(BSLinkList 1ist){ /*1ist存放广义链表的首地址,该算法返回广义链 表的深度*/ BSLinkList stackl[M],p, /*stackl用来记录子表的起始位置*/ /*stack2用来记录子表当前的深度,depth用来表示当前所求子表的深度,maxdep用来记录当前已求出的那些子表的最大深度,stack1和stack2共用一个栈顶指针*/ int stack2[M],depth=0,maxdep=0,top=-1; p=list->pointer; /*将p指针指向广义链表的第一个元素所在的链接点*/ if(p!=NULL){ do{ while(p!=NULL){ stack1[++top]=p; /*记录当前子表的起始位置*/ stack2[top]=depth; /*记录当前所求子表的深度*/ if(p->flag==1){ /*当前链接点元素是子表*/ depth++; /*当前层次数加1*/ p=p->pointer; /*移动到下一层*/ } else p=NULL; } if(maxdep<depth){ maxdep=depth; /*记录当前已求得的最大层次数*/ } p=stackl[top]; /*退回到上一层,移动到下一个元素,查看是否有子表*/ depth=stack2[top--]; p=p->link; }(p!=NULL&&top!=-1); } return maxdep+1; } //复制广义表 BSLinkList copyBSList(BSLinkList 1ista){ BSLinkLiSt 1istb=NULL; if(1ista!=NULL){ 1istb=(BSLinkList)malloc(sizeof(BSNode)); 1istb->flag=1ista->flag; if(1ista->flag==0) 1istb->data=lista->data; else listb->pointer=copyBSList(1ista->pointer); listb->link=copyBSList(1ista->1ink), } return 1istb; }
【答案解析】