回 帖 发 新 帖 刷新版面

主题:关于广义表复制

严蔚敏版数据结构115页复制广义表的算法如下:

void CopyGList(GList &T,GList L)
 { // 采用头尾链表存储结构,由广义表L复制得到广义表T。算法5.6
   if(!L) // 复制空表
     T=NULL;
   else
   {
     T=(GList)malloc(sizeof(GLNode)); // 建表结点
     if(!T)
       exit(OVERFLOW);
     T->tag=L->tag;
     if(L->tag==ATOM)
       T->atom=L->atom; // 复制单原子
     else
     {
       CopyGList(T->ptr.hp,L->ptr.hp); // 递归复制子表(a)
       CopyGList(T->ptr.tp,L->ptr.tp);//(b)
     }
   }
 }

我觉得以上程序存在问题.因为此程序中的复制操作仅仅复制节点的tag域与原子节点的值域,而对于表节点的hp域与tp域均没有复制.如果说hp域与tp域的复制是通过a语句与b语句复制的话,但是这两个语句均为递归调用,因此这两个语句并没有把hp域与tp域复制过去.因此我认为此程序中应该增加形如T->ptr.hp=L->ptr.hp与T->ptr.tp=L->ptr.tp的语句,请问我的说法正确吗?谢谢!1

回复列表 (共1个回复)

沙发

亲手调试并操作出其结果即可。
另:
不用增加了,当ptr.hp所指向的为空表时,就在下一轮递归的时候复制得到一个空值,如果不是空的,就得到子表,一直递归,到最后一层,也无非两个结果,一个就是得到原子结点的值,一个是空值。
也就是说整个程序有两个出口,通过层层递归以后,最终要么就得到了原子结中的值,要么就得到了空值,所以无需一一复制ptr.hp,ptr.tp.
在操作的过程中,它会自动根据L的信息反馈到T上,并得到正确的复制结果。

我来回复

您尚未登录,请登录后再回复。点此登录或注册