Для одной программы понадобилось создать наподобие ограниченного буфера обмена.
Что в сущности было нужно:
1) Чтобы буфер обмена содержал не более 10 элементов
2) Чтобы новый новый добавляемый элемент всегда был последним
2) Чтобы когда буфер переполнялся, первый элемент удалялся
Думаю, что в данном случае самый подходящий алгоритм - это очереди.
Вот пример реализации:
Код
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
' Очередь из 10 элементов
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
' класс queue
Type queue
v As Integer ' значение
pNext As queue Ptr ' указатель на следующий элемент
Declare Sub AddQueue( v As Integer) ' метод добавления
Declare Sub DelQueue() ' метод полного удаления
Declare Sub PrintQueue() ' вывод на консоль всех элементов
End Type
Dim Shared As queue Ptr pFirst, pEnd ' указатели на начало и конец очереди
Dim Shared As Integer iIndex ' кол-во элементов в очереди
' метод добавления элемента в очередь
Sub queue.AddQueue( v As Integer)
Dim pTemp As queue Ptr = New queue ' создаем новый элемент очереди
pTemp->v = v ' присваиваем значение
If iIndex<10 Then ' если очередь содержит меньше 10 элементов
If iIndex = 0 Then ' если в очереди еще нет элементов
pFirst = pTemp ' данный элемент становится первым в очереди
pEnd = pTemp ' так же данный элемент является последним в очереди
pEnd->pNext = 0 ' указатель на следующий элемент обнуляем
Else
pEnd->pNext = pTemp ' данный элемент ставим в очередь после последнего элемента
pEnd = pTemp ' теперь этот элемент стал последним
pTemp->pNext = 0 ' указатель на следующий элемент обнуляем
EndIf
iIndex+=1 ' увеличиваем счетчик элементов
Else
Dim As queue Ptr pDel = pFirst ' запоминаем первый указатель для удаления
pFirst = pFirst->pNext ' теперь второй элемент станет первым в очереди
Delete pDel : pDel = 0 ' удаляем запомненный элемент и обнуляем
pEnd->pNext = pTemp ' данный элемент ставим в очередь после последнего элемента
pEnd = pTemp ' теперь этот элемент стал последним
pTemp->pNext = 0 ' указатель на следующий элемент обнуляем
EndIf
End Sub
' метод удалениея всех элементов из очереди
Sub queue.DelQueue()
' временные указатели на элементы очереди,
' одному из них присваиваем первый элемент очереди
Dim As queue Ptr pDel, pTemp = pFirst
While pTemp <> 0 ' пока указатель на элемент очереди существует
pDel = pTemp ' присваиваем указатель на удаление
pTemp = pTemp->pNext ' присваиваем указатель на следующий элемент
Delete pDel ' удаляем элемент
Wend
End Sub
' метод вывода на консоль всех элементов очереди
Sub queue.PrintQueue()
' временный указатель на элемент очереди,
' присваиваем ему указатель на первый элемент
Dim As queue Ptr pTemp = pFirst
While pTemp <> 0 ' пока указатель на элемент очереди существует
Print pTemp->v & " "; ' выводим значение элемента очереди на консоль
pTemp = pTemp->pNext ' присваиваем указатель на следующий элемент
Wend
Print
End Sub
'\\\\\\\\\\\\\\\\\\\\\\\\
' Тест работы класса
'\\\\\\\\\\\\\\\\\\\\\\\\
Dim pInitQueue As queue Ptr = New queue ' инициализируем класс
' Цикл на 20 итераций (в очередь поступит 20 значений)
For i As Integer = 1 To 20
pInitQueue->AddQueue(i) ' добавляем элемент
pInitQueue->PrintQueue() ' печатаем все элементы очереди
Print ' пустая строка (разделитель)
Print "Press any key!!!"
sleep
Next
pInitQueue->DelQueue() ' удаляем все элементы
Delete pInitQueue ' удаляем указатель инициализации класса
Print "End program, press any key"
Sleep