广义表的周游算法知识点
上一个知识点   下一个知识点


本节概述 本节知识点 本节总结

二、广义表的周游算法

广义表周游的时候应该注意几个问题:相当于深度优先周游;访问的时候首先进入一个子表的头结点,设置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))) 的过程。