''#Include "windows.bi"
' класс узла списка
type ListNode

	declare constructor()  ' конструктор

	id as UInteger   ' индекс узла

	valueS as String  ' значение которое хранится в узле списка
	valueI As Integer
	valueD As Double
	ValueL As longint
	ValueB As Byte
	ValueSH As Short
	prev_node as ListNode Ptr  ' указатель на предыдущий узел

	next_node as ListNode Ptr  ' указатель на следующий узел

End type


' класс списка
type List

	declare constructor() ' конструктор

	declare destructor() ' деструктор

	declare sub Clear() '  метод очистки всего списка

	declare function AddLastS ( as string ) as UInteger ' метод добавление нового узла в конец списка
	declare function AddLastL ( as LongInt ) as UInteger ' метод добавление нового узла в конец списка
	Declare function AddLastIn ( as Integer ) as UInteger ' метод добавление нового узла в конец списка
	Declare function AddLastD ( as Double ) as UInteger ' метод добавление нового узла в конец списка
	Declare function AddLastB ( as Byte ) as UInteger ' метод добавление нового узла в конец списка
	Declare function AddLastSH ( as Short ) as UInteger ' метод добавление нового узла в конец списка
	Declare Sub AddHeadS (As String)
	Declare Sub AddHeadL (As LongInt)
	Declare Sub AddHeadD (As Double)
	Declare Sub AddHeadIn ( As integer)
	Declare Sub AddHeadB ( As Byte)
	Declare Sub AddHeadSH ( As Short)
	Declare function Insert_S (As UInteger,As String) As UInteger
	Declare function Insert_SH (As UInteger,As Short) As UInteger
	Declare function Insert_B (As UInteger,As Byte) As UInteger
	Declare function Insert_In (As UInteger,As Integer) As UInteger
	Declare function Insert_D (As UInteger,As Double) As UInteger
	Declare function Insert_L (As UInteger,As LongInt) As UInteger
	Declare function Move (As UInteger, As UInteger) As UInteger

	declare sub Remove( as uinteger ) ' удаляет узел по индексу

	declare function FindByID( as uinteger ) as ListNode Ptr ' ищет узел по индексу
	Declare Function GetCount (As List Ptr) As Integer
	Declare function GURR( ) as ListNode Ptr
	Declare function GURR1( ) as ListNode Ptr
	Declare function PRED( ) as ListNode Ptr
	Declare function First( ) as ListNode Ptr
	Declare function Last( ) as ListNode Ptr
	Gurrent As ListNode Ptr   ' текущий узел

	'declare sub ShowAll() ' метод отображение всего списка

	first_node as ListNode Ptr ' указатель на первый узел

	last_node as ListNode Ptr ' указатель на последний узел

end type

Declare Function SelectElement(ByVal list As List Ptr,ByVal  element As integer) as ListNode Ptr
' конструктор узла
constructor ListNode()
' просто обнуляет указатели
this.id = 0
this.prev_node = 0
this.next_node = 0

End constructor


' конструктор списка
constructor List()
' просто обнуляет указатели
this.first_node = 0
this.last_node = 0
End constructor


' деструктор списка
destructor List()
' вызывает метод очистки списка
this.Clear()
end destructor


' метод очищающий весь список
sub List.Clear()

	dim del_node as ListNode Ptr ' указатель на разрушаемый узел

	dim next_node as ListNode Ptr ' указатель на следующий узел

	del_node = this.first_node ' начинает с первого узла

	do while del_node ' проходит по всему списку, пока есть узел для разрушения

		next_node = del_node->next_node ' запоминает указатель на следующий узел

		delete del_node ' разрушает узел

		del_node = next_node ' переходит к следующему узлу

	Loop

	' обнуляет указатели
	this.first_node = 0
	this.last_node = 0

