Implementation of singly and doubly linked lists. Because it makes no sense to do so, the 'next' and 'prev' pointers are not hidden from you and can be manipulated directly for efficiency.
DoublyLinkedNodeObj[T] = object next*, prev*: ref DoublyLinkedNodeObj[T] value*: T
DoublyLinkedNode[T] = ref DoublyLinkedNodeObj[T]
SinglyLinkedNodeObj[T] = object next*: ref SinglyLinkedNodeObj[T] value*: T
SinglyLinkedNode[T] = ref SinglyLinkedNodeObj[T]
SinglyLinkedList[T] = object head*, tail*: SinglyLinkedNode[T]
DoublyLinkedList[T] = object head*, tail*: DoublyLinkedNode[T]
SinglyLinkedRing[T] = object head*, tail*: SinglyLinkedNode[T]
DoublyLinkedRing[T] = object head*: DoublyLinkedNode[T]
proc initSinglyLinkedList[T](): SinglyLinkedList[T]
proc initDoublyLinkedList[T](): DoublyLinkedList[T]
proc initSinglyLinkedRing[T](): SinglyLinkedRing[T]
proc initDoublyLinkedRing[T](): DoublyLinkedRing[T]
proc newDoublyLinkedNode[T](value: T): DoublyLinkedNode[T]
proc newSinglyLinkedNode[T](value: T): SinglyLinkedNode[T]
proc `$`[T](L: SinglyLinkedList[T]): string
proc `$`[T](L: DoublyLinkedList[T]): string
proc `$`[T](L: SinglyLinkedRing[T]): string
proc `$`[T](L: DoublyLinkedRing[T]): string
proc find[T](L: SinglyLinkedList[T]; value: T): SinglyLinkedNode[T]
proc find[T](L: DoublyLinkedList[T]; value: T): DoublyLinkedNode[T]
proc find[T](L: SinglyLinkedRing[T]; value: T): SinglyLinkedNode[T]
proc find[T](L: DoublyLinkedRing[T]; value: T): DoublyLinkedNode[T]
proc contains[T](L: SinglyLinkedList[T]; value: T): bool {.inline.}
proc contains[T](L: DoublyLinkedList[T]; value: T): bool {.inline.}
proc contains[T](L: SinglyLinkedRing[T]; value: T): bool {.inline.}
proc contains[T](L: DoublyLinkedRing[T]; value: T): bool {.inline.}
proc prepend[T](L: var SinglyLinkedList[T]; n: SinglyLinkedNode[T]) {.inline.}
proc prepend[T](L: var SinglyLinkedList[T]; value: T) {.inline.}
proc append[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
proc append[T](L: var DoublyLinkedList[T]; value: T)
proc prepend[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
proc prepend[T](L: var DoublyLinkedList[T]; value: T)
proc remove[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
proc append[T](L: var SinglyLinkedRing[T]; n: SinglyLinkedNode[T])
proc append[T](L: var SinglyLinkedRing[T]; value: T)
proc prepend[T](L: var SinglyLinkedRing[T]; n: SinglyLinkedNode[T])
proc prepend[T](L: var SinglyLinkedRing[T]; value: T)
proc append[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
proc append[T](L: var DoublyLinkedRing[T]; value: T)
proc prepend[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
proc prepend[T](L: var DoublyLinkedRing[T]; value: T)
proc remove[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
iterator items[T](L: DoublyLinkedList[T]): T
iterator items[T](L: SinglyLinkedList[T]): T
iterator items[T](L: SinglyLinkedRing[T]): T
iterator items[T](L: DoublyLinkedRing[T]): T
iterator mitems[T](L: var DoublyLinkedList[T]): var T
iterator mitems[T](L: var SinglyLinkedList[T]): var T
iterator mitems[T](L: var SinglyLinkedRing[T]): var T
iterator mitems[T](L: var DoublyLinkedRing[T]): var T
iterator nodes[T](L: SinglyLinkedList[T]): SinglyLinkedNode[T]
iterator nodes[T](L: DoublyLinkedList[T]): DoublyLinkedNode[T]
iterator nodes[T](L: SinglyLinkedRing[T]): SinglyLinkedNode[T]
iterator nodes[T](L: DoublyLinkedRing[T]): DoublyLinkedNode[T]
© 2006–2017 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/lists.html