|
二、广义表的周游算法
广义表周游的时候应该注意几个问题:相当于深度优先周游;访问的时候首先进入一个子表的头结点,设置mark标记;按照本层子结点顺序,访问广义表,如果是子表结点,则准备递归地访问此子表表头结点,如果是原子,则直接访问;避免进入循环链中无法跳出,mark用来防止循环访问而设置的访问位,实际上,表头结点才需要mark。
广义表访问结束的时候,应该将mark设置为未访问,以便如果其他地方也引用了该链可以正常的访问到。
广义表的周游算法参考实现如下:
template <class T>
void GenListNode<T>::GenListTraversalHelp(GenListNode<T> *node) {
GenListNode<T> *p;
node->headNode.mark=VISITED;
cout << "(";
for (p = node->next; p!=NULL; p=p->next) {
//进入一个子表结点,准备递归访问它的表头结点
if ((p->type==LIST)&&(p->child!=NULL)) {
cout << p->child->headNode.Name;
if (p->child->headNode.mark == UNVISITED) {
if (p->child->headNode.Name[0]!='\0')
cout <<":";
GenListTraversalHelp(p->child);
}
}
else if (p->type==ATOM) cout<<p->element;
if ((p->next!=NULL)) // &&(p->next->type!=HEAD))
cout << ", ";
}
cout << ")";
}
下图显示了周游广义表
(L:(L1:(L2:(a,L1),Lx:(L2,L3:(b)),Ly:(L3,c),L4:(d,L4))) 的过程。
 |