end Sub
' метод перемещения узла в любое место списка
function List.Move (idIN As UInteger,idFROM As UInteger) As UInteger
	Dim ELE_from as ListNode Ptr ' указатель на показываемый узел
	Dim ELE_in as ListNode Ptr ' указатель на показываемый узел
	ELE_from= first_node ' начинает с первого узла
	ELE_in= first_node ' начинает с первого узла

	do while ELE_in ' проходит по всему списку, пока есть указатель на узел
		if ELE_in->id = idIN Then ' возвращает указатель на узел
			Exit Do
		end If
		ELE_in= ELE_in->next_node ' переходит к следующему узлу
	Loop
	do while ELE_from ' проходит по всему списку, пока есть указатель на узел
		if ELE_from->id = idFROM Then ' возвращает указатель на узел
			Exit Do
		end If
		ELE_from= ELE_from->next_node ' переходит к следующему узлу
	Loop
	'--------
	If ELE_from=first_node And ELE_in=Last_node Then  
		first_node=first_node->next_node
		first_node->prev_node=0
		ELE_from->prev_node=Last_node
		Last_node->next_node=ELE_from
		ELE_from->next_node=0
		last_node=ELE_from
	ElseIf ELE_from=Last_node And ELE_in=first_node Then 
		last_node=last_node->prev_node
		last_node->next_node=0
		ELE_from->next_node=first_node
		first_node->prev_node=ELE_from
		ELE_from->prev_node=0
		first_node=ELE_from
	ElseIf ELE_from=last_node Then   
		last_node=last_node->prev_node
		ELE_from->prev_node=ELE_in->prev_node
		ELE_in->prev_node->next_node=ELE_from
		ELE_from->next_node=ELE_in
		ELE_in->prev_node=ELE_from
		last_node->next_node=0
	ElseIf ELE_from=first_node Then    
		first_node=first_node->next_node
		ELE_from->next_node=ELE_in->next_node
		ELE_in->next_node->prev_node=ELE_from
		ELE_from->prev_node=ELE_in
		ELE_in->next_node=ELE_from
		first_node->prev_node=0
	ElseIf ELE_in=first_node Then 	
		ELE_from->next_node->prev_node=ELE_from->prev_node
		ELE_from->prev_node->next_node=ELE_from->next_node
		ELE_from->next_node=ELE_in
		ELE_in->prev_node=ELE_from
		ELE_from->prev_node=0
		first_node=ELE_from
	ElseIf ELE_in=Last_node Then 	
		ELE_from->next_node->prev_node=ELE_from->prev_node
		ELE_from->prev_node->next_node=ELE_from->next_node
		ELE_from->prev_node=ELE_in
		ELE_in->next_node=ELE_from
		ELE_from->next_node=0
		Last_node=ELE_from
	Else                         
		If ELE_from=ELE_in Then
			Return 1
		EndIf
		ELE_from->prev_node->next_node=ELE_from->next_node
		ELE_from->next_node->prev_node=ELE_from->prev_node
		If ELE_from<ELE_in Then
			ELE_from->next_node=ELE_in->next_node
			ELE_in->next_node->prev_node=ELE_from
			ELE_in->next_node=ELE_from
			ELE_from->prev_node=ELE_in
		Else
			ELE_in->prev_node->next_node=ELE_from
			ELE_from->prev_node=ELE_in->prev_node
			ELE_from->next_node=ELE_in
			ELE_in->prev_node=ELE_from
		EndIf
	EndIf

	Dim tem As ListNode Ptr
	Dim jj As Integer=0
	tem=first_node

	While tem
		jj=jj+1
		tem->id=jj
		tem=tem->next_node
	Wend
	Gurrent=ELE_from
END Function
' метод добавление узла в любое место списка
function List.Insert_S (ida As UInteger,valueS As String) As UInteger
	/'.....................................................................................................
	........................................ Ищем указатель для вставки........................................
	.....................................................................................................'/
	IF first_node   Then   ' если хотя бы одна запись уже есть
		Dim seek_node as ListNode Ptr ' указатель на показываемый узел
		seek_node = first_node ' начинает с первого узла
		do while seek_node ' проходит по всему списку, пока есть указатель на узел

			if seek_node->id = ida Then ' возвращает указатель на узел
				Exit Do
			end If
			seek_node = seek_node->next_node ' переходит к следующему узлу
		Loop
		DIM Predid AS ListNode Ptr
		Dim temp1 AS ListNode Ptr
		/' Если вставляемый элемент первый, тогда для этого есть своя функция.
        Отдаем ей карты в руки и выходим '/
		If first_node=seek_node Then
			AddHeadS( valueS )
			Return 1
		ElseIf seek_node=0 Then
			AddLastS(valueS)
			Return 1
		EndIf

		Predid=seek_node->prev_node  ' запоминаем адрес предыдущего
		Predid->next_node=NEW ListNode() ' создаем новый адрес относительно предыдущего
		Predid->next_node->valueS=valueS
		Predid->next_node->prev_node=Predid ' создаем связь с предыдущим
		Predid->next_node->next_node=seek_node ' создаем связь "вперед" с тем на чье место встали
		seek_node->prev_node=Predid->next_node ' создаем связь "назад"
		Gurrent=Predid->next_node
		Predid->id=Predid->id-1
		Predid->next_node->id=Predid->id+1
		temp1=Predid
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueS=valueS
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Function

