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