fork download
  1.  
  2. local function iter(lst, elem)
  3. if not elem then elem = lst.first
  4. else elem = elem.next end
  5. return elem
  6. end
  7.  
  8. local list_mt = {}
  9. list_mt.__index = list_mt
  10. list_mt.push_back = function(self, val)
  11. if self.last == nil then
  12. self.first = {value = val, prev = nil, next = nil}
  13. self.last = self.first
  14. else
  15. self.last.next = {value = val, prev = self.last, next = nil}
  16. self.last = self.last.next
  17. end
  18. end
  19.  
  20. list_mt.remove = function(self, elem)
  21. if elem.next then elem.next.prev = elem.prev end
  22. if elem.prev then elem.prev.next = elem.next end
  23. if self.last == elem then self.last = elem.prev end
  24. if self.first == elem then self.first = elem.next end
  25. elem = nil
  26. end
  27.  
  28. -- Iterator for List
  29. function ilist(lst)
  30. return iter, lst, nil
  31. end
  32.  
  33. -- Create new List
  34. function NewList()
  35. local self = {
  36. first = nil,
  37. last = nil
  38. }
  39. setmetatable(self, list_mt)
  40. return self
  41. end
  42.  
  43. lst = NewList()
  44. lst:push_back(123)
  45. lst:push_back(456)
  46. lst:push_back(789)
  47. lst:push_back(456)
  48. lst:push_back(789)
  49.  
  50. local cnt = 0
  51. for elem in ilist(lst) do
  52. if elem.value == 456 then
  53. lst:remove(elem)
  54. end
  55. cnt = cnt + 1
  56. print(cnt, elem.value)
  57. end
  58.  
  59. print("-----")
  60.  
  61. cnt = 0
  62. for elem in ilist(lst) do
  63. cnt = cnt + 1
  64. print(cnt, elem.value)
  65. end
Success #stdin #stdout 0s 4380KB
stdin
Standard input is empty
stdout
1	123
2	456
3	789
4	456
5	789
-----
1	123
2	789
3	789