function List.Insert_B (ida As UInteger,valueB As Byte) As UInteger

	/'.....................................................................................................
	........................................ Ищем указатель для вставки........................................
	.....................................................................................................'/
	IF first_node   Then   ' если хотя бы одна запись уже есть
		Dim seek_node as ListNode Ptr ' указатель на показываемый узел

		seek_node = first_node ' начинает с первого узла

		do while seek_node ' проходит по всему списку, пока есть указатель на узел

			if seek_node->id = ida Then ' возвращает указатель на узел
				Exit Do
			end If
			seek_node = seek_node->next_node ' переходит к следующему узлу
		loop

		DIM Predid AS ListNode Ptr
		Dim temp1 AS ListNode Ptr
		/' Если вставляемый элемент первый, тогда для этого есть своя функция.
        Отдаем ей карты в руки и выходим '/

		If first_node=seek_node Then
			AddHeadB( valueB )
			Return 1
		ElseIf seek_node=0 Then
			AddLastB(valueB)
			Return 1	
		EndIf

		Predid=seek_node->prev_node  ' запоминаем адрес предыдущего
		Predid->next_node=NEW ListNode() ' создаем новый адрес относительно предыдущего
		Predid->next_node->valueB=valueB
		Predid->next_node->prev_node=Predid ' создаем связь с предыдущим
		Predid->next_node->next_node=seek_node ' создаем связь "вперед" с тем на чье место встали
		seek_node->prev_node=Predid->next_node ' создаем связь "назад"
		Gurrent=Predid->next_node
		Predid->id=Predid->id-1
		Predid->next_node->id=Predid->id+1
		temp1=Predid
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueB=valueB
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Function

function List.Insert_SH (ida As UInteger,valueSh As Short) As UInteger

	/'.....................................................................................................
	........................................ Ищем указатель для вставки........................................
	.....................................................................................................'/
	IF first_node   Then   ' если хотя бы одна запись уже есть
		Dim seek_node as ListNode Ptr ' указатель на показываемый узел

		seek_node = first_node ' начинает с первого узла

		do while seek_node ' проходит по всему списку, пока есть указатель на узел

			if seek_node->id = ida Then ' возвращает указатель на узел
				Exit Do
			end If
			seek_node = seek_node->next_node ' переходит к следующему узлу
		loop

		DIM Predid AS ListNode Ptr
		Dim temp1 AS ListNode Ptr
		/' Если вставляемый элемент первый, тогда для этого есть своя функция.
        Отдаем ей карты в руки и выходим '/

		If first_node=seek_node Then
			AddHeadSh( valueSh )
			Return 1
		ElseIf seek_node=0 Then
			AddLastSh(valueSh)
			Return 1
		EndIf

		Predid=seek_node->prev_node  ' запоминаем адрес предыдущего
		Predid->next_node=NEW ListNode() ' создаем новый адрес относительно предыдущего
		Predid->next_node->valueSh=valueSh
		Predid->next_node->prev_node=Predid ' создаем связь с предыдущим
		Predid->next_node->next_node=seek_node ' создаем связь "вперед" с тем на чье место встали
		seek_node->prev_node=Predid->next_node ' создаем связь "назад"
		Gurrent=Predid->next_node
		Predid->id=Predid->id-1
		Predid->next_node->id=Predid->id+1
		temp1=Predid
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueSh=valueSh
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Function

function List.Insert_In (ida As UInteger,valueI As Integer) As UInteger

	/'.....................................................................................................
	........................................ Ищем указатель для вставки........................................
	.....................................................................................................'/
	IF first_node   Then   ' если хотя бы одна запись уже есть
		Dim seek_node as ListNode Ptr ' указатель на показываемый узел

		seek_node = first_node ' начинает с первого узла

		do while seek_node ' проходит по всему списку, пока есть указатель на узел

			if seek_node->id = ida Then ' возвращает указатель на узел
				Exit Do
			end If
			seek_node = seek_node->next_node ' переходит к следующему узлу
		loop

		DIM Predid AS ListNode Ptr
		Dim temp1 AS ListNode Ptr
		/' Если вставляемый элемент первый, тогда для этого есть своя функция.
        Отдаем ей карты в руки и выходим '/

		If first_node=seek_node Then
			AddHeadIn( valueI )
			Return 1
		ElseIf seek_node=0 Then
			AddLastIn(valueI)
			Return 1
		EndIf

		Predid=seek_node->prev_node  ' запоминаем адрес предыдущего
		Predid->next_node=NEW ListNode() ' создаем новый адрес относительно предыдущего
		Predid->next_node->valueI=valueI
		Predid->next_node->prev_node=Predid ' создаем связь с предыдущим
		Predid->next_node->next_node=seek_node ' создаем связь "вперед" с тем на чье место встали
		seek_node->prev_node=Predid->next_node ' создаем связь "назад"
		Gurrent=Predid->next_node
		Predid->id=Predid->id-1
		Predid->next_node->id=Predid->id+1
		temp1=Predid
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueI=valueI
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Function

