lua实现list

require( "class")
List = class()

local function InitNote( data, prev, next)
local o = {}
o. Data = data
o. Prev = prev
o. Next = next
return o
end

function List:ctor()
self. Head = InitNote( nil)
self. Head. Prev = self. Head
self. Head. Next = self. Head
self. Size = 0
end

function List:AddLast( data)
if self. Size == 0 then
self. Head = InitNote(data, nil, nil)
self. Head. Prev = self. Head
self. Head. Next = self. Head
self. Size = self. Size + 1
return
else
local p = self: GetElement( self. Size)
local q = InitNote(data, p, p. Next)
self. Head. Prev = q
p. Next = q
self. Size = self. Size + 1
end
end

function List:GetElement( index) -- 1 -- size
if (index <= 0 or index > self. Size) then
print( "LinkList is empty or Position is error!")
return nil;
end

if (index == 1) then
return self. Head
end

if (index < self. Size / 2) then
local item = self. Head

for i = 1, index do
item = item. Next
end

return item
end

local p = self. Head;

local rindex = self. Size - index + 1

for i = 1, rindex do
p = p. Prev
end
return p
end

function List:Insert( index, data) --����indexǰ
if ( self. Size <= 0 or index >= self. Size or index <= 0) then
print( "LinkList is empty or Position is error!")
return
end

if (index == 1) then
local note = InitNote(data, self. Head. Prev, self. Head)
self. Head. Prev. Next = note
self. Head. Prev = note
self. Head = note
self. Size = self. Size + 1
else
local inode = self: GetElement(index)
local tnode = InitNote(data, inode. Prev, inode)
inode. Prev. Next = tnode
inode. Prev = tnode
self. Size = self. Size + 1
end
end

function List:Append( index, data) --����index��
if ( self. Size <= 0 or index > self. Size or index <= 0) then
print( "LinkList is empty or Position is error!")
return
end

local inode = self: GetElement(index)
local tnode = InitNote(data, inode, inode. Next)
inode. Next. Prev = tnode
inode. Next = tnode
self. Size = self. Size + 1
end

function List:Del( index) -- 1 -- size
if ( self. Size <= 0 or index > self. Size or index <= 0) then
print( "LinkList is empty or Position is error!")
return
end

if (index == 1) then
self. Head. Prev. Next = self. Head. Next
self. Head. Next. Prev = self. Head. Prev
self. Head = self. Head. Next
self. Size = self. Size - 1
return
end
local inode = self: GetElement(index)
if (inode == nil) then return end
inode. Prev. Next = inode. Next;
inode. Next. Prev = inode. Prev;
self. Size = self. Size - 1
end

function List:IsEmpty()
return self. Size == 0
end

function List:ShowAll()
     if self: IsEmpty() then
         print( "LinkList is empty!")
     end
    
     local note = self. Head
    
     for i = 1, self. Size do
         print(note. Data)
        note = note. Next
     end
end

猜你喜欢

转载自blog.csdn.net/weixin_39407066/article/details/80876523