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"