function List.Insert_D (ida As UInteger,valueD As Double) As UInteger

	/'.....................................................................................................
	........................................ Ищем указатель для вставки........................................
	.....................................................................................................'/
	IF first_node   Then   ' если хотя бы одна запись уже есть
		Dim seek_node as ListNode Ptr ' указатель на показываемый узел

		seek_node = first_node ' начинает с первого узла

		do while seek_node ' проходит по всему списку, пока есть указатель на узел

			if seek_node->id = ida Then ' возвращает указатель на узел
				Exit Do
			end If
			seek_node = seek_node->next_node ' переходит к следующему узлу
		loop

		DIM Predid AS ListNode Ptr
		Dim temp1 AS ListNode Ptr
		/' Если вставляемый элемент первый, тогда для этого есть своя функция.
        Отдаем ей карты в руки и выходим '/

		If first_node=seek_node Then
			AddHeadD( valueD )
			Return 1
		ElseIf seek_node=0 Then
			AddLastD(valueD)
			Return 1
		EndIf

		Predid=seek_node->prev_node  ' запоминаем адрес предыдущего
		Predid->next_node=NEW ListNode() ' создаем новый адрес относительно предыдущего
		Predid->next_node->valueD=valueD
		Predid->next_node->prev_node=Predid ' создаем связь с предыдущим
		Predid->next_node->next_node=seek_node ' создаем связь "вперед" с тем на чье место встали
		seek_node->prev_node=Predid->next_node ' создаем связь "назад"
		Gurrent=Predid->next_node
		Predid->id=Predid->id-1
		Predid->next_node->id=Predid->id+1
		temp1=Predid
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueD=valueD
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Function

function List.Insert_L (ida As UInteger,valueL As LongInt) As UInteger

	/'.....................................................................................................
	........................................ Ищем указатель для вставки........................................
	.....................................................................................................'/
	IF first_node   Then   ' если хотя бы одна запись уже есть
		Dim seek_node as ListNode Ptr ' указатель на показываемый узел

		seek_node = first_node ' начинает с первого узла

		do while seek_node ' проходит по всему списку, пока есть указатель на узел

			if seek_node->id = ida Then ' возвращает указатель на узел
				Exit Do
			end If
			seek_node = seek_node->next_node ' переходит к следующему узлу
		loop

		DIM Predid AS ListNode Ptr
		Dim temp1 AS ListNode Ptr
		/' Если вставляемый элемент первый, тогда для этого есть своя функция.
        Отдаем ей карты в руки и выходим '/

		If first_node=seek_node Then
			AddHeadL( valueL )
			Return 1
		ElseIf seek_node=0 Then
			AddLastL(valueL)
			Return 1
		EndIf

		Predid=seek_node->prev_node  ' запоминаем адрес предыдущего
		Predid->next_node=NEW ListNode() ' создаем новый адрес относительно предыдущего
		Predid->next_node->valueL=valueL
		Predid->next_node->prev_node=Predid ' создаем связь с предыдущим
		Predid->next_node->next_node=seek_node ' создаем связь "вперед" с тем на чье место встали
		seek_node->prev_node=Predid->next_node ' создаем связь "назад"
		Gurrent=Predid->next_node
		Predid->id=Predid->id-1
		Predid->next_node->id=Predid->id+1
		temp1=Predid
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueL=valueL
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Function



' метод добавление узла в начало списка
SUB List.AddHeadS (valueS As String)
	DIM temp2 AS ListNode Ptr
	DIM temp1 AS ListNode Ptr
	IF first_node   Then                                ' если хотя бы одна запись уже есть
		temp1=first_node  ' запоминаем адрес первого
		temp2 = first_node->next_node     '  узнаем адрес второго элемента
		first_node = NEW ListNode()  ' делаем первым, выделяя новый элемент
		first_node->valueS=valueS  ' записываем его значение
		first_node->next_node=temp1 ' За новым первым записываем бывший первый
		first_node->next_node->prev_node=first_node
		first_node->next_node->next_node=temp2 ' а за бывшим первым записываем бывший второй
		first_node->id=0
		temp1=first_node
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueS=valueS
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Sub
SUB List.AddHeadL (valueL As LongInt)
	DIM temp2 AS ListNode Ptr
	DIM temp1 AS ListNode Ptr
	IF first_node   Then                                ' если хотя бы одна запись уже есть
		temp1=first_node  ' запоминаем адрес первого
		temp2 = first_node->next_node     '  узнаем адрес второго элемента
		first_node = NEW ListNode()  ' делаем первым, выделяя новый элемент
		first_node->valueL=valueL  ' записываем его значение
		first_node->next_node=temp1 ' За новым первым записываем бывший первый
		first_node->next_node->prev_node=first_node
		first_node->next_node->next_node=temp2 ' а за бывшим первым записываем бывший второй
		first_node->id=0
		temp1=first_node
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueL=valueL
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Sub
SUB List.AddHeadD (valueD As Double)
	DIM temp2 AS ListNode Ptr
	DIM temp1 AS ListNode Ptr
	IF first_node   Then                                ' если хотя бы одна запись уже есть
		temp1=first_node  ' запоминаем адрес первого
		temp2 = first_node->next_node     '  узнаем адрес второго элемента
		first_node = NEW ListNode()  ' делаем первым, выделяя новый элемент
		first_node->valueD=valueD  ' записываем его значение
		first_node->next_node=temp1 ' За новым первым записываем бывший первый
		first_node->next_node->prev_node=first_node
		first_node->next_node->next_node=temp2 ' а за бывшим первым записываем бывший второй
		first_node->id=0
		temp1=first_node
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueD=valueD
		first_node->id=1
		last_node=first_node
		Gurrent=last_node
	END IF
