seeyou 发表于 2012-11-12 15:39:54

autoit3中链表的实现

昨天,我和几位兄台讨论,au3中如何实现以下结构体:struct node

   int id;
   node * next;
};答案请点击http://www.autoitx.com/thread-35849-2-1.html
虽然,DllStructCreate对实现这个结构体游刃有余,但是却无法用来实现链表。因为au3只提供了DllStructGetPtr,却没有提供类似于DllStructFromPtr之类的函数,以至于无法将一个指针转换为对象。我试了一个晚上还是没有成功,如果哪位知道不舍赐教。
后然我求助于AutoItObject,才得以实现列表功能

#include <AutoItObject.au3>
_AutoItObject_StartUp()

Global $head

Init()
output()
Test()
output()

Func Init()
        Local $node1 = node(1)
        $head = $node1
        Local $ptr = $head
        For $i = 2 To 12
                $new = node($i)
                $ptr.addNext($new)
                $ptr = $new
        Next
EndFunc

Func Test()
        Local $ptr = $head
        While $ptr.next <> 0
                $ptr.id = $ptr.id ^ 2
                $ptr = $Ptr.next
        WEnd
EndFunc

Func output()
        Local $ptr = $head
        While $ptr.next <> 0
                ConsoleWrite($ptr.id&@CRLF)
                $ptr = $Ptr.next
        WEnd
EndFunc

Func node($id)
        Local $oClassObj = _AutoItObject_Class()
        $oClassObj.AddProperty("next", $ELSCOPE_PUBLIC, 0)
        $oClassObj.AddProperty("id", $ELSCOPE_PUBLIC, 0)
        $oClassObj.AddMethod("addNext", "addNode")
        Local $oObj = $oClassObj.Object
        $oObj.id = $id
        Return $oObj
EndFunc

Func addNode($self, $newNode)
        $self.next = $newNode
EndFunc

seeyou 发表于 2012-11-13 15:29:53


Global $nodeArray

$stNode = DllStructCreate("int id;ptr next")
DllStructSetData($stNode, 1, 1)
$head = $stNode
$pre = $head

For $i = 2 To 12
        $nodeArray[$i] = DllStructCreate("int id;ptr next")
        DllStructSetData($nodeArray[$i], 1, $i)
        DllStructSetData($pre, 2, DllStructGetPtr($nodeArray[$i]))
        $pre = $nodeArray[$i]
Next

$pre = $head
While DllStructGetData($pre, 1) <> 12
        $point = DllStructGetData($pre, "next")
        $next = DllStructCreate("int id;ptr next", $point)
        $pre = $next
        ConsoleWrite(DllStructGetData($next, 1)&@CRLF)
WEnd

页: [1]
查看完整版本: autoit3中链表的实现