Это похоже на то, как мы делали вещи в моем классе Data Structures, используя FORTRAN 77 (еще в середине мела); мы выделили массив фиксированного размера и использовали его в качестве пула памяти.
По сути, вы должны поддерживать «свободный» список; это узлы, которые доступны для использования. При первом запуске вы инициализируете каждый элемент в вашем массиве, чтобы явно указать следующий элемент:
struct node {T data; struct node *next; } pool[N]; // for some type T
...
for (i = 0; i < N-1; i++)
pool[i].next = &pool[i+1];
pool[i].next = NULL;
Ваш свободный список изначально указывает на первый элемент в пуле:
struct node *free = &pool[0];
Когда вы выделяете узел, вы получаете элемент, на который указывает free
, обновляете free
, чтобы он указывал на следующий доступный элемент в списке (если он существует), затем инициализируете элемент по мере необходимости:
if (free) // is there a free node available
{
struct node *newNode = free;
free = free->next;
newNode->data = ...;
newNode->next = NULL;
...
}
Когда вы закончите работу с узлом, вы добавляете его обратно в начало списка free
:
node->next = free;
free = node;
Естественно, реальный код был бы лучше организован, чем этот, но этого должно быть достаточно, чтобы дать вам представление о том, что делать.