списки
Реализация:
- односвязных списков
- двусвязных списков
- односвязных колец (циклические списки)
- двусвязных колец (циклические списки)
Основное использование
Поскольку это не имеет смысла делать иначе, указатели next и prev не скрыты от вас и могут быть напрямую использованы для повышения эффективности.
Списки
import lists var l = initDoublyLinkedList[int]() a = newDoublyLinkedNode[int](3) b = newDoublyLinkedNode[int](7) c = newDoublyLinkedNode[int](9) l.append(a) l.append(b) l.prepend(c) assert a.next == b assert a.prev == c assert c.next == a assert c.next.next == b assert c.prev == nil assert b.next == nil
Кольца
import lists var l = initSinglyLinkedRing[int]() a = newSinglyLinkedNode[int](3) b = newSinglyLinkedNode[int](7) c = newSinglyLinkedNode[int](9) l.append(a) l.append(b) l.prepend(c) assert c.next == a assert a.next == b assert c.next.next == b assert b.next == c assert c.next.next.next == c
См. также
- модуль деков для очередей с двумя концами
- модуль sharedlist для общих односвязных списков
Типы
DoublyLinkedNodeObj[T] = object next*: (ref DoublyLinkedNodeObj[T]) prev* {...}{.cursor.}: ref DoublyLinkedNodeObj[T] value*: T-
Узел, из которого состоит двусвязный список.
Он состоит из поля
Исходный код Изменитьvalueи указателей наnextиprev. DoublyLinkedNode[T] = ref DoublyLinkedNodeObj[T]
- Исходный код Изменить
SinglyLinkedNodeObj[T] = object next*: (ref SinglyLinkedNodeObj[T]) value*: T
-
Узел, из которого состоит односвязный список.
Он состоит из поля
Исходный код Изменитьvalueи указателя наnext. SinglyLinkedNode[T] = ref SinglyLinkedNodeObj[T]
- Исходный код Изменить
SinglyLinkedList[T] = object head*: (SinglyLinkedNode[T]) tail* {...}{.cursor.}: SinglyLinkedNode[T]-
Односвязный список.
Используйте процедуру initSinglyLinkedList, чтобы создать новый пустой список.
Исходный код Изменить DoublyLinkedList[T] = object head*: (DoublyLinkedNode[T]) tail* {...}{.cursor.}: DoublyLinkedNode[T]-
Двусвязный список.
Используйте процедуру initDoublyLinkedList, чтобы создать новый пустой список.
Исходный код Изменить SinglyLinkedRing[T] = object head*: (SinglyLinkedNode[T]) tail* {...}{.cursor.}: SinglyLinkedNode[T]-
Односвязное кольцо.
Используйте процедуру initSinglyLinkedRing, чтобы создать новое пустое кольцо.
Исходный код Изменить DoublyLinkedRing[T] = object head*: DoublyLinkedNode[T]
-
Двусвязное кольцо.
Используйте процедуру initDoublyLinkedRing, чтобы создать новое пустое кольцо.
Исходный код Изменить SomeLinkedList[T] = SinglyLinkedList[T] | DoublyLinkedList[T]
- Исходный код Изменить
SomeLinkedRing[T] = SinglyLinkedRing[T] | DoublyLinkedRing[T]
- Исходный код Изменить
SomeLinkedCollection[T] = SomeLinkedList[T] | SomeLinkedRing[T]
- Исходный код Изменить
SomeLinkedNode[T] = SinglyLinkedNode[T] | DoublyLinkedNode[T]
- Исходный код Изменить
Процедуры
proc initSinglyLinkedList[T](): SinglyLinkedList[T]
- Создаёт новый односвязный список, который пуст.
Пример:
var a = initSinglyLinkedList[int]()
Исходный код Редактировать proc initDoublyLinkedList[T](): DoublyLinkedList[T]
- Создаёт новый двусвязный список, который пуст.
Пример:
var a = initDoublyLinkedList[int]()
Исходный код Редактировать proc initSinglyLinkedRing[T](): SinglyLinkedRing[T]
- Создаёт новое односвязное кольцо, которое пусто.
Пример:
var a = initSinglyLinkedRing[int]()
Исходный код Редактировать proc initDoublyLinkedRing[T](): DoublyLinkedRing[T]
- Создаёт новое двусвязное кольцо, которое пусто.
Пример:
var a = initDoublyLinkedRing[int]()
Исходный код Редактировать proc newDoublyLinkedNode[T](value: T): (DoublyLinkedNode[T])
- Создаёт новый двусвязный узел с заданным
value.Пример:
var n = newDoublyLinkedNode[int](5) assert n.value == 5
Исходный код Редактировать proc newSinglyLinkedNode[T](value: T): (SinglyLinkedNode[T])
- Создаёт новый односвязный узел с заданным
value.Пример:
var n = newSinglyLinkedNode[int](5) assert n.value == 5
Исходный код Редактировать proc `$`[T](L: SomeLinkedCollection[T]): string
- Преобразует список в его строковое представление для регистрации и вывода. Исходный код Редактировать
proc find[T](L: SomeLinkedCollection[T]; value: T): SomeLinkedNode[T]
-
Ищет значение в списке. Возвращает
nilесли значение не найдено.См. также:
Пример:
var a = initSinglyLinkedList[int]() a.append(9) a.append(8) assert a.find(9).value == 9 assert a.find(1) == nil
Исходный код Редактировать proc contains[T](L: SomeLinkedCollection[T]; value: T): bool {...}{.inline.}-
Ищет значение в списке. Возвращает
falseесли значение не найдено,trueв противном случае.См. также:
Пример:
var a = initSinglyLinkedList[int]() a.append(9) a.append(8) assert a.contains(9) assert 8 in a assert(not a.contains(1)) assert 2 notin a
Исходный код Редактировать proc append[T](L: var SinglyLinkedList[T]; n: SinglyLinkedNode[T]) {...}{.inline.}-
Добавляет (добавляет в конец) узел
nкL. Эффективность: O(1).См. также:
- append proc для добавления значения
- prepend proc для добавления узла в начало
- prepend proc для добавления значения в начало
Пример:
var a = initSinglyLinkedList[int]() n = newSinglyLinkedNode[int](9) a.append(n) assert a.contains(9)
Исходный код Редактировать proc append[T](L: var SinglyLinkedList[T]; value: T) {...}{.inline.}-
Добавляет (добавляет в конец) значение к
L. Эффективность: O(1).См. также:
- append proc для добавления значения
- prepend proc для добавления узла в начало
- prepend proc для добавления значения в начало
Пример:
var a = initSinglyLinkedList[int]() a.append(9) a.append(8) assert a.contains(9)
Исходный код Редактировать proc prepend[T](L: var SinglyLinkedList[T]; n: SinglyLinkedNode[T]) {...}{.inline.}-
Добавляет в начало (добавляет в начало) узел к
L. Эффективность: O(1).См. также:
- append proc для добавления узла в конец
- append proc для добавления значения в конец
- prepend proc для добавления значения в начало
Пример:
var a = initSinglyLinkedList[int]() n = newSinglyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
Исходный код Редактировать proc prepend[T](L: var SinglyLinkedList[T]; value: T) {...}{.inline.}-
Добавляет в начало (добавляет в начало) узел
Lкvar a = initSinglyLinkedList[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
. Эффективность: O(1).См. также:
- append proc для добавления узла в конец
- append proc для добавления значения в конец
- prepend proc для добавления узла в начало
Пример:
var a = initSinglyLinkedList[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
Исходный код Редактировать proc append[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
-
Добавляет (добавляет в конец) узел
nкL. Эффективность: O(1).См. также:
- append proc для добавления значения
- prepend proc для добавления узла в начало
- prepend proc для добавления значения в начало
- remove proc для удаления узла
Пример:
var a = initDoublyLinkedList[int]() n = newDoublyLinkedNode[int](9) a.append(n) assert a.contains(9)
Исходный код Редактировать proc append[T](L: var DoublyLinkedList[T]; value: T)
-
Добавляет (добавляет в конец) значение к
L. Эффективность: O(1).См. также:
- append proc для добавления узла
- prepend proc для добавления узла в начало
- prepend proc для добавления значения в начало
- remove proc для удаления узла
Пример:
var a = initDoublyLinkedList[int]() a.append(9) a.append(8) assert a.contains(9)
Исходный код Редактировать proc prepend[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
-
Добавляет в начало (добавляет в начало) узел
nкL. Эффективность: O(1).См. также:
- append proc для добавления узла в конец
- append proc для добавления значения в конец
- prepend proc для добавления значения в начало
- remove proc для удаления узла
Пример:
var a = initDoublyLinkedList[int]() n = newDoublyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
Исходный код Редактировать proc prepend[T](L: var DoublyLinkedList[T]; value: T)
-
Добавляет в начало (добавляет в начало) значение к
L. Эффективность: O(1).См. также:
- append proc для добавления узла в конец
- append proc для добавления значения в конец
- prepend proc для добавления узла в начало
- remove proc для удаления узла
Пример:
var a = initDoublyLinkedList[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
Исходный код Редактировать proc remove[T](L: var DoublyLinkedList[T]; n: DoublyLinkedNode[T])
- Удаляет узел
nизL. Эффективность: O(1).Пример:
var a = initDoublyLinkedList[int]() n = newDoublyLinkedNode[int](5) a.append(n) assert 5 in a a.remove(n) assert 5 notin a
Исходный код Редактировать proc append[T](L: var SinglyLinkedRing[T]; n: SinglyLinkedNode[T])
-
Добавляет (добавляет в конец) узел
nвL. Эффективность: O(1).См. также:
- процедура добавления значения для добавления значения
- процедура добавления в начало для добавления узла в начало
- процедура добавления в начало для добавления значения в начало
Пример:
var a = initSinglyLinkedRing[int]() n = newSinglyLinkedNode[int](9) a.append(n) assert a.contains(9)
Исходный код Изменить proc append[T](L: var SinglyLinkedRing[T]; value: T)
-
Добавляет (добавляет в конец) значение в
L. Эффективность: O(1).См. также:
- процедура добавления узла для добавления узла
- процедура добавления в начало для добавления узла в начало
- процедура добавления в начало для добавления значения в начало
Пример:
var a = initSinglyLinkedRing[int]() a.append(9) a.append(8) assert a.contains(9)
Исходный код Изменить proc prepend[T](L: var SinglyLinkedRing[T]; n: SinglyLinkedNode[T])
-
Добавляет в начало узел
nвL. Эффективность: O(1).См. также:
- процедура добавления узла для добавления узла
- процедура добавления значения для добавления значения
- процедура добавления в начало для добавления значения в начало
Пример:
var a = initSinglyLinkedRing[int]() n = newSinglyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
Исходный код Изменить proc prepend[T](L: var SinglyLinkedRing[T]; value: T)
-
Добавляет в начало значение в
L. Эффективность: O(1).См. также:
- процедура добавления узла для добавления узла
- процедура добавления значения для добавления значения
- процедура добавления в начало для добавления узла в начало
Пример:
var a = initSinglyLinkedRing[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
Исходный код Изменить proc append[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
-
Добавляет (добавляет в конец) узел
nвL. Эффективность: O(1).См. также:
- процедура добавления значения для добавления значения
- процедура добавления в начало для добавления узла в начало
- процедура добавления в начало для добавления значения в начало
- процедура удаления узла для удаления узла
Пример:
var a = initDoublyLinkedRing[int]() n = newDoublyLinkedNode[int](9) a.append(n) assert a.contains(9)
Исходный код Изменить proc append[T](L: var DoublyLinkedRing[T]; value: T)
-
Добавляет (добавляет в конец) значение в
L. Эффективность: O(1).См. также:
- процедура добавления узла для добавления узла
- процедура добавления в начало для добавления узла в начало
- процедура добавления в начало для добавления значения в начало
- процедура удаления узла для удаления узла
Пример:
var a = initDoublyLinkedRing[int]() a.append(9) a.append(8) assert a.contains(9)
Исходный код Изменить proc prepend[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
-
Добавляет в начало узел
nвL. Эффективность: O(1).См. также:
- процедура добавления узла для добавления узла
- процедура добавления значения для добавления значения
- процедура добавления в начало для добавления значения в начало
- процедура удаления узла для удаления узла
Пример:
var a = initDoublyLinkedRing[int]() n = newDoublyLinkedNode[int](9) a.prepend(n) assert a.contains(9)
Исходный код Изменить proc prepend[T](L: var DoublyLinkedRing[T]; value: T)
-
Добавляет в начало значение в
L. Эффективность: O(1).См. также:
- процедура добавления узла для добавления узла
- процедура добавления значения для добавления значения
- процедура добавления в начало для добавления узла в начало
- процедура удаления узла для удаления узла
Пример:
var a = initDoublyLinkedRing[int]() a.prepend(9) a.prepend(8) assert a.contains(9)
Исходный код Изменить proc remove[T](L: var DoublyLinkedRing[T]; n: DoublyLinkedNode[T])
- Удаляет
nизL. Эффективность: O(1).Пример:
var a = initDoublyLinkedRing[int]() n = newDoublyLinkedNode[int](5) a.append(n) assert 5 in a a.remove(n) assert 5 notin a
Исходный код Изменить
Итераторы
iterator items[T](L: SomeLinkedList[T]): T
-
Возвращает каждое значение
L.См. также:
Примеры:
var a = initSinglyLinkedList[int]() for i in 1 .. 3: a.append(10*i) for x in a: # the same as: for x in items(a): echo x # 10 # 20 # 30
Исходный код Изменить iterator items[T](L: SomeLinkedRing[T]): T
-
Возвращает каждое значение
L.См. также:
Примеры:
var a = initSinglyLinkedRing[int]() for i in 1 .. 3: a.append(10*i) for x in a: # the same as: for x in items(a): echo x # 10 # 20 # 30
Исходный код Изменить iterator mitems[T](L: var SomeLinkedList[T]): var T
-
Возвращает каждое значение
L, позволяя его изменить.См. также:
Пример:
var a = initSinglyLinkedList[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in mitems(a): x = 5*x - 1 assert $a == "[49, 99, 149, 199, 249]"
Исходный код Изменить iterator mitems[T](L: var SomeLinkedRing[T]): var T
-
Возвращает каждое значение
L, позволяя его изменить.См. также:
Пример:
var a = initSinglyLinkedRing[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in mitems(a): x = 5*x - 1 assert $a == "[49, 99, 149, 199, 249]"
Исходный код Изменить iterator nodes[T](L: SomeLinkedList[T]): SomeLinkedNode[T]
-
Итерируется по каждому узлу
x. Поддерживается удаление текущего узла из списка во время обхода.См. также:
Пример:
var a = initDoublyLinkedList[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in nodes(a): if x.value == 30: a.remove(x) else: x.value = 5*x.value - 1 assert $a == "[49, 99, 199, 249]"Исходный код Изменить iterator nodes[T](L: SomeLinkedRing[T]): SomeLinkedNode[T]
-
Итерируется по каждому узлу
x. Поддерживается удаление текущего узла из списка во время обхода.См. также:
Пример:
var a = initDoublyLinkedRing[int]() for i in 1 .. 5: a.append(10*i) assert $a == "[10, 20, 30, 40, 50]" for x in nodes(a): if x.value == 30: a.remove(x) else: x.value = 5*x.value - 1 assert $a == "[49, 99, 199, 249]"Исходный код Изменить
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/lists.html