SJA APS后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.4 KiB

  1. package timemodel
  2. import (
  3. "container/list"
  4. "fmt"
  5. "testing"
  6. )
  7. type ListItem struct {
  8. Val string
  9. }
  10. func TestList(t *testing.T) {
  11. //创建一个实例
  12. lst := list.New()
  13. //尾部添加
  14. lst.PushBack(&ListItem{"Leo"})
  15. lst.PushBack(&ListItem{"Sarah"})
  16. lst.PushBack(&ListItem{"Sarah"})
  17. lst.PushBack(&ListItem{"Sarah"})
  18. litem := lst.PushBack(&ListItem{"Sarah"})
  19. lst.PushBack(&ListItem{"Melon"})
  20. lst.PushBack(&ListItem{"Sarah"})
  21. lst.PushBack(&ListItem{"Dora"})
  22. lst.PushBack(&ListItem{"Eva"})
  23. // 删除litem之前所有的节点
  24. if err := RemoveListAllBeforeItem(lst, litem, false); err != nil {
  25. t.Errorf("Failed to remove")
  26. }
  27. // 打印
  28. for i := lst.Front(); i != nil; i = i.Next() {
  29. fmt.Println(i.Value.(*ListItem).Val)
  30. }
  31. return
  32. //前部添加
  33. lst.PushFront("day")
  34. //前部添加后,保存元素句柄
  35. element := lst.PushFront("is ")
  36. //在is 之后添加 mon
  37. lst.InsertAfter("mon", element)
  38. //在is 之前添加 Today
  39. lst.InsertBefore("Today ", element)
  40. //打印 輸出 Today is monday.
  41. // i:=lst.Front() 表示初始赋值,只会在一开始执行一次,每次循环会进行一次 i != nil 语句判断,如果返回 false,表示退出循环,反之则会执行 i = i.Next()。
  42. for i := lst.Front(); i != nil; i = i.Next() {
  43. fmt.Print(i.Value)
  44. }
  45. //删除 元素
  46. lst.Remove(element)
  47. fmt.Println()
  48. //打印 輸出 Today monday.
  49. for i := lst.Front(); i != nil; i = i.Next() {
  50. fmt.Print(i.Value)
  51. }
  52. fmt.Println("\nlst2输出")
  53. var lst2 list.List
  54. lst2.PushBack("one")
  55. lst2.PushFront("zero ")
  56. //打印
  57. for i := lst2.Front(); i != nil; i = i.Next() {
  58. fmt.Println(i.Value)
  59. }
  60. }
  61. func RemoveListAllBeforeItem(lst *list.List, delNode *list.Element, delItem bool) (err error) {
  62. var (
  63. e, el, prev, p *list.Element
  64. )
  65. // 删除litem之前所有的节点
  66. for e = lst.Front(); e != nil; e = e.Next() {
  67. if delNode == e {
  68. prev = e.Prev()
  69. if delItem {
  70. lst.Remove(e)
  71. }
  72. for el = prev; el != nil; el = p {
  73. p = el.Prev()
  74. lst.Remove(el)
  75. }
  76. break
  77. }
  78. }
  79. return
  80. }
  81. func RemoveListAllAfterItem(lst *list.List, delNode *list.Element, delItem bool) (err error) {
  82. var (
  83. e, el, next, n *list.Element
  84. )
  85. // 删除litem之前所有的节点
  86. for e = lst.Front(); e != nil; e = e.Next() {
  87. if delNode == e {
  88. next = e.Next()
  89. if delItem {
  90. lst.Remove(e)
  91. }
  92. for el = next; el != nil; el = n {
  93. n = el.Next()
  94. lst.Remove(el)
  95. }
  96. break
  97. }
  98. }
  99. return
  100. }