END Sub
SUB List.AddHeadIn (valueI As Integer)
	DIM temp2 AS ListNode Ptr
	DIM temp1 AS ListNode Ptr
	IF first_node   Then                                ' если хотя бы одна запись уже есть
		temp1=first_node  ' запоминаем адрес первого
		temp2 = first_node->next_node     '  узнаем адрес второго элемента
		first_node = NEW ListNode()  ' делаем первым, выделяя новый элемент
		first_node->valueI=valueI  ' записываем его значение
		first_node->next_node=temp1 ' За новым первым записываем бывший первый
		first_node->next_node->prev_node=first_node
		first_node->next_node->next_node=temp2 ' а за бывшим первым записываем бывший второй
		first_node->id=0
		temp1=first_node
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueI=valueI
		last_node=first_node
		Last_node->id=1
		Gurrent=last_node
	END IF
END Sub
SUB List.AddHeadB (valueB As Byte)
	DIM temp2 AS ListNode Ptr
	DIM temp1 AS ListNode Ptr
	IF first_node   Then                                ' если хотя бы одна запись уже есть
		temp1=first_node  ' запоминаем адрес первого
		temp2 = first_node->next_node     '  узнаем адрес второго элемента
		first_node = NEW ListNode()  ' делаем первым, выделяя новый элемент
		first_node->valueB=valueB  ' записываем его значение
		first_node->next_node=temp1 ' За новым первым записываем бывший первый
		first_node->next_node->prev_node=first_node
		first_node->next_node->next_node=temp2 ' а за бывшим первым записываем бывший второй
		first_node->id=0
		temp1=first_node
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueB=valueB
		last_node=first_node
		Last_node->id=1
		Gurrent=last_node
	END IF
END Sub
SUB List.AddHeadSH (valueSH As Short)
	DIM temp2 AS ListNode Ptr
	DIM temp1 AS ListNode Ptr
	IF first_node   Then                                ' если хотя бы одна запись уже есть
		temp1=first_node  ' запоминаем адрес первого
		temp2 = first_node->next_node     '  узнаем адрес второго элемента
		first_node = NEW ListNode()  ' делаем первым, выделяя новый элемент
		first_node->valueSh=valueSh  ' записываем его значение
		first_node->next_node=temp1 ' За новым первым записываем бывший первый
		first_node->next_node->prev_node=first_node
		first_node->next_node->next_node=temp2 ' а за бывшим первым записываем бывший второй
		first_node->id=0
		temp1=first_node
		While temp1
			temp1->id=temp1->id+1
			temp1=temp1->next_node
		Wend
	ELSE                                      ' иначе
		first_node = NEW  ListNode()              ' создаём первую
		first_node->valueSh=valueSh
		last_node=first_node
		Last_node->id=1
		Gurrent=last_node
	END IF
END Sub
' метод добавление узла в конец списка
function List.AddLastS( valueS  as string ) as UInteger


	dim new_node as ListNode Ptr ' указатель на новый узел


	new_node = new ListNode() ' создаёт объект узла

	new_node->valueS = valueS ' задаёт значение

	if this.first_node = 0 then     ' если в списке нет первого узла, то делает новый узел первым
		new_node->id = 1
		this.first_node = new_node
	else                                     ' если в списке есть первый узел, то подключает новый к последнему
		new_node->id = this.last_node->id + 1
		this.last_node->next_node = new_node
		new_node->prev_node = this.last_node
	end if


	this.last_node = new_node ' делает новый узел последним
	Gurrent=this.last_node

	return new_node->id ' возвращает идентификатор нового узла

end Function

function List.AddLastB( valueB  as Byte ) as uinteger


	dim new_node as ListNode Ptr ' указатель на новый узел


	new_node = new ListNode() ' создаёт объект узла

	new_node->valueB = valueB ' задаёт значение

	if this.first_node = 0 then     ' если в списке нет первого узла, то делает новый узел первым
		new_node->id = 1
		this.first_node = new_node
	else                                     ' если в списке есть первый узел, то подключает новый к последнему
		new_node->id = this.last_node->id + 1
		this.last_node->next_node = new_node
		new_node->prev_node = this.last_node
	end if


	this.last_node = new_node ' делает новый узел последним
	Gurrent=this.last_node

	return new_node->id ' возвращает идентификатор нового узла

end Function
function List.AddLastSH( valueSH  as short ) as uinteger


	dim new_node as ListNode Ptr ' указатель на новый узел


	new_node = new ListNode() ' создаёт объект узла

	new_node->valueSH = valueSH ' задаёт значение

	if this.first_node = 0 then     ' если в списке нет первого узла, то делает новый узел первым
		new_node->id = 1
		this.first_node = new_node
	else                                     ' если в списке есть первый узел, то подключает новый к последнему
		new_node->id = this.last_node->id + 1
		this.last_node->next_node = new_node
		new_node->prev_node = this.last_node
	end if


	this.last_node = new_node ' делает новый узел последним
	Gurrent=this.last_node

	return new_node->id ' возвращает идентификатор нового узла

