*--遍历算法是递归算法的一个具体应用实例,在程式设计中也是比较常用的算法之一

*这里介绍几个常用的应用实例来简单接触下遍历算法的基础应用:

*--1、遍历文件
dqml='C:' &&需扫描的盘符
Use
Create Cursor mylsdbf (wjmc c(120),wjcd N(10),wjrq d,wjshj c(10),wjsx c(6))
xGS=1
xCD=0
Append Blank
Replace wjmc With dqml
Do While !Eof()
    nRecn=Recno()
    dqml=Alltrim(wjmc)+'/'
    x=Adir(Mysz,(dqml+'*.*'),'rashd')
    If x<>0
        For I=3 To x
            Mysz(I,1)=dqml+Mysz(I,1)
            xGS=xGS+1
            xCD=xCD+Mysz(I,2)
        Endfor
        Append From Array Mysz For Alltrim(wjmc)<>'.' And Alltrim(wjmc)<>'..' And 'D'$wjsx
    Endif
    Go nRecn
    Skip
Enddo
Browse
Use*--2、遍历控件
Create Cursor kjsl(kjname C(254))
Insert Into kjsl(kjname) Values('thisform')
Do While !Eof()
    nRECN=Recno()
    kjmc=Alltrim(kjname)
    =Amembers(aval,&kjmc,2)
    If Type('aval')<>'U'
        For Each cval In aval&&aval控件名称数组,cval数组值
            Insert Into kjsl(kjname) Values(kjmc+'.'+cval)
        Endfor
    Endif
    Release aval
    Go nRECN
    Skip
Enddo
Browse
 
*--3、遍历TreeView 中指定节点及其所有子节点的算法
** aChild[1,3]是一个自定义表单数组属性
Lparameters cnode
** 将所有的子节点的特性都放到表单的数组属性 aChild 中去
** 以便在要删除一个节点的时候,删除所有子节点的数据
Local oCurNode, nArrayCount
nArrayCount = 1
oCurNode = cnode && 纪录下第一个子节点的特性
This.aChild[1,1] = oCurnode.Key
This.aChild[1,2] = oCurnode.Text
This.aChild[1,3] = oCurnode.Index
Do While oCurNode.Children > 0
    oCurNode = oCurNode.Child
    If oCurNode.Children > 0 && 深入到最后一层
        Loop
    Endif
    Do While .T.
        If oCurNode.Key = cNode.Key
            Exit
        Endif
        nArrayCount = nArrayCount + 1
        If Isnull(oCurNode.Next) && 如果当前节点之后没有节点了
            Dimension This.aChild[nArrayCount, 3] && 纪录当前节点的信息
            This.aChild[nArrayCount, 1] = oCurNode.Key
            This.aChild[nArrayCount, 2] = oCurNode.Text
            This.aChild[nArrayCount, 3] = oCurNode.Index
            If !(oCurNode.Key = cnode.Key) && 如果当前节点已经是最高节点了,则立刻退出
                oCurNode = oCurNode.Parent && 否则,后退一层,并重新开始循环
                Loop
            Else
                Exit
            Endif
        Else && 当前节点之后还有节点,检查后续的节点
            oCurNode = oCurnode.Next && 将下一个节点设为当前节点
            Dimension This.aChild[nArrayCount,3] && 纪录该节点的特性
            This.aChild[nArrayCount,1] = oCurnode.Key
            This.aChild[nArrayCount,2] = oCurnode.Text
            This.aChild[nArrayCount,3] = oCurnode.Index
            If oCurNode.Children > 0 && 如果该节点有子节点,则退出,返回到第一个循环
                Exit
            Endif
        Endif
        If oCurNode.Children > 0
            Exit
        Endif
    Enddo
    If oCurNode.Key = cNode.Key
        Exit
    Endif
Enddo