Lua 实现双向列表

--list
--node={prev=nil,next=nil,value=nil}
--DoubleList={header=node,tail=node}

--生成一个table
local function buildInitNode(value)
 node = {value=value}
 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
 end

function pop_back(dl)
 if dl.header.next==dl.tail then
  return nil
 end
 local  obj =dl.tail.prev
 remove(obj)
 return obj
end


function pop_front(dl)
 if dl.header.next == dl.tail then
   return nil
 end
 local  obj=dl.header.next
 remove(obj)
return obj
end



function insert(baseNode,value)
  local obj=buildInitNode(value)
  obj.next=baseNode.next
  obj.prev=baseNode
  baseNode.next.prev=obj
  baseNode.next=obj
end

function find(dl,value)
  local header=dl.header
  while header.next ~=dl.tail do
   if header.next.value == value then
     return header.next
   end
  header=header.next
 end
 return 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
end

function 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
end

function iterDoubleList(dl)
 local iter=function(node,val)
    if node.curr==dl.tail then
      return nil 
    end 
  -- node.curr =={next,prev,value}
  local nv=node.curr.value
  node.curr=node.curr.next
  return nv
  end 

 local node={curr=dl.header.next }
   
  return iter,node
end


--函数封装到table的成员变量
list={
   init=init,
   push_back=push_back,
   push_front=push_front,
   find=find,
   pop_back=pop_back,
   pop_front=pop_front,
   foreach_node=foreach_node,
   iter=iterDoubleList
}

  

用法

   dl=list.init()

    list.push_back(dl.6)

猜你喜欢

转载自blog.csdn.net/m0_37981386/article/details/88381467
LUA
今日推荐