end Function

' метод добавление узла в конец списка
function List.AddLastL( valueL  as LongInt) as uinteger


	dim new_node as ListNode Ptr ' указатель на новый узел


	new_node = new ListNode() ' создаёт объект узла


	new_node->valueL = valueL ' задаёт значение

	if this.first_node = 0 then     ' если в списке нет первого узла, то делает новый узел первым
		new_node->id = 1
		this.first_node = new_node
	else                                     ' если в списке есть первый узел, то подключает новый к последнему
		new_node->id = this.last_node->id + 1
		this.last_node->next_node = new_node
		new_node->prev_node = this.last_node
	end if


	this.last_node = new_node ' делает новый узел последним
	Gurrent=this.last_node

	return new_node->id ' возвращает идентификатор нового узла

end Function

' метод добавление узла в конец списка
function List.AddLastIn( valueI  as Integer ) as uinteger


	dim new_node as ListNode Ptr ' указатель на новый узел


	new_node = new ListNode() ' создаёт объект узла


	new_node->valueI = valueI ' задаёт значение

	if this.first_node = 0 then     ' если в списке нет первого узла, то делает новый узел первым
		new_node->id = 1
		this.first_node = new_node
	else                                     ' если в списке есть первый узел, то подключает новый к последнему
		new_node->id = this.last_node->id + 1
		this.last_node->next_node = new_node
		new_node->prev_node = this.last_node
	end if


	this.last_node = new_node ' делает новый узел последним

	Gurrent=this.last_node
	return new_node->id ' возвращает идентификатор нового узла

end Function
' метод добавление узла в конец списка
function List.AddLastD( valueD  as Double ) as uinteger


	dim new_node as ListNode Ptr ' указатель на новый узел


	new_node = new ListNode() ' создаёт объект узла


	new_node->valueD = valueD ' задаёт значение

	if this.first_node = 0 then     ' если в списке нет первого узла, то делает новый узел первым
		new_node->id = 1
		this.first_node = new_node
	else                                     ' если в списке есть первый узел, то подключает новый к последнему
		new_node->id = this.last_node->id + 1
		this.last_node->next_node = new_node
		new_node->prev_node = this.last_node
	end if


	this.last_node = new_node ' делает новый узел последним

	Gurrent=this.last_node
	return new_node->id ' возвращает идентификатор нового узла

end Function

' удаляет узел по индексу
sub List.Remove( ida as uinteger )
	If ida <>1 Then
		Gurrent=this.FindByID( ida-1 )
	Else
		Gurrent=this.FindByID( ida+1  )
	EndIf
	dim del_node as ListNode Ptr ' указатель на удаляемый узел
	del_node = this.FindByID( ida ) ' ищет удаляемый узел

	if del_node = 0 Then ' выходит, если узел не найден
		exit sub
	end If

	if this.first_node = del_node Then ' если удаляется первый узел
		this.first_node = del_node->next_node
	Else
		del_node->prev_node->next_node = del_node->next_node
	end if

	if this.last_node = del_node Then ' если удаляется последний узел
		this.last_node = del_node->prev_node
	Else
		del_node->next_node->prev_node = del_node->prev_node
	end if

	delete del_node ' разрушает объект узла
	Dim tem As ListNode Ptr
	Dim jj As Integer=0
	tem=first_node

	While tem
		jj=jj+1
		tem->id=jj
		tem=tem->next_node
	Wend
end Sub
function List.PRED( ) as ListNode Ptr

	Gurrent=Gurrent->prev_node
	Return Gurrent
End Function

function List.First( ) as ListNode Ptr

	Gurrent=first_node
	Return Gurrent
End Function

function List.Last( ) as ListNode Ptr

	Gurrent=last_node
	Return Gurrent
End Function

function List.GURR( ) as ListNode Ptr

	Gurrent=Gurrent->next_node
	Return Gurrent
End Function
function List.GURR1( ) as ListNode Ptr
	Return Gurrent
End Function

' ищет узел по индексу
function List.FindByID( id as uinteger ) as ListNode ptr

	dim seek_node as ListNode Ptr ' указатель на показываемый узел

	seek_node = this.first_node ' начинает с первого узла

	do while seek_node ' проходит по всему списку, пока есть указатель на узел

		if seek_node->id = id Then ' возвращает указатель на узел
			Gurrent=seek_node
			return seek_node
		end if


		seek_node = seek_node->next_node ' переходит к следующему узлу
	loop

	return 0 ' возвращает 0, если узел не найден

end Function


