PureBasic
NewList
NewList name.<type>()
Описание
NewList позволяет объявить новый Связный список. Каждый элемент Связного списка распределяется динамически. Нет никаких ограничений на количество элементов, таким образом в списке может быть столько элементов, сколько необходимо. Список может быть любого допустимого Стандартного или Структурированного типа. Просмотреть все команды для управления списками можно в библиотеке List.
Новый Связный список всегда локальный, что означает, что необходимо использовать команды Global или Shared, если список, объявленный в основном коде, понадобится в процедурах. Также возможно передать связный список как параметр в Процедуру с помощью ключевого слова List .
Для быстрого обмена содержимого связного списка предусмотрена команда Swap.
Пример: Простой Связный список

NewList MyList() AddElement(MyList()) MyList() = 10 AddElement(MyList()) MyList() = 20 AddElement(MyList()) MyList() = 30 ForEach MyList() Debug MyList() Next
Пример: Связный список как параметр процедуры

NewList Test() AddElement(Test()) Test() = 1 AddElement(Test()) Test() = 2 Procedure DebugList(c, List ParameterList()) AddElement(ParameterList()) ParameterList() = 3 ForEach ParameterList() MessageRequester("List", Str(ParameterList())) Next EndProcedure DebugList(10, Test())
Пример: Структурированный Связный список
Structure Prog ; Создаём структуру для будущего Связного списка MyList(). Которая будет для него ТИПОМ.
Name.s
number.b
EndStructure
NewList MyList.Prog() ; Объявляем Связный список и привязываем структуру 'Prog'. Структура 'Prog' - это тип для Связного списка определяемый пользователем.
AddElement(MyList()) ; Добавляем в него первый элемент, он становится "текущим", под индексом 0. Счёт как в массиве с 0.
MyList()\name = "John"; Задаём значение текущего элемента (имени) как "John"
MyList()\number = 0 ; Задаём значение текущего элемента ( Номер) как "0"
*Old_Element = @mylist() ; Получаем адрес текущего (первого) элемента, который под индексом 0
For q=1 To 10
AddElement(MyList()) ; Добавляем ещё 10 элементов
MyList()\name = "Ivan" ; задаём значения для остальных 10 элементов
MyList()\number = q ; задаём значения для остальных 10 элементов
Next q
ResetList(mylist()) ; Устанавливает внутренний указатель списка на 'перед первым элементом'.
While NextElement(mylist()) ; Выполняем поиск для всех элементов с именем "John" и изменяем их на "J"
If mylist()\name = "John"
mylist()\name = "J"
EndIf
Wend
Debug "Адрес текущего элемента : " + Hex(@mylist()) + " под индексом " + ListIndex(MyList()) ; текущий элемент с индексом 10
ChangeCurrentElement(mylist(), *Old_Element) ; Изменяем текущий элемент, на тот который был текущим до поиска.
Debug "Адрес текущего элемента : " + Hex(@mylist()) + " под индексом " + ListIndex(MyList()) ; текущий элемент с индексом 0
Debug "Имя: " + mylist()\name + " Номер: " + MyList()\number ; выводит элемент с изменёнными данными "John" на "J"