Lua 實現雙向列表

2021-09-12 08:21:51 字數 2671 閱讀 6141

--list

--node=

--doublelist=

--生成乙個table

local function buildinitnode(value)

node =

node.prev=node

node.next=node

return node

end function remove(basenode)

basenode.next.prev=basenode.prev

basenode.prev.next=basenoe.next

basenode.prev=nil

basenode.next=nil

endfunction pop_back(dl)

if dl.header.next==dl.tail then

return nil

endlocal obj =dl.tail.prev

remove(obj)

return obj

endfunction pop_front(dl)

if dl.header.next == dl.tail then

return nil

endlocal obj=dl.header.next

remove(obj)

return obj

endfunction insert(basenode,value)

local obj=buildinitnode(value)

obj.next=basenode.next

obj.prev=basenode

basenode.next.prev=obj

basenode.next=obj

endfunction find(dl,value)

local header=dl.header

while header.next ~=dl.tail do

if header.next.value == value then

return header.next

endheader=header.next

endreturn nil

end

local function init(dl)

--當or的前面是false或nil就會返回後面的值

dl=dl or {}

sentry=buildinitnode()

dl.header=sentry

dl.tail=sentry

return dl

end--dl 鍊錶

function push_back(dl,value)

local obj=buildinitnode()

local tail=dl.tail

obj.value=value

obj.next=tail

obj.prev=tail.prev

tail.prev.next=obj

tail.prev=obj

endfunction push_front(dl,value)

local obj=buildinitnode()

local header=dl.header

obj.value=value

obj.next=header.next

obj.prev=header

header.next=obj

header.next.prev=obj

endfunction iterdoublelist(dl)

local iter=function(node,val)

if node.curr==dl.tail then

return nil

end

-- node.curr ==

local nv=node.curr.value

node.curr=node.curr.next

return nv

end

local node=

return iter,node

end--閉包實現迭代器

function iter(dl)

return function()

local returnvalue=nil

returnvalue=dl.value --返回鍊錶的資料

dl=dl.next --移動到鍊錶的下乙個節點

return returnvalue

endendfunction foreach_node(dl)

local header = dl.header.next

--輸出鍊錶

for v in iter(header) do

if(v) then

print(v)

else

break

endend

end

--函式封裝到table的成員變數

list=

用法

dl=list.init()

list.push_back(dl.6)

list.push_back(dl,3)

list.foreach_node(dl)

c實現雙向迴圈列表

linklist2.c linklist 雙向迴圈鍊錶 include include define maxsize 100 define elemtype int elemtype a maxsize int n typedef struct node dnode,dlinklist dlinkl...

線性列表 雙向列表

雙向鍊錶 在單鏈表中,每個節點所含的鏈域指向後繼節點,故從任一節點後繼很方便,但要找到 前驅及節點比較困難。public class dnode public dnode string name public dnode string name,dnode next,dnode prev packa...

STL雙向列表

input 第一行乙個整數n。第二行乙個整數x。表示第一輛自行車的編號。以下n 1行,每行3個整數x,y,z。z 0時,表示編號為x的自行車恰停放在編號為y的自行車的左邊 z 1時,表示編號為x的自行車恰停放在編號為y的自行車的右邊43 1 3 1 2 1 0 5 2 1 output 從左到右輸出...