FUNCTION List.GetCount (lis As List Ptr) As Integer
	Var ggg=SelectElement(lis,1)
	If ggg=0 Then
		ggg=SelectElement(lis,2)
		If ggg=0 Then Return 0
	EndIf
	DIM temp  AS ListNode PTR = ggg' создаём временный объект и делаем его первым в списке
	DIM count AS INTEGER    = 0  ' создаём счётчик записей
	WHILE temp                          ' пока записи не закончились
		count = count + 1              ' учитываем текущую
		temp = temp->next_node          ' переходим на следующую
	WEND
	RETURN count
END Function

' ---------------------------------------------Перемещение в любое место--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Sub MoveElement(ByVal lis As List Ptr,ByVal from_ As UInteger, byval in_ As UInteger) Export
	lis->Move(in_, from_ )
End Sub
' ---------------------------------------------Вставка в любое место--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Sub InsertElement_S(ByVal lis As List Ptr,ByVal item As UInteger, byval  znach As String) Export
	lis->Insert_S(item, znach )
End Sub
Sub InsertElement_SH(ByVal lis As List Ptr,ByVal item As UInteger, byval  znach As Short) Export
	lis->Insert_SH(item, znach )
End Sub
Sub InsertElement_B(ByVal lis As List Ptr,ByVal item As UInteger, byval  znach As Byte) Export
	lis->Insert_B(item, znach )
End Sub
Sub InsertElement_D(ByVal lis As List Ptr,ByVal item As UInteger, byval  znach As Double)Export
	lis->Insert_D(item, znach )
End Sub
Sub InsertElement_L(ByVal lis As List Ptr,ByVal item As UInteger, byval  znach As LongInt)Export
	lis->Insert_L(item, znach )
End Sub
Sub InsertElement_In(ByVal lis As List Ptr,ByVal item As UInteger, byval  znach As Integer)Export
	lis->Insert_In(item, znach )
End Sub
' ---------------------------------------Добавление элемента в начало--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Sub AddElementHead_SH(ByVal lis As List Ptr,ByVal  znach As Short)Export
	lis->AddHeadSH( znach )
End Sub
Sub AddElementHead_B(ByVal lis As List Ptr,ByVal  znach As Byte)Export
	lis->AddHeadB( znach )
End Sub
Sub AddElementHead_S(ByVal lis As List Ptr,ByVal  znach As String)Export
	lis->AddHeadS( znach )
End Sub
Sub AddElementHead_L(ByVal lis As List Ptr,ByVal  znach As LongInt)Export
	lis->AddHeadL( znach )
End Sub
Sub AddElementHead_D(ByVal lis As List Ptr,ByVal  znach As Double)Export
	lis->AddHeadD( znach )
End Sub
Sub AddElementHead_In(ByVal lis As List Ptr,ByVal  znach As Integer)Export
	lis->AddHeadIn( znach )
End Sub
' --------------------------------------Добавление элемента в конец--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Sub AddElement_S(ByVal lis As List Ptr,ByVal  znach As String)Export
	lis->AddLastS( znach )
End Sub
Sub AddElement_L(ByVal lis As List Ptr,ByVal  znach As LongInt)Export
	lis->AddLastL( znach )
End Sub
Sub AddElement_In(ByVal lis As List Ptr,ByVal  znach As integer)Export
	lis->AddLastIn( znach )
End Sub
Sub AddElement_D(ByVal lis As List Ptr,ByVal  znach As Double)Export
	lis->AddLastD( znach )
End Sub
Sub AddElement_B(ByVal lis As List Ptr,ByVal  znach As Byte)Export
	lis->AddLastB( znach )
End Sub
Sub AddElement_Sh(ByVal lis As List Ptr,ByVal  znach As Short)Export
	lis->AddLastSH( znach )
End Sub
'--------------------------------------Создание нового листа--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Function NewList() As List Ptr Export
	Return New List()
End Function
' --------------------------------------Удаление листа--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Sub DeleteList(ByVal lis As List Ptr )Export
	Delete Lis
End Sub
' --------------------------------------Очистка листа--------------------------------------------
'---------------------------------------------------------------------------------------------------------------

Sub ClearList(ByVal lis As List Ptr )Export
	lis->Clear
End Sub
' --------------------------------------Размер листа--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Function SizeList(ByVal lis As List Ptr ) As Integer Export
	DIM alls AS List
	Return alls.GetCount(lis)
End Function
'--------------------------------------Удаление элемента--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
sub DeleteElement(ByVal lis As List Ptr,ByVal  element As integer)Export
	lis->Remove( element )
End Sub
'--------------------------------------Установка указателя по номеру элемента--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Function SelectElement(ByVal lis As List Ptr,ByVal  element As integer) as ListNode Ptr Export
	Return lis->FindByID( element)
End Function
' --------------------------------------Указатель на предыдущий элемент--------------------------------------------
'---------------------------------------------------------------------------------------------------------------

Function PrevElement(ByVal lis As List Ptr ) As Integer Export
	Return Cast(Integer,lis-> PRED( ))
End Function
' --------------------------------------Указатель на следующий элемент--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Function NextElement(ByVal lis As List Ptr ) As Integer Export
	Return Cast(Integer,lis-> GURR( ))
End Function
' --------------------------------------Указатель на первый элемент --------------------------------------------
'---------------------------------------------------------------------------------------------------------------

Function FirstElement(ByVal lis As List Ptr ) As Integer Export
	Return Cast(Integer,lis-> First( ))
End Function
' --------------------------------------Указатель на последний элемент --------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Function LastElement(ByVal lis As List Ptr ) As Integer Export
	Return Cast(Integer,lis-> Last( ))
End Function
'--------------------------------------Получение значения по номеру элемента--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Function GetValueElement_S(ByVal lis As List Ptr,ByVal  element As integer) as String Export
	Return lis->FindByID( element)->VALUES
End Function
Function GetValueElement_In(ByVal lis As List Ptr,ByVal  element As integer) as Integer Export
	Return lis->FindByID( element)->VALUEI
End Function
Function GetValueElement_L(ByVal lis As List Ptr,ByVal  element As integer) as LongInt Export
	Return lis->FindByID( element)->VALUEL
End Function
Function GetValueElement_D(ByVal lis As List Ptr,ByVal  element As integer) As Double Export
	Return lis->FindByID( element)->VALUED
End Function
Function GetValueElement_B(ByVal lis As List Ptr,ByVal  element As integer) as Byte Export
	Return lis->FindByID( element)->VALUEB
End Function
Function GetValueElement_SH(ByVal lis As List Ptr,ByVal  element As integer) As Short Export
	Return lis->FindByID( element)->VALUESH
End Function
' --------------------------------------Установка значения по номеру элемента--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Sub SetValueElement_D(ByVal lis As List Ptr ,ByVal element As Integer,ByVal znachenie As Double )Export
	Lis->FindByID(element)->VALUED=znachenie
End Sub
Sub SetValueElement_S(ByVal lis As List Ptr ,ByVal element As Integer,ByVal znachenie As String)Export
	Lis->FindByID(element)->VALUES=znachenie
End Sub
Sub SetValueElement_L(ByVal lis As List Ptr ,ByVal element As Integer,ByVal znachenie As LongInt)Export
	Lis->FindByID(element)->VALUEL=znachenie
End Sub
Sub SetValueElement_In(ByVal lis As List Ptr ,ByVal element As Integer,ByVal znachenie As Integer )Export
	Lis->FindByID(element)->VALUEI=znachenie
End Sub
Sub SetValueElement_B(ByVal lis As List Ptr ,ByVal element As Integer,ByVal znachenie As Byte)Export
	Lis->FindByID(element)->VALUEB=znachenie
End Sub
Sub SetValueElement_SH(ByVal lis As List Ptr ,ByVal element As Integer,ByVal znachenie As Short )Export
	Lis->FindByID(element)->VALUESH=znachenie
End Sub
' --------------------------------------Получение значения по текущему номеру--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Function GetList_S(ByVal lis As List Ptr  ) As string Export
	Return lis-> GURR1( )->VALUES
End Function
Function GetList_In(ByVal lis As List Ptr  ) As integer Export
	Return lis-> GURR1( )->VALUEI
End Function
Function GetList_L(ByVal lis As List Ptr  ) As longint Export
	Return lis-> GURR1( )->VALUEL
End Function
Function GetList_D(ByVal lis As List Ptr  ) As Double Export
	Return lis-> GURR1( )->VALUED
End Function
Function GetList_B(ByVal lis As List Ptr  ) As Byte Export
	Return lis-> GURR1( )->VALUEB
End Function
Function GetList_SH(ByVal lis As List Ptr  ) As Short Export
	Return lis-> GURR1( )->VALUESH
End Function
' --------------------------------------Установка значения по текущему номеру--------------------------------------------
'---------------------------------------------------------------------------------------------------------------
Sub SetList_S(ByVal lis As List Ptr, ByVal znachenie As String )Export
	lis-> GURR1( )->VALUES=znachenie
End Sub
Sub SetList_D(ByVal lis As List Ptr, ByVal znachenie As Double )Export
	lis-> GURR1( )->VALUED=znachenie
End Sub
Sub SetList_L(ByVal lis As List Ptr, ByVal znachenie As LongInt )Export
	lis-> GURR1( )->VALUEL=znachenie
End Sub
Sub SetList_In(ByVal lis As List Ptr, ByVal znachenie As Integer )Export
	lis-> GURR1( )->VALUEI=znachenie
End Sub
Sub SetList_B(ByVal lis As List Ptr, ByVal znachenie As Byte )Export
	lis-> GURR1( )->VALUEB=znachenie
End Sub
Sub SetList_SH(ByVal lis As List Ptr, ByVal znachenie As Short )Export
	lis-> GURR1( )->VALUESH=znachenie
End Sub


